CVE-2026-100174: Stored Cross-Site Scripting (XSS) in AIL Framework Tag Selector via Unescaped Tag Names
The AIL Framework tag selector component (var/www/static/js/tags.js) is vulnerable to stored cross-site scripting (XSS). A user with the ability to create a custom tag could embed an HTML payload containing JavaScript event handlers (e.g., <img src=x onerror=alert(1)> or <svg onload=...>) in the tag name. When another authenticated user opened a page containing the tag selector, the malicious tag name was inserted into the DOM using jQuery's html property, causing the embedded script to execute in the victim's browser context.
The vulnerable code paths affected both the suggestion/combo-item rendering (renderComboItems) and the selected-tag rendering logic. In both cases, the display value derived from the tag's displayField was passed directly to the html property of a jQuery element constructor, which parses and inserts the string as raw HTML rather than as text.
Preconditions: the attacker must have an authenticated account with permission to create custom tags, and the victim must be an authenticated user who views a page that renders the tag selector with the attacker's stored tag. The attack is stored (persistent) and does not require the victim to perform any action beyond loading the page.
Security impact: successful exploitation allows arbitrary JavaScript execution in the victim's browser within the application's origin, potentially leading to session hijacking, unauthorized data access, form manipulation, or further client-side attacks.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Compensating control
In var/www/static/js/tags.js, render tag names and display values as plain text rather than raw HTML when no custom renderer is configured: use document.createTextNode() for selected-tag rendering and jQuery's .text() method for the default suggestion/combo-item rendering.
- Compensating control
Replace the eval() call in the tag selector with JSON.parse() to eliminate the code-injection vector.
Event History
Frequently Asked Questions
Who can exploit this issue, and who is exposed to the payload?
An attacker needs an authenticated account with permission to create custom tags. Authenticated users are exposed when they open a page that renders the tag selector containing the attacker’s stored tag.
Does exploitation require the victim to click or otherwise interact with the malicious tag?
No. The payload executes when the victim opens a page that renders the affected tag selector; no additional victim action is required.
Are both tag suggestions and already selected tags affected?
Yes. The vulnerable rendering occurs in both the suggestion/combo-item path (_renderComboItems) and the selected-tag rendering logic, where the tag display value is inserted as raw HTML.