Search

Find a vulnerability

Search criteria ⓘ Use this form to refine search results.
Full-text search supports keyword queries with ranking and filtering.
You can combine vendor, product, and sources to narrow results.
Enable “Apply ordering” to sort by date instead of relevance.

    24 vulnerabilities by ail project

    CVE-2026-100190 (GCVE-0-2026-100190)

    Vulnerability from nvd – Published: 2026-09-25 13:52 – Updated: 2026-09-25 16:13
    VLAI
    Title
    Stored Cross-Site Scripting (XSS) via Crawler Capture Import in AIL Framework showDomain Page
    Summary
    The AIL Framework crawler splash domain page (showDomain.html) is vulnerable to stored cross-site script injection (XSS). User-supplied data originating from imported crawler captures—specifically item IDs, URLs, and screenshot file paths—was interpolated directly into inline JavaScript contexts within the HTML template. This included an onclick attribute that embedded raw screenshot and URL values into a JavaScript function call, and an inline script block that assigned a screenshot value to a JavaScript variable without escaping. An attacker with a user-role API client could craft a malicious crawler capture import containing JavaScript payloads in these fields. When any user (including privileged users) subsequently viewed the affected domain page, the injected script would execute in the victim's browser context, potentially allowing session hijacking, data exfiltration, or unauthorized actions on behalf of the victim. The vulnerability is stored in the application's data layer and triggered upon page rendering, requiring no further interaction beyond loading the domain view.
    SSVC
    Exploitation: none Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-09-25 16:13 UTC
    CWE
    • CWE-79 - Improper Neutralization of Input in Web Page ('Cross-site Scripting')
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: unspecified , < 7.1 (semver)
    Create a notification for this product.
    GCVE extensions
    AI involvement GCVE-BCP-05-X-01
    Whole record AI-generated Human-reviewed GNA-1

    Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model.

    ai-computer-assisted:llm-generatedai-computer-assisted:classification
    Model Source Identifier
    qwen3.8:27b ollama qwen3.8:27b
    Patch provenance GCVE-BCP-05-X-02
    Generator
    patch2vuln.py on 2026-09-25 13:45
    Model
    qwen3.8:27b
    Input
    https://github.com/ail-project/ail-framework/commit/31376ee3d04519c898bb9b3671453a41c4117340.patch c110d16dd8ee…
    Confidence
    medium
    Commit Subject Patch SHA-256
    31376ee3d045 chg: [security] prevent stored XSS through imported capture c110d16dd8ee…
    Fix summary

    The fix removes all capture-derived values (item IDs, URLs, screenshot paths) from inline JavaScript contexts (onclick attributes and inline script variable assignments). These values are now stored in HTML data attributes (data-screenshot, data-url, data-item-id), which are properly HTML-escaped by the Jinja2 template engine. Screenshot click handlers are bound programmatically via addEventListener on elements with a .reload-image class, and the reload_image function reads values from the DOM element's dataset rather than receiving raw string parameters. Additionally, item IDs are URL-encoded with encodeURIComponent before being appended to link hrefs, preventing injection through the ID field.

    Patch summary

    In showDomain.html: (1) Replaced inline onclick="reload_image('...')" with a data-attribute-based approach using data-screenshot, data-url, and data-item-id attributes on the table cell element, plus a .reload-image CSS class. (2) Removed the inline script block that assigned screenshot, URL, and ID values directly into JavaScript variables via Jinja2 interpolation; replaced with dataset reads from the domain_screenshot img element. (3) Changed reload_image() to accept a DOM element and read values from element.dataset instead of raw string arguments. (4) Added a programmatic event binding loop using document.querySelectorAll('.reload-image').forEach() with addEventListener('click'). (5) Applied encodeURIComponent() to item IDs when constructing screenshot link hrefs. (6) Changed the href URL construction to use url_for with keyword arguments instead of string interpolation.

    CVSS rationale

    AV:N: Exploitable over the network via the web application. AC:L: No special race conditions or complex setup; a crafted capture import suffices. AT:N: No manipulation of the attack target required. PR:L: Requires a user-role API client to import a malicious crawler capture (authenticated, low privilege). UI:P: The stored XSS in the inline script block executes passively when the victim loads the domain page; no click or active interaction is needed for the inline script vector. VC:N/VI:N/VA:N: The vulnerable component (server-side application) is not directly compromised in confidentiality, integrity, or availability. SC:H: Scope changes to the victim's browser session, enabling theft of session tokens, cookies, and sensitive data. SI:H: Scope integrity is impacted as the attacker can perform arbitrary actions in the victim's authenticated session. SA:N: No meaningful impact on the availability of the attacker's scope.

    Weakness rationale
    • CWE-79 The patch explicitly addresses stored XSS by removing user-controlled values (screenshot paths, URLs, item IDs from crawler capture imports) from inline JavaScript contexts and replacing them with properly escaped data attributes and programmatic event binding. The commit message confirms the intent: 'prevent stored XSS through imported capture metadata in showDomain.'
    Attack pattern rationale
    • CAPEC-1 The patch directly remediates a stored XSS vector where attacker-controlled data from a crawler capture import is reflected into inline JavaScript without neutralization. CAPEC-1 is the canonical attack pattern for XSS. The specific sub-variant is stored (persistent) XSS via a data import mechanism, but CAPEC-1 is the closest and most appropriate mapping available in the CAPEC catalog.
    Assumptions to verify
    • The UI:P (Passive) rating assumes the inline script vector (screenshot variable assignment) executes on page load without requiring a user click. The onclick vector would require UI:A, but the inline script vector is sufficient for exploitation.
    • PR:L assumes the attacker needs a user-role API client to import a crafted crawler capture, as stated in the commit message. The exact privilege level and authentication mechanism are not further specified in the patch.
    • The version boundary 'less_than 7.1' is inferred from the tag_version_boundary metadata showing 21 commits after the fix before the v7.1 tag, suggesting the fix is included in v7.1. Exact affected version ranges are not confirmed.
    • CAPEC-1 is selected as the closest available attack pattern for stored XSS; no more specific CAPEC for stored XSS via data import exists in the catalog.
    • The patch does not include test cases or additional context about whether other template files have similar inline JavaScript interpolation patterns; this advisory covers only the single file in the patch.
    Model comparison

    Selected qwen3.8:27b by deterministic-consensus-v1
    The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required.

    Model Score Agreement Confidence Assumptions
    qwen3.8:27b 5 9 medium 5
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-100190",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-09-25T16:13:08.012327Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-09-25T16:13:26.973Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "defaultStatus": "unaffected",
              "modules": [
                "crawler/crawler_splash"
              ],
              "product": "ail framework",
              "programFiles": [
                "var/www/templates/crawler/crawler_splash/showDomain.html"
              ],
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThan": "7.1",
                  "status": "affected",
                  "version": "unspecified",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Aurelien Thirion"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Jeroen Pinoy"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe AIL Framework crawler splash domain page (showDomain.html) is vulnerable to stored cross-site script injection (XSS). User-supplied data originating from imported crawler captures\u2014specifically item IDs, URLs, and screenshot file paths\u2014was interpolated directly into inline JavaScript contexts within the HTML template. This included an onclick attribute that embedded raw screenshot and URL values into a JavaScript function call, and an inline script block that assigned a screenshot value to a JavaScript variable without escaping. An attacker with a user-role API client could craft a malicious crawler capture import containing JavaScript payloads in these fields. When any user (including privileged users) subsequently viewed the affected domain page, the injected script would execute in the victim\u0027s browser context, potentially allowing session hijacking, data exfiltration, or unauthorized actions on behalf of the victim. The vulnerability is stored in the application\u0027s data layer and triggered upon page rendering, requiring no further interaction beyond loading the domain view.\u003c/p\u003e"
                }
              ],
              "value": "The AIL Framework crawler splash domain page (showDomain.html) is vulnerable to stored cross-site script injection (XSS). User-supplied data originating from imported crawler captures\u2014specifically item IDs, URLs, and screenshot file paths\u2014was interpolated directly into inline JavaScript contexts within the HTML template. This included an onclick attribute that embedded raw screenshot and URL values into a JavaScript function call, and an inline script block that assigned a screenshot value to a JavaScript variable without escaping. An attacker with a user-role API client could craft a malicious crawler capture import containing JavaScript payloads in these fields. When any user (including privileged users) subsequently viewed the affected domain page, the injected script would execute in the victim\u0027s browser context, potentially allowing session hijacking, data exfiltration, or unauthorized actions on behalf of the victim. The vulnerability is stored in the application\u0027s data layer and triggered upon page rendering, requiring no further interaction beyond loading the domain view."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-1",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-1 Cross Site Scripting (XSS)"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 6.3,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "LOW",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "HIGH",
                "subIntegrityImpact": "HIGH",
                "userInteraction": "PASSIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:N/VI:N/VA:N/SC:H/SI:H/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-79",
                  "description": "CWE-79 Improper Neutralization of Input in Web Page (\u0027Cross-site Scripting\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-09-25T13:52:19.648Z",
            "orgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
            "shortName": "CIRCL"
          },
          "references": [
            {
              "name": "Security patch",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/31376ee3d04519c898bb9b3671453a41c4117340"
            }
          ],
          "solutions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe fix removes all capture-derived values (item IDs, URLs, screenshot paths) from inline JavaScript contexts (onclick attributes and inline script variable assignments). These values are now stored in HTML data attributes (data-screenshot, data-url, data-item-id), which are properly HTML-escaped by the Jinja2 template engine. Screenshot click handlers are bound programmatically via addEventListener on elements with a .reload-image class, and the reload_image function reads values from the DOM element\u0027s dataset rather than receiving raw string parameters. Additionally, item IDs are URL-encoded with encodeURIComponent before being appended to link hrefs, preventing injection through the ID field.\u003c/p\u003e"
                }
              ],
              "value": "The fix removes all capture-derived values (item IDs, URLs, screenshot paths) from inline JavaScript contexts (onclick attributes and inline script variable assignments). These values are now stored in HTML data attributes (data-screenshot, data-url, data-item-id), which are properly HTML-escaped by the Jinja2 template engine. Screenshot click handlers are bound programmatically via addEventListener on elements with a .reload-image class, and the reload_image function reads values from the DOM element\u0027s dataset rather than receiving raw string parameters. Additionally, item IDs are URL-encoded with encodeURIComponent before being appended to link hrefs, preventing injection through the ID field."
            }
          ],
          "source": {
            "discovery": "UNKNOWN"
          },
          "title": "Stored Cross-Site Scripting (XSS) via Crawler Capture Import in AIL Framework showDomain Page",
          "x_gcve": [
            {
              "extensions": {
                "bcp-05-x-01": {
                  "ai_annotations": [
                    {
                      "ai_level": "generated",
                      "description": "Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model.",
                      "gna_source": 1,
                      "models": [
                        {
                          "gna_source": 1,
                          "identifier": "qwen3.8:27b",
                          "name": "qwen3.8:27b",
                          "source": "ollama"
                        }
                      ],
                      "review_status": "full",
                      "scope": "record",
                      "tags": [
                        "ai-computer-assisted:llm-generated",
                        "ai-computer-assisted:classification"
                      ]
                    }
                  ]
                },
                "bcp-05-x-02": {
                  "x_patch2vuln": {
                    "assumptions": [
                      "The UI:P (Passive) rating assumes the inline script vector (screenshot variable assignment) executes on page load without requiring a user click. The onclick vector would require UI:A, but the inline script vector is sufficient for exploitation.",
                      "PR:L assumes the attacker needs a user-role API client to import a crafted crawler capture, as stated in the commit message. The exact privilege level and authentication mechanism are not further specified in the patch.",
                      "The version boundary \u0027less_than 7.1\u0027 is inferred from the tag_version_boundary metadata showing 21 commits after the fix before the v7.1 tag, suggesting the fix is included in v7.1. Exact affected version ranges are not confirmed.",
                      "CAPEC-1 is selected as the closest available attack pattern for stored XSS; no more specific CAPEC for stored XSS via data import exists in the catalog.",
                      "The patch does not include test cases or additional context about whether other template files have similar inline JavaScript interpolation patterns; this advisory covers only the single file in the patch."
                    ],
                    "capecRationale": [
                      {
                        "capecId": "CAPEC-1",
                        "rationale": "The patch directly remediates a stored XSS vector where attacker-controlled data from a crawler capture import is reflected into inline JavaScript without neutralization. CAPEC-1 is the canonical attack pattern for XSS. The specific sub-variant is stored (persistent) XSS via a data import mechanism, but CAPEC-1 is the closest and most appropriate mapping available in the CAPEC catalog."
                      }
                    ],
                    "commit": "31376ee3d04519c898bb9b3671453a41c4117340",
                    "confidence": "medium",
                    "credits": [
                      {
                        "lang": "en",
                        "type": "remediation developer",
                        "value": "terrtia"
                      }
                    ],
                    "cvssRationale": "AV:N: Exploitable over the network via the web application. AC:L: No special race conditions or complex setup; a crafted capture import suffices. AT:N: No manipulation of the attack target required. PR:L: Requires a user-role API client to import a malicious crawler capture (authenticated, low privilege). UI:P: The stored XSS in the inline script block executes passively when the victim loads the domain page; no click or active interaction is needed for the inline script vector. VC:N/VI:N/VA:N: The vulnerable component (server-side application) is not directly compromised in confidentiality, integrity, or availability. SC:H: Scope changes to the victim\u0027s browser session, enabling theft of session tokens, cookies, and sensitive data. SI:H: Scope integrity is impacted as the attacker can perform arbitrary actions in the victim\u0027s authenticated session. SA:N: No meaningful impact on the availability of the attacker\u0027s scope.",
                    "fixSummary": "The fix removes all capture-derived values (item IDs, URLs, screenshot paths) from inline JavaScript contexts (onclick attributes and inline script variable assignments). These values are now stored in HTML data attributes (data-screenshot, data-url, data-item-id), which are properly HTML-escaped by the Jinja2 template engine. Screenshot click handlers are bound programmatically via addEventListener on elements with a .reload-image class, and the reload_image function reads values from the DOM element\u0027s dataset rather than receiving raw string parameters. Additionally, item IDs are URL-encoded with encodeURIComponent before being appended to link hrefs, preventing injection through the ID field.",
                    "generatedAt": "2026-09-25T13:45:46.199650Z",
                    "generator": "patch2vuln.py",
                    "model": "qwen3.8:27b",
                    "modelComparison": {
                      "rankings": [
                        {
                          "agreementScore": 9,
                          "assumptionCount": 5,
                          "confidence": "medium",
                          "model": "qwen3.8:27b",
                          "score": 5
                        }
                      ],
                      "selectedModel": "qwen3.8:27b",
                      "selectionMethod": "deterministic-consensus-v1",
                      "selectionNotice": "The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required."
                    },
                    "patchSha256": "c110d16dd8eee489472853615089aeb6b6e034457dcbaec9b038bf85ad96b920",
                    "patchSummary": "In showDomain.html: (1) Replaced inline onclick=\"reload_image(\u0027...\u0027)\" with a data-attribute-based approach using data-screenshot, data-url, and data-item-id attributes on the table cell element, plus a .reload-image CSS class. (2) Removed the inline script block that assigned screenshot, URL, and ID values directly into JavaScript variables via Jinja2 interpolation; replaced with dataset reads from the domain_screenshot img element. (3) Changed reload_image() to accept a DOM element and read values from element.dataset instead of raw string arguments. (4) Added a programmatic event binding loop using document.querySelectorAll(\u0027.reload-image\u0027).forEach() with addEventListener(\u0027click\u0027). (5) Applied encodeURIComponent() to item IDs when constructing screenshot link hrefs. (6) Changed the href URL construction to use url_for with keyword arguments instead of string interpolation.",
                    "patchTruncated": false,
                    "patches": [
                      {
                        "commit": "31376ee3d04519c898bb9b3671453a41c4117340",
                        "patchSha256": "c110d16dd8eee489472853615089aeb6b6e034457dcbaec9b038bf85ad96b920",
                        "source": "https://github.com/ail-project/ail-framework/commit/31376ee3d04519c898bb9b3671453a41c4117340.patch",
                        "sourceUrl": "https://github.com/ail-project/ail-framework/commit/31376ee3d04519c898bb9b3671453a41c4117340.patch",
                        "subject": "chg: [security] prevent stored XSS through imported capture"
                      }
                    ],
                    "source": "https://github.com/ail-project/ail-framework/commit/31376ee3d04519c898bb9b3671453a41c4117340.patch",
                    "subject": "chg: [security] prevent stored XSS through imported capture",
                    "tagVersionBoundary": {
                      "commits_after_fix": 21,
                      "repository": "https://github.com/ail-project/ail-framework",
                      "tag": "v7.1",
                      "version": "7.1",
                      "version_type": "custom"
                    },
                    "weaknessRationale": [
                      {
                        "cweId": "CWE-79",
                        "rationale": "The patch explicitly addresses stored XSS by removing user-controlled values (screenshot paths, URLs, item IDs from crawler capture imports) from inline JavaScript contexts and replacing them with properly escaped data attributes and programmatic event binding. The commit message confirms the intent: \u0027prevent stored XSS through imported capture metadata in showDomain.\u0027"
                      }
                    ]
                  }
                }
              },
              "recordType": "advisory",
              "vulnId": "GCVE-1-2026-20292"
            }
          ],
          "x_generator": {
            "engine": "Vulnogram 0.2.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
        "assignerShortName": "CIRCL",
        "cveId": "CVE-2026-100190",
        "datePublished": "2026-09-25T13:52:19.648Z",
        "dateReserved": "2026-09-25T13:52:13.769Z",
        "dateUpdated": "2026-09-25T16:13:26.973Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-100187 (GCVE-0-2026-100187)

    Vulnerability from nvd – Published: 2026-09-25 13:42 – Updated: 2026-09-25 14:49
    VLAI
    Title
    AIL Framework Onion Module: Non-Onion URL Accepted as Crawler Task Due to Bypassed Domain Validation
    Summary
    The Onion module in AIL Framework contained a performance shortcut in its URL extraction logic that accepted URLs as valid .onion targets based solely on a length check (exactly 69 characters) and a suffix check (ending in ".onion"), without performing proper hostname parsing or onion-domain validation. An unauthenticated attacker who could publish or control web content crawled by the framework could embed a crafted URL containing an IP address or non-onion hostname with a path ending in ".onion" that satisfied the length and suffix conditions. Such a URL would be extracted, its domain naively sliced from the string, and queued as a legitimate onion crawler task. This allowed unauthenticated content publishers to inject arbitrary non-onion targets into the crawler's task queue, influencing crawler behavior and potentially directing it toward unintended network resources. The vulnerability required no authentication, no user interaction, and only the ability to place crafted content in a location the framework would crawl. The security impact is a loss of integrity in the crawler's target selection: the framework processes and acts upon URLs that do not correspond to legitimate .onion services.
    SSVC
    Exploitation: none Automatable: yes Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-09-25 14:45 UTC
    CWE
    • CWE-20 - Improper Input Validation
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: unspecified , < 7.1 (semver)
    Create a notification for this product.
    GCVE extensions
    AI involvement GCVE-BCP-05-X-01
    Whole record AI-generated Not human-reviewed GNA-1

    Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.

    ai-computer-assisted:llm-generatedai-computer-assisted:classification
    Model Source Identifier
    qwen3.8:27b ollama qwen3.8:27b
    Patch provenance GCVE-BCP-05-X-02
    Generator
    patch2vuln.py on 2026-09-25 13:37
    Model
    qwen3.8:27b
    Input
    https://github.com/ail-project/ail-framework/commit/5c8a68b3d8c7d7b03e5febe4ac5b5aca91826adb.patch 9fbf19112822…
    Confidence
    medium
    Commit Subject Patch SHA-256
    5c8a68b3d8c7 chg: [security] Onion module, prevent non-onion crawler task 9fbf19112822…
    Fix summary

    The length-based shortcut that bypassed onion-domain validation is removed. Every extracted URL is now parsed using the standard URL domain extraction function, and the resulting hostname is validated against the existing onion-domain validation routine before the URL is added to the crawler task set. This ensures that only URLs whose hostname is a genuine .onion domain can be queued as crawler tasks.

    Patch summary

    In bin/modules/Onion.py, the conditional block that checked len(url) == 69 and url.endswith('.onion') to shortcut domain extraction (url[7:]) without calling crawlers.is_valid_onion_domain() is removed. The code is replaced with an unconditional call to crawlers.get_url_domain(url) followed by a check that the returned domain is truthy and passes crawlers.is_valid_onion_domain(domain) before adding the domain and URL to the respective sets. Net change: 2 insertions, 9 deletions in a single file.

    CVSS rationale

    Attack Vector is Network because the attacker publishes crafted content on the web that the framework crawls. Attack Complexity is Low because the attacker only needs to construct a URL of exactly 69 characters ending in .onion with a non-onion hostname. No special Adversary Techniques are required. Privileges Required is None because the attacker is an unauthenticated content publisher. User Interaction is None because the crawler processes the content automatically. The primary impact is Low Integrity on the vulnerable component: the crawler task queue is polluted with non-onion URLs, violating the integrity of the framework's target selection. No confidentiality or availability impact is evident from the patch. No subsequent component impact is identified in the evidence.

    Weakness rationale
    • CWE-20 The URL input was validated using an insufficient heuristic (string length and suffix) that could be satisfied by non-onion URLs. The proper hostname parsing and onion-domain validation step was bypassed by the shortcut, allowing attacker-controlled URLs to be accepted as valid onion targets.
    Attack pattern rationale
    • CAPEC-126 The attacker tampers with URL parameters embedded in untrusted crawled content to bypass the application's validation logic and inject non-onion targets into the crawler task queue. CAPEC-126 is the closest available pattern describing manipulation of input parameters to achieve unintended application behavior. The mapping is approximate because the attack vector is content-based injection rather than direct request parameter manipulation, but the core mechanism (crafting input to bypass validation) aligns with this pattern.
    Assumptions to verify
    • The affected version range is inferred from the tag_version_boundary metadata indicating the fix commit is 24 commits before the v7.1 tag; the exact version number of the vulnerable release is not specified in the patch.
    • The CVSS assumes the attacker can place crafted content in a location the AIL Framework crawler will process; the specific crawling scope and configuration are not detailed in the patch.
    • CAPEC-126 (Parameter Tampering) is the closest available attack pattern; the actual attack is content-based URL injection rather than classic request parameter tampering, so the mapping is approximate.
    • The impact is assessed as Low Integrity based on the evidence that non-onion URLs are queued as crawler tasks; broader downstream consequences (e.g., SSRF-like effects) are not evidenced in the patch and are not assumed.
    • The commit date (24 Sep 2026) is taken as-is from the patch metadata; no independent verification of the timeline is performed.
    Model comparison

    Selected qwen3.8:27b by deterministic-consensus-v1
    The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required.

    Model Score Agreement Confidence Assumptions
    qwen3.8:27b 5 9 medium 5
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-100187",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "yes"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-09-25T14:45:47.206440Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-09-25T14:49:57.208Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "modules": [
                "Onion module"
              ],
              "product": "ail framework",
              "programFiles": [
                "bin/modules/Onion.py"
              ],
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThan": "7.1",
                  "status": "affected",
                  "version": "unspecified",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Aurelien Thirion"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Jeroen Pinoy"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe Onion module in AIL Framework contained a performance shortcut in its URL extraction logic that accepted URLs as valid .onion targets based solely on a length check (exactly 69 characters) and a suffix check (ending in \".onion\"), without performing proper hostname parsing or onion-domain validation. An unauthenticated attacker who could publish or control web content crawled by the framework could embed a crafted URL containing an IP address or non-onion hostname with a path ending in \".onion\" that satisfied the length and suffix conditions. Such a URL would be extracted, its domain naively sliced from the string, and queued as a legitimate onion crawler task. This allowed unauthenticated content publishers to inject arbitrary non-onion targets into the crawler\u0027s task queue, influencing crawler behavior and potentially directing it toward unintended network resources. The vulnerability required no authentication, no user interaction, and only the ability to place crafted content in a location the framework would crawl. The security impact is a loss of integrity in the crawler\u0027s target selection: the framework processes and acts upon URLs that do not correspond to legitimate .onion services.\u003c/p\u003e"
                }
              ],
              "value": "The Onion module in AIL Framework contained a performance shortcut in its URL extraction logic that accepted URLs as valid .onion targets based solely on a length check (exactly 69 characters) and a suffix check (ending in \".onion\"), without performing proper hostname parsing or onion-domain validation. An unauthenticated attacker who could publish or control web content crawled by the framework could embed a crafted URL containing an IP address or non-onion hostname with a path ending in \".onion\" that satisfied the length and suffix conditions. Such a URL would be extracted, its domain naively sliced from the string, and queued as a legitimate onion crawler task. This allowed unauthenticated content publishers to inject arbitrary non-onion targets into the crawler\u0027s task queue, influencing crawler behavior and potentially directing it toward unintended network resources. The vulnerability required no authentication, no user interaction, and only the ability to place crafted content in a location the framework would crawl. The security impact is a loss of integrity in the crawler\u0027s target selection: the framework processes and acts upon URLs that do not correspond to legitimate .onion services."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-126",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-126 Parameter Tampering"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 6.9,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "LOW",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-20",
                  "description": "CWE-20 Improper Input Validation",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-09-25T13:42:16.854Z",
            "orgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
            "shortName": "CIRCL"
          },
          "references": [
            {
              "name": "Security patch",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/5c8a68b3d8c7d7b03e5febe4ac5b5aca91826adb"
            }
          ],
          "solutions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe length-based shortcut that bypassed onion-domain validation is removed. Every extracted URL is now parsed using the standard URL domain extraction function, and the resulting hostname is validated against the existing onion-domain validation routine before the URL is added to the crawler task set. This ensures that only URLs whose hostname is a genuine .onion domain can be queued as crawler tasks.\u003c/p\u003e"
                }
              ],
              "value": "The length-based shortcut that bypassed onion-domain validation is removed. Every extracted URL is now parsed using the standard URL domain extraction function, and the resulting hostname is validated against the existing onion-domain validation routine before the URL is added to the crawler task set. This ensures that only URLs whose hostname is a genuine .onion domain can be queued as crawler tasks."
            }
          ],
          "title": "AIL Framework Onion Module: Non-Onion URL Accepted as Crawler Task Due to Bypassed Domain Validation",
          "x_gcve": [
            {
              "extensions": {
                "bcp-05-x-01": {
                  "ai_annotations": [
                    {
                      "ai_level": "generated",
                      "description": "Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.",
                      "gna_source": 1,
                      "models": [
                        {
                          "gna_source": 1,
                          "identifier": "qwen3.8:27b",
                          "name": "qwen3.8:27b",
                          "source": "ollama"
                        }
                      ],
                      "review_status": "none",
                      "scope": "record",
                      "tags": [
                        "ai-computer-assisted:llm-generated",
                        "ai-computer-assisted:classification"
                      ]
                    }
                  ]
                },
                "bcp-05-x-02": {
                  "x_patch2vuln": {
                    "assumptions": [
                      "The affected version range is inferred from the tag_version_boundary metadata indicating the fix commit is 24 commits before the v7.1 tag; the exact version number of the vulnerable release is not specified in the patch.",
                      "The CVSS assumes the attacker can place crafted content in a location the AIL Framework crawler will process; the specific crawling scope and configuration are not detailed in the patch.",
                      "CAPEC-126 (Parameter Tampering) is the closest available attack pattern; the actual attack is content-based URL injection rather than classic request parameter tampering, so the mapping is approximate.",
                      "The impact is assessed as Low Integrity based on the evidence that non-onion URLs are queued as crawler tasks; broader downstream consequences (e.g., SSRF-like effects) are not evidenced in the patch and are not assumed.",
                      "The commit date (24 Sep 2026) is taken as-is from the patch metadata; no independent verification of the timeline is performed."
                    ],
                    "capecRationale": [
                      {
                        "capecId": "CAPEC-126",
                        "rationale": "The attacker tampers with URL parameters embedded in untrusted crawled content to bypass the application\u0027s validation logic and inject non-onion targets into the crawler task queue. CAPEC-126 is the closest available pattern describing manipulation of input parameters to achieve unintended application behavior. The mapping is approximate because the attack vector is content-based injection rather than direct request parameter manipulation, but the core mechanism (crafting input to bypass validation) aligns with this pattern."
                      }
                    ],
                    "commit": "5c8a68b3d8c7d7b03e5febe4ac5b5aca91826adb",
                    "confidence": "medium",
                    "credits": [
                      {
                        "lang": "en",
                        "type": "remediation developer",
                        "value": "terrtia"
                      }
                    ],
                    "cvssRationale": "Attack Vector is Network because the attacker publishes crafted content on the web that the framework crawls. Attack Complexity is Low because the attacker only needs to construct a URL of exactly 69 characters ending in .onion with a non-onion hostname. No special Adversary Techniques are required. Privileges Required is None because the attacker is an unauthenticated content publisher. User Interaction is None because the crawler processes the content automatically. The primary impact is Low Integrity on the vulnerable component: the crawler task queue is polluted with non-onion URLs, violating the integrity of the framework\u0027s target selection. No confidentiality or availability impact is evident from the patch. No subsequent component impact is identified in the evidence.",
                    "fixSummary": "The length-based shortcut that bypassed onion-domain validation is removed. Every extracted URL is now parsed using the standard URL domain extraction function, and the resulting hostname is validated against the existing onion-domain validation routine before the URL is added to the crawler task set. This ensures that only URLs whose hostname is a genuine .onion domain can be queued as crawler tasks.",
                    "generatedAt": "2026-09-25T13:37:37.543009Z",
                    "generator": "patch2vuln.py",
                    "model": "qwen3.8:27b",
                    "modelComparison": {
                      "rankings": [
                        {
                          "agreementScore": 9,
                          "assumptionCount": 5,
                          "confidence": "medium",
                          "model": "qwen3.8:27b",
                          "score": 5
                        }
                      ],
                      "selectedModel": "qwen3.8:27b",
                      "selectionMethod": "deterministic-consensus-v1",
                      "selectionNotice": "The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required."
                    },
                    "patchSha256": "9fbf191128229c1859f3643b5f50921cdf5f36fd70734e8f68a05e237b987d60",
                    "patchSummary": "In bin/modules/Onion.py, the conditional block that checked len(url) == 69 and url.endswith(\u0027.onion\u0027) to shortcut domain extraction (url[7:]) without calling crawlers.is_valid_onion_domain() is removed. The code is replaced with an unconditional call to crawlers.get_url_domain(url) followed by a check that the returned domain is truthy and passes crawlers.is_valid_onion_domain(domain) before adding the domain and URL to the respective sets. Net change: 2 insertions, 9 deletions in a single file.",
                    "patchTruncated": false,
                    "patches": [
                      {
                        "commit": "5c8a68b3d8c7d7b03e5febe4ac5b5aca91826adb",
                        "patchSha256": "9fbf191128229c1859f3643b5f50921cdf5f36fd70734e8f68a05e237b987d60",
                        "source": "https://github.com/ail-project/ail-framework/commit/5c8a68b3d8c7d7b03e5febe4ac5b5aca91826adb.patch",
                        "sourceUrl": "https://github.com/ail-project/ail-framework/commit/5c8a68b3d8c7d7b03e5febe4ac5b5aca91826adb.patch",
                        "subject": "chg: [security] Onion module, prevent non-onion crawler task"
                      }
                    ],
                    "source": "https://github.com/ail-project/ail-framework/commit/5c8a68b3d8c7d7b03e5febe4ac5b5aca91826adb.patch",
                    "subject": "chg: [security] Onion module, prevent non-onion crawler task",
                    "tagVersionBoundary": {
                      "commits_after_fix": 24,
                      "repository": "https://github.com/ail-project/ail-framework",
                      "tag": "v7.1",
                      "version": "7.1",
                      "version_type": "custom"
                    },
                    "weaknessRationale": [
                      {
                        "cweId": "CWE-20",
                        "rationale": "The URL input was validated using an insufficient heuristic (string length and suffix) that could be satisfied by non-onion URLs. The proper hostname parsing and onion-domain validation step was bypassed by the shortcut, allowing attacker-controlled URLs to be accepted as valid onion targets."
                      }
                    ]
                  }
                }
              },
              "recordType": "advisory",
              "vulnId": "GCVE-1-2026-20276"
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
        "assignerShortName": "CIRCL",
        "cveId": "CVE-2026-100187",
        "datePublished": "2026-09-25T13:42:16.854Z",
        "dateReserved": "2026-09-25T13:42:12.578Z",
        "dateUpdated": "2026-09-25T14:49:57.208Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-100177 (GCVE-0-2026-100177)

    Vulnerability from nvd – Published: 2026-09-25 13:35 – Updated: 2026-09-25 14:55
    VLAI
    Title
    Ail Framework Crawler: Missing Cookiejar Authorization Check Allows Cross-Organization Cookiejar Attachment
    Summary
    The AIL Framework crawler task creation API (api_add_crawler_task) contained an insufficient authorization check when a user supplied a cookiejar UUID to attach to a one-shot or scheduled crawler task. The original code only verified that the cookiejar existed and, if its access level was 0, compared the cookiejar's owning user ID to the requesting user ID. It did not validate organizational boundaries, did not account for the requesting user's role. When the cookiejar level was not 0, no access check was performed at all. An authenticated user could therefore reference another organization's cookiejar by UUID and have the crawler use that organization's stored cookies (session tokens, authentication credentials) when performing web crawls, effectively leaking or exfiltrating the victim organization's session data. The vulnerability requires an authenticated user with the ability to create crawler tasks. The attacker must know or guess a valid cookiejar UUID belonging to another organization. The impact is unauthorized access to another organization's stored cookies and session data through the crawler infrastructure.
    SSVC
    Exploitation: none Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-09-25 14:55 UTC
    CWE
    • CWE-639 - Authorization Bypass Through User-Controlled Key
    • CWE-20 - Improper Input Validation
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: unspecified , < 7.1 (semver)
    Create a notification for this product.
    GCVE extensions
    AI involvement GCVE-BCP-05-X-01
    Whole record AI-generated Not human-reviewed GNA-1

    Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.

    ai-computer-assisted:llm-generatedai-computer-assisted:classification
    Model Source Identifier
    qwen3.8:27b ollama qwen3.8:27b
    Patch provenance GCVE-BCP-05-X-02
    Generator
    patch2vuln.py on 2026-09-25 13:30
    Model
    qwen3.8:27b
    Input
    https://github.com/ail-project/ail-framework/commit/3773ca36658c57ce592aebe74e27c855eb64f58a.patch 43e163a1b90d…
    Confidence
    medium
    Commit Subject Patch SHA-256
    3773ca36658c chg: [security] crawler, enforce cookiejar ACL when creating 43e163a1b90d…
    Fix summary

    The cookiejar attachment path in api_add_crawler_task is now validated through the existing api_check_cookiejar_access_acl() function, which enforces organization, user, and role-based access control for the 'view' action on the referenced cookiejar. The user_role parameter is propagated from the API and UI entry points (api_rest.py, crawler_splash.py) into the ACL check. Separately, URL scheme validation is enforced unconditionally: only http and https schemes are accepted, and non-conforming URLs are rejected with a 400 error before any further processing.

    Patch summary

    In bin/lib/crawlers.py: (1) is_global_url() now returns False for any scheme other than http/https (previously returned True for data/file schemes) and handles URLs lacking a netloc by prepending http://. (2) api_validate_global_urls() now rejects non-HTTP/HTTPS schemes with a 400 error before the local-IP filter check. (3) The Cookiejar class gains a get_creator() alias. (4) The CrawlerTask.create() method validates the URL scheme. (5) api_add_crawler_task() replaces the inline level-0 user-ID comparison with a call to api_check_cookiejar_access_acl(cookiejar_uuid, user_org, user_id, user_role, action='view') and accepts a new user_role parameter. (6) api_add_crawler_capture() now calls api_validate_global_urls(). In var/www/blueprints/api_rest.py and crawler_splash.py: user_role is extracted from the authenticated session and passed to api_add_crawler_task().

    CVSS rationale

    The vulnerability is exploitable over the network (AV:N) with low complexity (AC:L) since the attacker only needs to substitute a known or guessed cookiejar UUID in an API request. No attack target manipulation is required (AT:N). An authenticated user with crawler task creation privileges is needed (PR:L). No user interaction is required (UI:N). The vulnerable component itself does not lose confidentiality, integrity, or availability (VC:N, VI:N, VA:N). However, the subsequent impact is high on confidentiality (SC:H) because the attacker gains access to another organization's stored cookies and session tokens via the crawler, which could be used to impersonate the victim on target sites. No subsequent integrity or availability impact is evident (SI:N, SA:N).

    Weakness rationale
    • CWE-639 The cookiejar UUID is a user-supplied identifier (key) that was not properly validated against the requesting user's organization and role. The old code only compared user IDs when level was 0 and skipped the check entirely otherwise, allowing cross-organization access to another user's cookiejar.
    • CWE-20 The URL scheme validation was incorrect: data: and file: schemes were treated as valid global URLs, and the scheme check was skipped when the local-IP filter was disabled. The fix enforces that only http and https schemes are accepted unconditionally.
    Attack pattern rationale
    • CAPEC-1 The attacker tampers with the cookiejar UUID parameter in the crawler task creation API request to reference a resource (cookiejar) belonging to another organization. The system failed to validate that the referenced object was accessible to the requesting user's organization. This is the closest CAPEC pattern to an IDOR-style parameter substitution; no CAPEC specifically named 'Insecure Direct Object Reference' exists, so CAPEC-1 (modifying a request parameter to access unauthorized resources) is the best available match.
    Assumptions to verify
    • The api_check_cookiejar_access_acl() function is assumed to correctly enforce organization, user, and role-based access control; its implementation is not included in this patch.
    • The cookiejar UUID is assumed to be guessable or discoverable by an authenticated user (e.g., via enumeration or information leakage); if UUIDs are truly random and unguessable, exploitability is reduced but the authorization flaw remains.
    • The CVSS assumes the primary security impact is subsequent confidentiality (access to another org's cookies/sessions) rather than direct compromise of the Ail Framework itself.
    • The CAPEC-1 mapping is the closest available pattern for an IDOR/parameter-substitution attack; no CAPEC specifically covers insecure direct object reference, so this mapping carries some uncertainty.
    • The affected version boundary is inferred from the tag v7.1 (26 commits after the fix commit), suggesting the fix landed before the v7.1 release; exact affected version range is not confirmed.
    • The URL scheme validation fix (rejecting data:/file: schemes) is treated as a secondary hardening change within the same patch set rather than a separate vulnerability.
    Model comparison

    Selected qwen3.8:27b by deterministic-consensus-v1
    The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required.

    Model Score Agreement Confidence Assumptions
    qwen3.8:27b 4 9 medium 6
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-100177",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-09-25T14:55:38.429027Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-09-25T14:55:51.640Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "modules": [
                "bin/lib/crawlers.py",
                "var/www/blueprints/api_rest.py",
                "var/www/blueprints/crawler_splash.py"
              ],
              "product": "ail framework",
              "programFiles": [
                "bin/lib/crawlers.py",
                "var/www/blueprints/api_rest.py",
                "var/www/blueprints/crawler_splash.py"
              ],
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThan": "7.1",
                  "status": "affected",
                  "version": "unspecified",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "terrtia"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Jeroen Pinoy"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe AIL Framework crawler task creation API (api_add_crawler_task) contained an insufficient authorization check when a user supplied a cookiejar UUID to attach to a one-shot or scheduled crawler task. The original code only verified that the cookiejar existed and, if its access level was 0, compared the cookiejar\u0027s owning user ID to the requesting user ID. It did not validate organizational boundaries, did not account for the requesting user\u0027s role. When the cookiejar level was not 0, no access check was performed at all. An authenticated user could therefore reference another organization\u0027s cookiejar by UUID and have the crawler use that organization\u0027s stored cookies (session tokens, authentication credentials) when performing web crawls, effectively leaking or exfiltrating the victim organization\u0027s session data.\u003cbr\u003e\u003c/p\u003e\u003cp\u003eThe vulnerability requires an authenticated user with the ability to create crawler tasks. The attacker must know or guess a valid cookiejar UUID belonging to another organization. The impact is unauthorized access to another organization\u0027s stored cookies and session data through the crawler infrastructure.\u003c/p\u003e"
                }
              ],
              "value": "The AIL Framework crawler task creation API (api_add_crawler_task) contained an insufficient authorization check when a user supplied a cookiejar UUID to attach to a one-shot or scheduled crawler task. The original code only verified that the cookiejar existed and, if its access level was 0, compared the cookiejar\u0027s owning user ID to the requesting user ID. It did not validate organizational boundaries, did not account for the requesting user\u0027s role. When the cookiejar level was not 0, no access check was performed at all. An authenticated user could therefore reference another organization\u0027s cookiejar by UUID and have the crawler use that organization\u0027s stored cookies (session tokens, authentication credentials) when performing web crawls, effectively leaking or exfiltrating the victim organization\u0027s session data.\n\n\nThe vulnerability requires an authenticated user with the ability to create crawler tasks. The attacker must know or guess a valid cookiejar UUID belonging to another organization. The impact is unauthorized access to another organization\u0027s stored cookies and session data through the crawler infrastructure."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-1",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-1 Tamper with URLs"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 6.3,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "LOW",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "HIGH",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:N/VA:N/SC:H/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-639",
                  "description": "CWE-639 Authorization Bypass Through User-Controlled Key",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            },
            {
              "descriptions": [
                {
                  "cweId": "CWE-20",
                  "description": "CWE-20 Improper Input Validation",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-09-25T13:35:50.465Z",
            "orgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
            "shortName": "CIRCL"
          },
          "references": [
            {
              "name": "Security patch",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/3773ca36658c57ce592aebe74e27c855eb64f58a"
            }
          ],
          "solutions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe cookiejar attachment path in api_add_crawler_task is now validated through the existing api_check_cookiejar_access_acl() function, which enforces organization, user, and role-based access control for the \u0027view\u0027 action on the referenced cookiejar. The user_role parameter is propagated from the API and UI entry points (api_rest.py, crawler_splash.py) into the ACL check. Separately, URL scheme validation is enforced unconditionally: only http and https schemes are accepted, and non-conforming URLs are rejected with a 400 error before any further processing.\u003c/p\u003e"
                }
              ],
              "value": "The cookiejar attachment path in api_add_crawler_task is now validated through the existing api_check_cookiejar_access_acl() function, which enforces organization, user, and role-based access control for the \u0027view\u0027 action on the referenced cookiejar. The user_role parameter is propagated from the API and UI entry points (api_rest.py, crawler_splash.py) into the ACL check. Separately, URL scheme validation is enforced unconditionally: only http and https schemes are accepted, and non-conforming URLs are rejected with a 400 error before any further processing."
            }
          ],
          "title": "Ail Framework Crawler: Missing Cookiejar Authorization Check Allows Cross-Organization Cookiejar Attachment",
          "x_gcve": [
            {
              "extensions": {
                "bcp-05-x-01": {
                  "ai_annotations": [
                    {
                      "ai_level": "generated",
                      "description": "Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.",
                      "gna_source": 1,
                      "models": [
                        {
                          "gna_source": 1,
                          "identifier": "qwen3.8:27b",
                          "name": "qwen3.8:27b",
                          "source": "ollama"
                        }
                      ],
                      "review_status": "none",
                      "scope": "record",
                      "tags": [
                        "ai-computer-assisted:llm-generated",
                        "ai-computer-assisted:classification"
                      ]
                    }
                  ]
                },
                "bcp-05-x-02": {
                  "x_patch2vuln": {
                    "assumptions": [
                      "The api_check_cookiejar_access_acl() function is assumed to correctly enforce organization, user, and role-based access control; its implementation is not included in this patch.",
                      "The cookiejar UUID is assumed to be guessable or discoverable by an authenticated user (e.g., via enumeration or information leakage); if UUIDs are truly random and unguessable, exploitability is reduced but the authorization flaw remains.",
                      "The CVSS assumes the primary security impact is subsequent confidentiality (access to another org\u0027s cookies/sessions) rather than direct compromise of the Ail Framework itself.",
                      "The CAPEC-1 mapping is the closest available pattern for an IDOR/parameter-substitution attack; no CAPEC specifically covers insecure direct object reference, so this mapping carries some uncertainty.",
                      "The affected version boundary is inferred from the tag v7.1 (26 commits after the fix commit), suggesting the fix landed before the v7.1 release; exact affected version range is not confirmed.",
                      "The URL scheme validation fix (rejecting data:/file: schemes) is treated as a secondary hardening change within the same patch set rather than a separate vulnerability."
                    ],
                    "capecRationale": [
                      {
                        "capecId": "CAPEC-1",
                        "rationale": "The attacker tampers with the cookiejar UUID parameter in the crawler task creation API request to reference a resource (cookiejar) belonging to another organization. The system failed to validate that the referenced object was accessible to the requesting user\u0027s organization. This is the closest CAPEC pattern to an IDOR-style parameter substitution; no CAPEC specifically named \u0027Insecure Direct Object Reference\u0027 exists, so CAPEC-1 (modifying a request parameter to access unauthorized resources) is the best available match."
                      }
                    ],
                    "commit": "3773ca36658c57ce592aebe74e27c855eb64f58a",
                    "confidence": "medium",
                    "credits": [
                      {
                        "lang": "en",
                        "type": "remediation developer",
                        "value": "terrtia"
                      }
                    ],
                    "cvssRationale": "The vulnerability is exploitable over the network (AV:N) with low complexity (AC:L) since the attacker only needs to substitute a known or guessed cookiejar UUID in an API request. No attack target manipulation is required (AT:N). An authenticated user with crawler task creation privileges is needed (PR:L). No user interaction is required (UI:N). The vulnerable component itself does not lose confidentiality, integrity, or availability (VC:N, VI:N, VA:N). However, the subsequent impact is high on confidentiality (SC:H) because the attacker gains access to another organization\u0027s stored cookies and session tokens via the crawler, which could be used to impersonate the victim on target sites. No subsequent integrity or availability impact is evident (SI:N, SA:N).",
                    "fixSummary": "The cookiejar attachment path in api_add_crawler_task is now validated through the existing api_check_cookiejar_access_acl() function, which enforces organization, user, and role-based access control for the \u0027view\u0027 action on the referenced cookiejar. The user_role parameter is propagated from the API and UI entry points (api_rest.py, crawler_splash.py) into the ACL check. Separately, URL scheme validation is enforced unconditionally: only http and https schemes are accepted, and non-conforming URLs are rejected with a 400 error before any further processing.",
                    "generatedAt": "2026-09-25T13:30:48.386437Z",
                    "generator": "patch2vuln.py",
                    "model": "qwen3.8:27b",
                    "modelComparison": {
                      "rankings": [
                        {
                          "agreementScore": 9,
                          "assumptionCount": 6,
                          "confidence": "medium",
                          "model": "qwen3.8:27b",
                          "score": 4
                        }
                      ],
                      "selectedModel": "qwen3.8:27b",
                      "selectionMethod": "deterministic-consensus-v1",
                      "selectionNotice": "The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required."
                    },
                    "patchSha256": "43e163a1b90d5926293d5dbd7982d46241f08d7a9d2cb0edf86c963f794afac5",
                    "patchSummary": "In bin/lib/crawlers.py: (1) is_global_url() now returns False for any scheme other than http/https (previously returned True for data/file schemes) and handles URLs lacking a netloc by prepending http://. (2) api_validate_global_urls() now rejects non-HTTP/HTTPS schemes with a 400 error before the local-IP filter check. (3) The Cookiejar class gains a get_creator() alias. (4) The CrawlerTask.create() method validates the URL scheme. (5) api_add_crawler_task() replaces the inline level-0 user-ID comparison with a call to api_check_cookiejar_access_acl(cookiejar_uuid, user_org, user_id, user_role, action=\u0027view\u0027) and accepts a new user_role parameter. (6) api_add_crawler_capture() now calls api_validate_global_urls(). In var/www/blueprints/api_rest.py and crawler_splash.py: user_role is extracted from the authenticated session and passed to api_add_crawler_task().",
                    "patchTruncated": false,
                    "patches": [
                      {
                        "commit": "3773ca36658c57ce592aebe74e27c855eb64f58a",
                        "patchSha256": "43e163a1b90d5926293d5dbd7982d46241f08d7a9d2cb0edf86c963f794afac5",
                        "source": "https://github.com/ail-project/ail-framework/commit/3773ca36658c57ce592aebe74e27c855eb64f58a.patch",
                        "sourceUrl": "https://github.com/ail-project/ail-framework/commit/3773ca36658c57ce592aebe74e27c855eb64f58a.patch",
                        "subject": "chg: [security] crawler, enforce cookiejar ACL when creating"
                      }
                    ],
                    "source": "https://github.com/ail-project/ail-framework/commit/3773ca36658c57ce592aebe74e27c855eb64f58a.patch",
                    "subject": "chg: [security] crawler, enforce cookiejar ACL when creating",
                    "tagVersionBoundary": {
                      "commits_after_fix": 26,
                      "repository": "https://github.com/ail-project/ail-framework",
                      "tag": "v7.1",
                      "version": "7.1",
                      "version_type": "custom"
                    },
                    "weaknessRationale": [
                      {
                        "cweId": "CWE-639",
                        "rationale": "The cookiejar UUID is a user-supplied identifier (key) that was not properly validated against the requesting user\u0027s organization and role. The old code only compared user IDs when level was 0 and skipped the check entirely otherwise, allowing cross-organization access to another user\u0027s cookiejar."
                      },
                      {
                        "cweId": "CWE-20",
                        "rationale": "The URL scheme validation was incorrect: data: and file: schemes were treated as valid global URLs, and the scheme check was skipped when the local-IP filter was disabled. The fix enforces that only http and https schemes are accepted unconditionally."
                      }
                    ]
                  }
                }
              },
              "recordType": "advisory",
              "vulnId": "GCVE-1-2026-20183"
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
        "assignerShortName": "CIRCL",
        "cveId": "CVE-2026-100177",
        "datePublished": "2026-09-25T13:35:50.465Z",
        "dateReserved": "2026-09-25T13:35:37.184Z",
        "dateUpdated": "2026-09-25T14:55:51.640Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-100176 (GCVE-0-2026-100176)

    Vulnerability from nvd – Published: 2026-09-25 13:29 – Updated: 2026-09-25 14:59
    VLAI
    Title
    Stored Cross-Site Scripting (XSS) in AIL Framework Username Timeline Tooltip
    Summary
    The AIL Framework's username timeline feature is vulnerable to stored cross-site scripting (XSS). Usernames imported from chats and crawled forums are stored without character restrictions. When an authenticated analyst views the username timeline, the application renders these stored usernames into the DOM using D3's html() method in the tooltip. Because the username value (d.obj) is interpolated directly into an HTML string without sanitization, a crafted username containing HTML event handlers (e.g., <img src=x onerror=alert(1)>) will execute arbitrary JavaScript in the analyst's browser when the analyst hovers over the corresponding timeline entry. The attack requires the victim to be an authenticated analyst with access to the timeline view and to interact with the malicious timeline entry (hover). Successful exploitation can lead to session hijacking, data exfiltration, or unauthorized actions performed within the analyst's authenticated session. The vulnerability resides in the client-side JavaScript file var/www/static/js/d3/timeline_basic.js.
    SSVC
    Exploitation: none Automatable: no Technical Impact: total
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-09-25 14:56 UTC
    CWE
    • CWE-79 - Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: unspecified , < 7.1 (semver)
    Create a notification for this product.
    GCVE extensions
    AI involvement GCVE-BCP-05-X-01
    Whole record AI-generated Not human-reviewed GNA-1

    Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.

    ai-computer-assisted:llm-generatedai-computer-assisted:classification
    Model Source Identifier
    qwen3.8:27b ollama qwen3.8:27b
    Patch provenance GCVE-BCP-05-X-02
    Generator
    patch2vuln.py on 2026-09-25 13:24
    Model
    qwen3.8:27b
    Input
    https://github.com/ail-project/ail-framework/commit/455dd92c4179c53204368d93681ded4b57e31643.patch 36262636a3a7…
    Confidence
    medium
    Commit Subject Patch SHA-256
    455dd92c4179 chg: [security] fix XSS in username timeline tooltip. 36262636a3a7…
    Fix summary

    The fix applies the existing sanitize_text() helper to the user-controlled username value (d.obj) immediately before it is interpolated into the D3 tooltip HTML string. This ensures that any HTML or script content embedded in the stored username is neutralized before DOM insertion, preventing script execution while preserving the tooltip's intended formatting (line breaks and date/time display).

    Patch summary

    In var/www/static/js/d3/timeline_basic.js, the single line constructing the tooltip HTML was changed from tooltip.html(`${d.obj}<br>...`) to tooltip.html(`${sanitize_text(d.obj)}<br>...`). The only modification is wrapping the untrusted d.obj variable with the sanitize_text() function call at the HTML sink, leaving the rest of the tooltip template (br tags, date formatting) unchanged.

    CVSS rationale

    AV:N: The vulnerability is in a web application accessible over the network. AC:L: The attacker only needs to craft a username with HTML/JS in a chat or forum that gets crawled; no race conditions or complex conditions are needed. AT:N: No attack on the target system is required; the malicious username is stored as part of normal data import. PR:N: The attacker does not need any account or privilege on the AIL Framework; they only need to be a user in a source chat/forum. UI:A: The victim (analyst) must actively hover over the specific timeline entry to trigger script execution. VC:H: XSS in an authenticated analyst session can expose sensitive intelligence data, session tokens, and credentials. VI:H: The attacker can perform actions as the analyst, modify data, or exfiltrate information. VA:N: No impact on availability. SC/SI/SA:N: No subsequent system impact is evidenced.

    Weakness rationale
    • CWE-79 The patch inserts a user-controlled value (username from imported chats/forums) into an HTML context via D3's html() method without sanitization. The fix adds sanitize_text() at the sink, confirming the root cause is missing output encoding/neutralization of untrusted data in an HTML context, which is the definition of CWE-79 (stored XSS variant).
    Attack pattern rationale
    • CAPEC-1 CAPEC-1 describes the general pattern of injecting client-side scripts into web pages via untrusted input. The patch evidence shows a stored username (untrusted input from chats/forums) being rendered into an HTML tooltip without sanitization, matching the stored-XSS sub-pattern of CAPEC-1. This is the closest and most direct CAPEC mapping for an XSS vulnerability where attacker-controlled data is persisted and later rendered in a victim's browser.
    Assumptions to verify
    • The UI:A (Active) user interaction metric assumes the analyst must deliberately hover over the specific timeline entry to trigger the XSS; passive rendering without hover is not evidenced in the patch.
    • The affected version boundary is inferred from the tag_version_boundary metadata (v7.1, 29 commits after fix); the exact last affected and first fixed version numbers are not explicitly stated in the patch.
    • PR:N assumes the attacker does not need an account on the AIL Framework itself, only a presence in a crawled chat or forum source; if the platform requires the attacker to be a registered user to have their username crawled, PR:L might be more appropriate.
    • The CAPEC-1 mapping is the closest available pattern for stored XSS; no more specific CAPEC ID for 'stored XSS via imported data rendered in a tooltip' exists in the CAPEC catalog.
    • The sanitize_text() helper is assumed to perform adequate HTML entity encoding or equivalent neutralization; its implementation is not shown in the patch.
    • VC:H and VI:H reflect the sensitivity of an intelligence-analysis platform where an authenticated analyst session may contain classified or highly sensitive data; if the deployment context is less sensitive, lower impact ratings could apply.
    Model comparison

    Selected qwen3.8:27b by deterministic-consensus-v1
    The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required.

    Model Score Agreement Confidence Assumptions
    qwen3.8:27b 4 9 medium 6
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-100176",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "total"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-09-25T14:56:38.970855Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-09-25T14:59:28.644Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "modules": [
                "username timeline (D3 timeline_basic)"
              ],
              "product": "ail framework",
              "programFiles": [
                "var/www/static/js/d3/timeline_basic.js"
              ],
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThan": "7.1",
                  "status": "affected",
                  "version": "unspecified",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Aurelien Thirion"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Jeroen Pinoy"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe AIL Framework\u0027s username timeline feature is vulnerable to stored cross-site scripting (XSS). Usernames imported from chats and crawled forums are stored without character restrictions. When an authenticated analyst views the username timeline, the application renders these stored usernames into the DOM using D3\u0027s html() method in the tooltip. Because the username value (d.obj) is interpolated directly into an HTML string without sanitization, a crafted username containing HTML event handlers (e.g., \u0026lt;img src=x onerror=alert(1)\u0026gt;) will execute arbitrary JavaScript in the analyst\u0027s browser when the analyst hovers over the corresponding timeline entry. The attack requires the victim to be an authenticated analyst with access to the timeline view and to interact with the malicious timeline entry (hover). Successful exploitation can lead to session hijacking, data exfiltration, or unauthorized actions performed within the analyst\u0027s authenticated session. The vulnerability resides in the client-side JavaScript file var/www/static/js/d3/timeline_basic.js.\u003c/p\u003e"
                }
              ],
              "value": "The AIL Framework\u0027s username timeline feature is vulnerable to stored cross-site scripting (XSS). Usernames imported from chats and crawled forums are stored without character restrictions. When an authenticated analyst views the username timeline, the application renders these stored usernames into the DOM using D3\u0027s html() method in the tooltip. Because the username value (d.obj) is interpolated directly into an HTML string without sanitization, a crafted username containing HTML event handlers (e.g., \u003cimg src=x onerror=alert(1)\u003e) will execute arbitrary JavaScript in the analyst\u0027s browser when the analyst hovers over the corresponding timeline entry. The attack requires the victim to be an authenticated analyst with access to the timeline view and to interact with the malicious timeline entry (hover). Successful exploitation can lead to session hijacking, data exfiltration, or unauthorized actions performed within the analyst\u0027s authenticated session. The vulnerability resides in the client-side JavaScript file var/www/static/js/d3/timeline_basic.js."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-1",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-1 Cross Site Scripting"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 8.5,
                "baseSeverity": "HIGH",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "ACTIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "HIGH",
                "vulnIntegrityImpact": "HIGH",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-79",
                  "description": "CWE-79 Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-09-25T13:29:17.333Z",
            "orgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
            "shortName": "CIRCL"
          },
          "references": [
            {
              "name": "Security patch",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/455dd92c4179c53204368d93681ded4b57e31643"
            }
          ],
          "solutions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe fix applies the existing sanitize_text() helper to the user-controlled username value (d.obj) immediately before it is interpolated into the D3 tooltip HTML string. This ensures that any HTML or script content embedded in the stored username is neutralized before DOM insertion, preventing script execution while preserving the tooltip\u0027s intended formatting (line breaks and date/time display).\u003c/p\u003e"
                }
              ],
              "value": "The fix applies the existing sanitize_text() helper to the user-controlled username value (d.obj) immediately before it is interpolated into the D3 tooltip HTML string. This ensures that any HTML or script content embedded in the stored username is neutralized before DOM insertion, preventing script execution while preserving the tooltip\u0027s intended formatting (line breaks and date/time display)."
            }
          ],
          "title": "Stored Cross-Site Scripting (XSS) in AIL Framework Username Timeline Tooltip",
          "x_gcve": [
            {
              "extensions": {
                "bcp-05-x-01": {
                  "ai_annotations": [
                    {
                      "ai_level": "generated",
                      "description": "Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.",
                      "gna_source": 1,
                      "models": [
                        {
                          "gna_source": 1,
                          "identifier": "qwen3.8:27b",
                          "name": "qwen3.8:27b",
                          "source": "ollama"
                        }
                      ],
                      "review_status": "none",
                      "scope": "record",
                      "tags": [
                        "ai-computer-assisted:llm-generated",
                        "ai-computer-assisted:classification"
                      ]
                    }
                  ]
                },
                "bcp-05-x-02": {
                  "x_patch2vuln": {
                    "assumptions": [
                      "The UI:A (Active) user interaction metric assumes the analyst must deliberately hover over the specific timeline entry to trigger the XSS; passive rendering without hover is not evidenced in the patch.",
                      "The affected version boundary is inferred from the tag_version_boundary metadata (v7.1, 29 commits after fix); the exact last affected and first fixed version numbers are not explicitly stated in the patch.",
                      "PR:N assumes the attacker does not need an account on the AIL Framework itself, only a presence in a crawled chat or forum source; if the platform requires the attacker to be a registered user to have their username crawled, PR:L might be more appropriate.",
                      "The CAPEC-1 mapping is the closest available pattern for stored XSS; no more specific CAPEC ID for \u0027stored XSS via imported data rendered in a tooltip\u0027 exists in the CAPEC catalog.",
                      "The sanitize_text() helper is assumed to perform adequate HTML entity encoding or equivalent neutralization; its implementation is not shown in the patch.",
                      "VC:H and VI:H reflect the sensitivity of an intelligence-analysis platform where an authenticated analyst session may contain classified or highly sensitive data; if the deployment context is less sensitive, lower impact ratings could apply."
                    ],
                    "capecRationale": [
                      {
                        "capecId": "CAPEC-1",
                        "rationale": "CAPEC-1 describes the general pattern of injecting client-side scripts into web pages via untrusted input. The patch evidence shows a stored username (untrusted input from chats/forums) being rendered into an HTML tooltip without sanitization, matching the stored-XSS sub-pattern of CAPEC-1. This is the closest and most direct CAPEC mapping for an XSS vulnerability where attacker-controlled data is persisted and later rendered in a victim\u0027s browser."
                      }
                    ],
                    "commit": "455dd92c4179c53204368d93681ded4b57e31643",
                    "confidence": "medium",
                    "credits": [
                      {
                        "lang": "en",
                        "type": "remediation developer",
                        "value": "terrtia"
                      }
                    ],
                    "cvssRationale": "AV:N: The vulnerability is in a web application accessible over the network. AC:L: The attacker only needs to craft a username with HTML/JS in a chat or forum that gets crawled; no race conditions or complex conditions are needed. AT:N: No attack on the target system is required; the malicious username is stored as part of normal data import. PR:N: The attacker does not need any account or privilege on the AIL Framework; they only need to be a user in a source chat/forum. UI:A: The victim (analyst) must actively hover over the specific timeline entry to trigger script execution. VC:H: XSS in an authenticated analyst session can expose sensitive intelligence data, session tokens, and credentials. VI:H: The attacker can perform actions as the analyst, modify data, or exfiltrate information. VA:N: No impact on availability. SC/SI/SA:N: No subsequent system impact is evidenced.",
                    "fixSummary": "The fix applies the existing sanitize_text() helper to the user-controlled username value (d.obj) immediately before it is interpolated into the D3 tooltip HTML string. This ensures that any HTML or script content embedded in the stored username is neutralized before DOM insertion, preventing script execution while preserving the tooltip\u0027s intended formatting (line breaks and date/time display).",
                    "generatedAt": "2026-09-25T13:24:29.029450Z",
                    "generator": "patch2vuln.py",
                    "model": "qwen3.8:27b",
                    "modelComparison": {
                      "rankings": [
                        {
                          "agreementScore": 9,
                          "assumptionCount": 6,
                          "confidence": "medium",
                          "model": "qwen3.8:27b",
                          "score": 4
                        }
                      ],
                      "selectedModel": "qwen3.8:27b",
                      "selectionMethod": "deterministic-consensus-v1",
                      "selectionNotice": "The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required."
                    },
                    "patchSha256": "36262636a3a75bbee1ac4f863ce7a5ce7939eb2e21fed5ede98403d38c29ec40",
                    "patchSummary": "In var/www/static/js/d3/timeline_basic.js, the single line constructing the tooltip HTML was changed from tooltip.html(`${d.obj}\u003cbr\u003e...`) to tooltip.html(`${sanitize_text(d.obj)}\u003cbr\u003e...`). The only modification is wrapping the untrusted d.obj variable with the sanitize_text() function call at the HTML sink, leaving the rest of the tooltip template (br tags, date formatting) unchanged.",
                    "patchTruncated": false,
                    "patches": [
                      {
                        "commit": "455dd92c4179c53204368d93681ded4b57e31643",
                        "patchSha256": "36262636a3a75bbee1ac4f863ce7a5ce7939eb2e21fed5ede98403d38c29ec40",
                        "source": "https://github.com/ail-project/ail-framework/commit/455dd92c4179c53204368d93681ded4b57e31643.patch",
                        "sourceUrl": "https://github.com/ail-project/ail-framework/commit/455dd92c4179c53204368d93681ded4b57e31643.patch",
                        "subject": "chg: [security] fix XSS in username timeline tooltip."
                      }
                    ],
                    "source": "https://github.com/ail-project/ail-framework/commit/455dd92c4179c53204368d93681ded4b57e31643.patch",
                    "subject": "chg: [security] fix XSS in username timeline tooltip.",
                    "tagVersionBoundary": {
                      "commits_after_fix": 29,
                      "repository": "https://github.com/ail-project/ail-framework",
                      "tag": "v7.1",
                      "version": "7.1",
                      "version_type": "custom"
                    },
                    "weaknessRationale": [
                      {
                        "cweId": "CWE-79",
                        "rationale": "The patch inserts a user-controlled value (username from imported chats/forums) into an HTML context via D3\u0027s html() method without sanitization. The fix adds sanitize_text() at the sink, confirming the root cause is missing output encoding/neutralization of untrusted data in an HTML context, which is the definition of CWE-79 (stored XSS variant)."
                      }
                    ]
                  }
                }
              },
              "recordType": "advisory",
              "vulnId": "GCVE-1-2026-20279"
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
        "assignerShortName": "CIRCL",
        "cveId": "CVE-2026-100176",
        "datePublished": "2026-09-25T13:29:17.333Z",
        "dateReserved": "2026-09-25T13:29:14.017Z",
        "dateUpdated": "2026-09-25T14:59:28.644Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-100174 (GCVE-0-2026-100174)

    Vulnerability from nvd – Published: 2026-09-25 13:22 – Updated: 2026-09-25 15:14
    VLAI
    Title
    Stored Cross-Site Scripting (XSS) in AIL Framework Tag Selector via Unescaped Tag Names
    Summary
    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.
    SSVC
    Exploitation: none Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-09-25 15:14 UTC
    CWE
    • CWE-79 - Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
    • CWE-94 - Improper Control of Generation of Code ('Code Injection')
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: 0 , < 7.1 (semver)
    Create a notification for this product.
    GCVE extensions
    AI involvement GCVE-BCP-05-X-01
    Whole record AI-generated Not human-reviewed GNA-1

    Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.

    ai-computer-assisted:llm-generatedai-computer-assisted:classification
    Model Source Identifier
    qwen3.8:27b ollama qwen3.8:27b
    Patch provenance GCVE-BCP-05-X-02
    Generator
    patch2vuln.py on 2026-09-25 13:16
    Model
    qwen3.8:27b
    Input
    https://github.com/ail-project/ail-framework/commit/b2d0ed05f6cf79b2312a3f1f923d0d1a5d7a9edb.patch 2d147dabcc9b…
    Confidence
    medium
    Commit Subject Patch SHA-256
    b2d0ed05f6cf chg: [security] prevent stored XSS in 2d147dabcc9b…
    Fix summary

    The fix ensures that tag names and display values are rendered as plain text rather than as HTML when no custom renderer is explicitly configured. In the suggestion rendering path, the default (non-renderer) case now uses jQuery's .text() method, which HTML-escapes the content. In the selection rendering path, the default case uses document.createTextNode() to insert the value as a text node. Custom renderers, which are developer-supplied and trusted to produce safe HTML, continue to use .html() or .prepend() with raw HTML. The eval() call was also replaced with JSON.parse() to eliminate a code-injection vector.

    Patch summary

    In var/www/static/js/tags.js: (1) Replaced eval(data) with JSON.parse(data) for parsing array-like data strings. (2) In _renderComboItems, introduced a hasRenderer flag; when no custom renderer is set, the displayed value is inserted via resultItemEl.text(displayed) instead of the html property in the jQuery constructor. (3) In the selection rendering block, introduced a hasSelectionRenderer flag; when no custom selection renderer is set, the value is prepended as a text node via document.createTextNode(selectedItemHtml) instead of being set through the html property. (4) The comma separator for text-mode selections is now appended as a text node rather than concatenated into an HTML string.

    CVSS rationale

    AV:N: The vulnerability is exploitable over the network via a web application. AC:L: No race conditions or special timing are required; the payload is stored and triggers on page load. AT:N: No manipulation of the attack target is needed; the stored payload executes automatically. PR:L: The attacker needs a low-privilege authenticated account with permission to create custom tags. UI:P: The victim passively interacts by loading a page that contains the tag selector; no active click or download is required. VC:L: The XSS can read data from the victim's session and page context. VI:L: The XSS can modify page content and submit forms. VA:N: No availability impact is evident. SC:L: The compromised session can access other resources within the same origin. SI:L: The attacker can modify data through the victim's authenticated session. SA:N: No availability impact on subsequent components.

    Weakness rationale
    • CWE-79 The patch explicitly addresses stored XSS: user-controlled tag names were inserted into the DOM as HTML via jQuery's html property without escaping. The fix renders these values as text nodes, which is the canonical remediation for CWE-79. The commit subject line also explicitly states 'prevent stored XSS'.
    • CWE-94 The replacement of eval(data) with JSON.parse(data) addresses a secondary code-injection weakness where a crafted data string could execute arbitrary JavaScript. This is a contributing factor but the primary vulnerability is the stored XSS in tag rendering.
    Attack pattern rationale
    • CAPEC-66 CAPEC-66 describes the general XSS attack pattern where attacker-controlled input is reflected or stored and later rendered as executable content in a victim's browser. This patch fixes a stored XSS variant where malicious tag names are persisted and rendered as HTML. The mapping is direct and well-supported by the commit message and code changes. No more specific CAPEC entry for stored XSS in a tag/selector widget exists in the CAPEC catalog, making CAPEC-66 the closest and most appropriate match.
    Assumptions to verify
    • The affected version range is inferred from the tag_version_boundary metadata indicating the fix commit is 31 commits before the v7.1 tag; exact version boundaries are not explicitly stated in the patch.
    • The UI:P (Passive) rating assumes the victim only needs to load a page containing the tag selector; if the application requires the victim to explicitly open a specific dialog or widget, UI:A (Active) could be more appropriate.
    • The CAPEC-66 mapping is the closest available pattern; no CAPEC entry specifically covers stored XSS in a tag-selector UI component, so the general XSS pattern is used.
    • The PR:L rating assumes that creating a custom tag requires only a basic authenticated account; if tag creation requires elevated privileges, PR:H would be more appropriate.
    • The eval() to JSON.parse() change is treated as a secondary hardening fix within the same patch set; the primary vulnerability addressed is the stored XSS in tag rendering.
    • No specific reporter or finder is identified in the patch metadata or commit message; only the remediation developer (commit author) is credited.
    Model comparison

    Selected qwen3.8:27b by deterministic-consensus-v1
    The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required.

    Model Score Agreement Confidence Assumptions
    qwen3.8:27b 4 9 medium 6
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-100174",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-09-25T15:14:24.607198Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-09-25T15:14:51.969Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "modules": [
                "tag selector (tags.js)"
              ],
              "product": "ail framework",
              "programFiles": [
                "var/www/static/js/tags.js"
              ],
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThan": "7.1",
                  "status": "affected",
                  "version": "0",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Aurelien Thirion"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Jeroen Pinoy"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe 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., \u0026lt;img src=x onerror=alert(1)\u0026gt; or \u0026lt;svg onload=...\u0026gt;) 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\u0027s html property, causing the embedded script to execute in the victim\u0027s browser context.\u003c/p\u003e\u003cp\u003eThe 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\u0027s 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.\u003c/p\u003e\u003cp\u003ePreconditions: 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\u0027s stored tag. The attack is stored (persistent) and does not require the victim to perform any action beyond loading the page.\u003c/p\u003e\u003cp\u003eSecurity impact: successful exploitation allows arbitrary JavaScript execution in the victim\u0027s browser within the application\u0027s origin, potentially leading to session hijacking, unauthorized data access, form manipulation, or further client-side attacks.\u003c/p\u003e"
                }
              ],
              "value": "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., \u003cimg src=x onerror=alert(1)\u003e or \u003csvg onload=...\u003e) 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\u0027s html property, causing the embedded script to execute in the victim\u0027s browser context.\n\nThe 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\u0027s 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.\n\nPreconditions: 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\u0027s stored tag. The attack is stored (persistent) and does not require the victim to perform any action beyond loading the page.\n\nSecurity impact: successful exploitation allows arbitrary JavaScript execution in the victim\u0027s browser within the application\u0027s origin, potentially leading to session hijacking, unauthorized data access, form manipulation, or further client-side attacks."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-66",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-66 Cross Site Scripting (XSS)"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 5.1,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "LOW",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "LOW",
                "subIntegrityImpact": "LOW",
                "userInteraction": "PASSIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "LOW",
                "vulnIntegrityImpact": "LOW",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-79",
                  "description": "CWE-79 Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            },
            {
              "descriptions": [
                {
                  "cweId": "CWE-94",
                  "description": "CWE-94 Improper Control of Generation of Code (\u0027Code Injection\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-09-25T13:22:38.669Z",
            "orgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
            "shortName": "CIRCL"
          },
          "references": [
            {
              "name": "Security patch",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/b2d0ed05f6cf79b2312a3f1f923d0d1a5d7a9edb"
            }
          ],
          "solutions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe fix ensures that tag names and display values are rendered as plain text rather than as HTML when no custom renderer is explicitly configured. In the suggestion rendering path, the default (non-renderer) case now uses jQuery\u0027s .text() method, which HTML-escapes the content. In the selection rendering path, the default case uses document.createTextNode() to insert the value as a text node. Custom renderers, which are developer-supplied and trusted to produce safe HTML, continue to use .html() or .prepend() with raw HTML. The eval() call was also replaced with JSON.parse() to eliminate a code-injection vector.\u003c/p\u003e"
                }
              ],
              "value": "The fix ensures that tag names and display values are rendered as plain text rather than as HTML when no custom renderer is explicitly configured. In the suggestion rendering path, the default (non-renderer) case now uses jQuery\u0027s .text() method, which HTML-escapes the content. In the selection rendering path, the default case uses document.createTextNode() to insert the value as a text node. Custom renderers, which are developer-supplied and trusted to produce safe HTML, continue to use .html() or .prepend() with raw HTML. The eval() call was also replaced with JSON.parse() to eliminate a code-injection vector."
            }
          ],
          "title": "Stored Cross-Site Scripting (XSS) in AIL Framework Tag Selector via Unescaped Tag Names",
          "x_gcve": [
            {
              "extensions": {
                "bcp-05-x-01": {
                  "ai_annotations": [
                    {
                      "ai_level": "generated",
                      "description": "Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.",
                      "gna_source": 1,
                      "models": [
                        {
                          "gna_source": 1,
                          "identifier": "qwen3.8:27b",
                          "name": "qwen3.8:27b",
                          "source": "ollama"
                        }
                      ],
                      "review_status": "none",
                      "scope": "record",
                      "tags": [
                        "ai-computer-assisted:llm-generated",
                        "ai-computer-assisted:classification"
                      ]
                    }
                  ]
                },
                "bcp-05-x-02": {
                  "x_patch2vuln": {
                    "assumptions": [
                      "The affected version range is inferred from the tag_version_boundary metadata indicating the fix commit is 31 commits before the v7.1 tag; exact version boundaries are not explicitly stated in the patch.",
                      "The UI:P (Passive) rating assumes the victim only needs to load a page containing the tag selector; if the application requires the victim to explicitly open a specific dialog or widget, UI:A (Active) could be more appropriate.",
                      "The CAPEC-66 mapping is the closest available pattern; no CAPEC entry specifically covers stored XSS in a tag-selector UI component, so the general XSS pattern is used.",
                      "The PR:L rating assumes that creating a custom tag requires only a basic authenticated account; if tag creation requires elevated privileges, PR:H would be more appropriate.",
                      "The eval() to JSON.parse() change is treated as a secondary hardening fix within the same patch set; the primary vulnerability addressed is the stored XSS in tag rendering.",
                      "No specific reporter or finder is identified in the patch metadata or commit message; only the remediation developer (commit author) is credited."
                    ],
                    "capecRationale": [
                      {
                        "capecId": "CAPEC-66",
                        "rationale": "CAPEC-66 describes the general XSS attack pattern where attacker-controlled input is reflected or stored and later rendered as executable content in a victim\u0027s browser. This patch fixes a stored XSS variant where malicious tag names are persisted and rendered as HTML. The mapping is direct and well-supported by the commit message and code changes. No more specific CAPEC entry for stored XSS in a tag/selector widget exists in the CAPEC catalog, making CAPEC-66 the closest and most appropriate match."
                      }
                    ],
                    "commit": "b2d0ed05f6cf79b2312a3f1f923d0d1a5d7a9edb",
                    "confidence": "medium",
                    "credits": [
                      {
                        "lang": "en",
                        "type": "remediation developer",
                        "value": "terrtia"
                      }
                    ],
                    "cvssRationale": "AV:N: The vulnerability is exploitable over the network via a web application. AC:L: No race conditions or special timing are required; the payload is stored and triggers on page load. AT:N: No manipulation of the attack target is needed; the stored payload executes automatically. PR:L: The attacker needs a low-privilege authenticated account with permission to create custom tags. UI:P: The victim passively interacts by loading a page that contains the tag selector; no active click or download is required. VC:L: The XSS can read data from the victim\u0027s session and page context. VI:L: The XSS can modify page content and submit forms. VA:N: No availability impact is evident. SC:L: The compromised session can access other resources within the same origin. SI:L: The attacker can modify data through the victim\u0027s authenticated session. SA:N: No availability impact on subsequent components.",
                    "fixSummary": "The fix ensures that tag names and display values are rendered as plain text rather than as HTML when no custom renderer is explicitly configured. In the suggestion rendering path, the default (non-renderer) case now uses jQuery\u0027s .text() method, which HTML-escapes the content. In the selection rendering path, the default case uses document.createTextNode() to insert the value as a text node. Custom renderers, which are developer-supplied and trusted to produce safe HTML, continue to use .html() or .prepend() with raw HTML. The eval() call was also replaced with JSON.parse() to eliminate a code-injection vector.",
                    "generatedAt": "2026-09-25T13:16:06.156442Z",
                    "generator": "patch2vuln.py",
                    "model": "qwen3.8:27b",
                    "modelComparison": {
                      "rankings": [
                        {
                          "agreementScore": 9,
                          "assumptionCount": 6,
                          "confidence": "medium",
                          "model": "qwen3.8:27b",
                          "score": 4
                        }
                      ],
                      "selectedModel": "qwen3.8:27b",
                      "selectionMethod": "deterministic-consensus-v1",
                      "selectionNotice": "The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required."
                    },
                    "patchSha256": "2d147dabcc9bebce7722917d80f13e49a10f9a2a4089ec6207cce9edb9187f77",
                    "patchSummary": "In var/www/static/js/tags.js: (1) Replaced eval(data) with JSON.parse(data) for parsing array-like data strings. (2) In _renderComboItems, introduced a hasRenderer flag; when no custom renderer is set, the displayed value is inserted via resultItemEl.text(displayed) instead of the html property in the jQuery constructor. (3) In the selection rendering block, introduced a hasSelectionRenderer flag; when no custom selection renderer is set, the value is prepended as a text node via document.createTextNode(selectedItemHtml) instead of being set through the html property. (4) The comma separator for text-mode selections is now appended as a text node rather than concatenated into an HTML string.",
                    "patchTruncated": false,
                    "patches": [
                      {
                        "commit": "b2d0ed05f6cf79b2312a3f1f923d0d1a5d7a9edb",
                        "patchSha256": "2d147dabcc9bebce7722917d80f13e49a10f9a2a4089ec6207cce9edb9187f77",
                        "source": "https://github.com/ail-project/ail-framework/commit/b2d0ed05f6cf79b2312a3f1f923d0d1a5d7a9edb.patch",
                        "sourceUrl": "https://github.com/ail-project/ail-framework/commit/b2d0ed05f6cf79b2312a3f1f923d0d1a5d7a9edb.patch",
                        "subject": "chg: [security] prevent stored XSS in"
                      }
                    ],
                    "source": "https://github.com/ail-project/ail-framework/commit/b2d0ed05f6cf79b2312a3f1f923d0d1a5d7a9edb.patch",
                    "subject": "chg: [security] prevent stored XSS in",
                    "tagVersionBoundary": {
                      "commits_after_fix": 31,
                      "repository": "https://github.com/ail-project/ail-framework",
                      "tag": "v7.1",
                      "version": "7.1",
                      "version_type": "custom"
                    },
                    "weaknessRationale": [
                      {
                        "cweId": "CWE-79",
                        "rationale": "The patch explicitly addresses stored XSS: user-controlled tag names were inserted into the DOM as HTML via jQuery\u0027s html property without escaping. The fix renders these values as text nodes, which is the canonical remediation for CWE-79. The commit subject line also explicitly states \u0027prevent stored XSS\u0027."
                      },
                      {
                        "cweId": "CWE-94",
                        "rationale": "The replacement of eval(data) with JSON.parse(data) addresses a secondary code-injection weakness where a crafted data string could execute arbitrary JavaScript. This is a contributing factor but the primary vulnerability is the stored XSS in tag rendering."
                      }
                    ]
                  }
                }
              },
              "recordType": "advisory",
              "vulnId": "GCVE-1-2026-20269"
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
        "assignerShortName": "CIRCL",
        "cveId": "CVE-2026-100174",
        "datePublished": "2026-09-25T13:22:38.669Z",
        "dateReserved": "2026-09-25T13:22:15.197Z",
        "dateUpdated": "2026-09-25T15:14:51.969Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-100172 (GCVE-0-2026-100172)

    Vulnerability from nvd – Published: 2026-09-25 13:13 – Updated: 2026-09-25 15:19
    VLAI
    Title
    Stored XSS in AIL Framework extracted-match popovers via unescaped dynamic values in HTML-enabled data-content attributes
    Summary
    The AIL Framework (ail-project/ail-framework) contains a stored cross-site scripting (XSS) vulnerability in two Jinja2 templates that render popovers for matched, tracked, or tagged content: var/www/templates/chats_explorer/block_message.html and var/www/templates/objects/item/show_item.html. In both templates, dynamic values associated with this content, including icon color, icon style, icon glyph, subtype, identifier, name, description, and matched value, are interpolated directly into the data-content HTML attribute of Bootstrap popover elements without appropriate output encoding. Because the popovers are configured with data-html="true", the content is interpreted as HTML in the victim's browser. An authenticated attacker who can influence matched, tracked, or tagged content may inject arbitrary HTML or JavaScript into these values. When a victim displays the affected popover, the injected markup may execute in the victim's session, potentially enabling data exfiltration or actions with the victim's privileges. The vulnerability is classified as stored XSS because the malicious payload can persist in the affected match, tracking, or tag-related data and be delivered to users who view the affected content.
    SSVC
    Exploitation: none Automatable: no Technical Impact: total
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-09-25 15:15 UTC
    CWE
    • CWE-79 - Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: unspecified , < 7.1 (semver)
    Create a notification for this product.
    GCVE extensions
    AI involvement GCVE-BCP-05-X-01
    Whole record AI-generated Not human-reviewed GNA-1

    Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.

    ai-computer-assisted:llm-generatedai-computer-assisted:classification
    Model Source Identifier
    qwen3.8:27b ollama qwen3.8:27b
    Patch provenance GCVE-BCP-05-X-02
    Generator
    patch2vuln.py on 2026-09-25 12:56
    Model
    qwen3.8:27b
    Input
    https://github.com/ail-project/ail-framework/commit/ee63a0a96646790255e038f5ca5dd0ab5fe98db2.patch bd188338f882…
    Confidence
    medium
    Commit Subject Patch SHA-256
    ee63a0a96646 chg: [security] fix XSS in show item and message popover of bd188338f882…
    Fix summary

    The fix applies double HTML-escaping (Jinja2 forceescape|forceescape) to every dynamic value interpolated into the HTML-enabled data-content attribute of the popover elements in both templates. Double-escaping is required because the values must survive both the outer HTML attribute context and the inner HTML parsing performed by the popover plugin. This neutralizes any HTML or script injection from the extracted-match fields.

    Patch summary

    In block_message.html and show_item.html, the Jinja2 expressions for extracted_matches fields (icon color, icon style, icon, subtype, id, name, description) and the matched value r[1] are each suffixed with |forceescape|forceescape. No other logic, routing, or configuration changes are made. Two lines changed in total (one per file).

    CVSS rationale

    AV:N: web application reachable over the network. AC:L: crafting a message or item with a malicious extracted-match value requires no special race or timing. AT:N: no manipulation of the attack target is needed. PR:L: the attacker must be an authenticated user capable of creating or modifying chat messages or items. UI:P: the victim must passively interact (hover over the element) to trigger the popover rendering; no click or explicit action is required. VC:H: the injected script can read session cookies, DOM data, and API responses in the victim's browser. VI:H: the script can perform authenticated actions on behalf of the victim (create, modify, delete data). VA:N: no direct denial-of-service impact is evident. SC/SI/SA:N: the subcomponent (the AIL Framework server) is not directly compromised; the impact is confined to the victim's browser session.

    Weakness rationale
    • CWE-79 Dynamic values from extracted-match data are interpolated into an HTML-enabled attribute without output encoding, allowing script injection. The fix adds forceescape, confirming the root cause is missing output encoding in an HTML context. CWE-79 is the precise weakness.
    Attack pattern rationale
    • CAPEC-1 The patch directly addresses stored XSS: attacker-controlled content is persisted in application data (chat messages, items) and rendered as executable HTML in a victim's browser via an unescaped data-content attribute. CAPEC-1 is the canonical attack pattern for XSS and is the closest match. No uncertainty in this mapping.
    Assumptions to verify
    • The AIL Framework requires authenticated access to create or modify chat messages and items; PR:L is assumed based on the application being a threat-intelligence platform with user accounts.
    • The extracted-match data (icon color, style, subtype, id, name, description) can be influenced by an authenticated user through normal application workflows (e.g., submitting content that the extraction pipeline processes).
    • The popover is triggered on hover (data-trigger="hover"), classified as passive user interaction (UI:P).
    • The tag v7.1 boundary with 143 commits after the fix suggests the fix landed before v7.1, but exact affected version ranges are not confirmed by the patch alone.
    • CAPEC-1 is selected as the closest standard attack pattern; no more specific CAPEC for stored XSS in HTML attributes exists in the CAPEC catalog.
    Model comparison

    Selected qwen3.8:27b by deterministic-consensus-v1
    The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required.

    Model Score Agreement Confidence Assumptions
    qwen3.8:27b 5 9 medium 5
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-100172",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "total"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-09-25T15:15:12.313075Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-09-25T15:19:12.598Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "modules": [
                "chats_explorer (block_message.html)",
                "objects/item (show_item.html)"
              ],
              "product": "ail framework",
              "programFiles": [
                "var/www/templates/chats_explorer/block_message.html",
                "var/www/templates/objects/item/show_item.html"
              ],
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThan": "7.1",
                  "status": "affected",
                  "version": "unspecified",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Aurelien Thirion"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Jeroen Pinoy"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe AIL Framework (ail-project/ail-framework) contains a stored cross-site scripting (XSS) vulnerability in two Jinja2 templates that render popovers for matched, tracked, or tagged content: var/www/templates/chats_explorer/block_message.html and var/www/templates/objects/item/show_item.html. In both templates, dynamic values associated with this content, including icon color, icon style, icon glyph, subtype, identifier, name, description, and matched value, are interpolated directly into the data-content HTML attribute of Bootstrap popover elements without appropriate output encoding. Because the popovers are configured with data-html=\"true\", the content is interpreted as HTML in the victim\u0027s browser. An authenticated attacker who can influence matched, tracked, or tagged content may inject arbitrary HTML or JavaScript into these values. When a victim displays the affected popover, the injected markup may execute in the victim\u0027s session, potentially enabling data exfiltration or actions with the victim\u0027s privileges. The vulnerability is classified as stored XSS because the malicious payload can persist in the affected match, tracking, or tag-related data and be delivered to users who view the affected content.\u003c/p\u003e"
                }
              ],
              "value": "The AIL Framework (ail-project/ail-framework) contains a stored cross-site scripting (XSS) vulnerability in two Jinja2 templates that render popovers for matched, tracked, or tagged content: var/www/templates/chats_explorer/block_message.html and var/www/templates/objects/item/show_item.html. In both templates, dynamic values associated with this content, including icon color, icon style, icon glyph, subtype, identifier, name, description, and matched value, are interpolated directly into the data-content HTML attribute of Bootstrap popover elements without appropriate output encoding. Because the popovers are configured with data-html=\"true\", the content is interpreted as HTML in the victim\u0027s browser. An authenticated attacker who can influence matched, tracked, or tagged content may inject arbitrary HTML or JavaScript into these values. When a victim displays the affected popover, the injected markup may execute in the victim\u0027s session, potentially enabling data exfiltration or actions with the victim\u0027s privileges. The vulnerability is classified as stored XSS because the malicious payload can persist in the affected match, tracking, or tag-related data and be delivered to users who view the affected content."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-1",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-1 Cross Site Scripting (XSS)"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 8.5,
                "baseSeverity": "HIGH",
                "privilegesRequired": "LOW",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "PASSIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "HIGH",
                "vulnIntegrityImpact": "HIGH",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-79",
                  "description": "CWE-79 Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-09-25T13:13:56.996Z",
            "orgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
            "shortName": "CIRCL"
          },
          "references": [
            {
              "name": "Security patch",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/ee63a0a96646790255e038f5ca5dd0ab5fe98db2"
            }
          ],
          "solutions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe fix applies double HTML-escaping (Jinja2 forceescape|forceescape) to every dynamic value interpolated into the HTML-enabled data-content attribute of the popover elements in both templates. Double-escaping is required because the values must survive both the outer HTML attribute context and the inner HTML parsing performed by the popover plugin. This neutralizes any HTML or script injection from the extracted-match fields.\u003c/p\u003e"
                }
              ],
              "value": "The fix applies double HTML-escaping (Jinja2 forceescape|forceescape) to every dynamic value interpolated into the HTML-enabled data-content attribute of the popover elements in both templates. Double-escaping is required because the values must survive both the outer HTML attribute context and the inner HTML parsing performed by the popover plugin. This neutralizes any HTML or script injection from the extracted-match fields."
            }
          ],
          "title": "Stored XSS in AIL Framework extracted-match popovers via unescaped dynamic values in HTML-enabled data-content attributes",
          "x_gcve": [
            {
              "extensions": {
                "bcp-05-x-01": {
                  "ai_annotations": [
                    {
                      "ai_level": "generated",
                      "description": "Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.",
                      "gna_source": 1,
                      "models": [
                        {
                          "gna_source": 1,
                          "identifier": "qwen3.8:27b",
                          "name": "qwen3.8:27b",
                          "source": "ollama"
                        }
                      ],
                      "review_status": "none",
                      "scope": "record",
                      "tags": [
                        "ai-computer-assisted:llm-generated",
                        "ai-computer-assisted:classification"
                      ]
                    }
                  ]
                },
                "bcp-05-x-02": {
                  "x_patch2vuln": {
                    "assumptions": [
                      "The AIL Framework requires authenticated access to create or modify chat messages and items; PR:L is assumed based on the application being a threat-intelligence platform with user accounts.",
                      "The extracted-match data (icon color, style, subtype, id, name, description) can be influenced by an authenticated user through normal application workflows (e.g., submitting content that the extraction pipeline processes).",
                      "The popover is triggered on hover (data-trigger=\"hover\"), classified as passive user interaction (UI:P).",
                      "The tag v7.1 boundary with 143 commits after the fix suggests the fix landed before v7.1, but exact affected version ranges are not confirmed by the patch alone.",
                      "CAPEC-1 is selected as the closest standard attack pattern; no more specific CAPEC for stored XSS in HTML attributes exists in the CAPEC catalog."
                    ],
                    "capecRationale": [
                      {
                        "capecId": "CAPEC-1",
                        "rationale": "The patch directly addresses stored XSS: attacker-controlled content is persisted in application data (chat messages, items) and rendered as executable HTML in a victim\u0027s browser via an unescaped data-content attribute. CAPEC-1 is the canonical attack pattern for XSS and is the closest match. No uncertainty in this mapping."
                      }
                    ],
                    "commit": "ee63a0a96646790255e038f5ca5dd0ab5fe98db2",
                    "confidence": "medium",
                    "credits": [
                      {
                        "lang": "en",
                        "type": "remediation developer",
                        "value": "terrtia"
                      }
                    ],
                    "cvssRationale": "AV:N: web application reachable over the network. AC:L: crafting a message or item with a malicious extracted-match value requires no special race or timing. AT:N: no manipulation of the attack target is needed. PR:L: the attacker must be an authenticated user capable of creating or modifying chat messages or items. UI:P: the victim must passively interact (hover over the element) to trigger the popover rendering; no click or explicit action is required. VC:H: the injected script can read session cookies, DOM data, and API responses in the victim\u0027s browser. VI:H: the script can perform authenticated actions on behalf of the victim (create, modify, delete data). VA:N: no direct denial-of-service impact is evident. SC/SI/SA:N: the subcomponent (the AIL Framework server) is not directly compromised; the impact is confined to the victim\u0027s browser session.",
                    "fixSummary": "The fix applies double HTML-escaping (Jinja2 forceescape|forceescape) to every dynamic value interpolated into the HTML-enabled data-content attribute of the popover elements in both templates. Double-escaping is required because the values must survive both the outer HTML attribute context and the inner HTML parsing performed by the popover plugin. This neutralizes any HTML or script injection from the extracted-match fields.",
                    "generatedAt": "2026-09-25T12:56:24.137641Z",
                    "generator": "patch2vuln.py",
                    "model": "qwen3.8:27b",
                    "modelComparison": {
                      "rankings": [
                        {
                          "agreementScore": 9,
                          "assumptionCount": 5,
                          "confidence": "medium",
                          "model": "qwen3.8:27b",
                          "score": 5
                        }
                      ],
                      "selectedModel": "qwen3.8:27b",
                      "selectionMethod": "deterministic-consensus-v1",
                      "selectionNotice": "The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required."
                    },
                    "patchSha256": "bd188338f8828ab59743776228d2991b51a3f83b870dedf073a54c6139ad9e26",
                    "patchSummary": "In block_message.html and show_item.html, the Jinja2 expressions for extracted_matches fields (icon color, icon style, icon, subtype, id, name, description) and the matched value r[1] are each suffixed with |forceescape|forceescape. No other logic, routing, or configuration changes are made. Two lines changed in total (one per file).",
                    "patchTruncated": false,
                    "patches": [
                      {
                        "commit": "ee63a0a96646790255e038f5ca5dd0ab5fe98db2",
                        "patchSha256": "bd188338f8828ab59743776228d2991b51a3f83b870dedf073a54c6139ad9e26",
                        "source": "https://github.com/ail-project/ail-framework/commit/ee63a0a96646790255e038f5ca5dd0ab5fe98db2.patch",
                        "sourceUrl": "https://github.com/ail-project/ail-framework/commit/ee63a0a96646790255e038f5ca5dd0ab5fe98db2.patch",
                        "subject": "chg: [security] fix XSS in show item and message popover of"
                      }
                    ],
                    "source": "https://github.com/ail-project/ail-framework/commit/ee63a0a96646790255e038f5ca5dd0ab5fe98db2.patch",
                    "subject": "chg: [security] fix XSS in show item and message popover of",
                    "tagVersionBoundary": {
                      "commits_after_fix": 143,
                      "repository": "https://github.com/ail-project/ail-framework",
                      "tag": "v7.1",
                      "version": "7.1",
                      "version_type": "custom"
                    },
                    "weaknessRationale": [
                      {
                        "cweId": "CWE-79",
                        "rationale": "Dynamic values from extracted-match data are interpolated into an HTML-enabled attribute without output encoding, allowing script injection. The fix adds forceescape, confirming the root cause is missing output encoding in an HTML context. CWE-79 is the precise weakness."
                      }
                    ]
                  }
                }
              },
              "recordType": "advisory",
              "vulnId": "GCVE-1-2026-20239"
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
        "assignerShortName": "CIRCL",
        "cveId": "CVE-2026-100172",
        "datePublished": "2026-09-25T13:13:56.996Z",
        "dateReserved": "2026-09-25T13:13:52.747Z",
        "dateUpdated": "2026-09-25T15:19:12.598Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-56450 (GCVE-0-2026-56450)

    Vulnerability from nvd – Published: 2026-06-22 13:02 – Updated: 2026-06-22 15:48
    VLAI
    Title
    AIL Framework - Missing Rate Limiting Enables Brute-Force Attacks Against Two-Factor Authentication Codes
    Summary
    AIL did not restrict repeated failed attempts to verify a two-factor authentication (OTP) code. An attacker who had reached the 2FA verification step, such as after successfully completing the password-authentication stage, could submit an unlimited number of OTP guesses. This could enable brute-force guessing of a valid code and bypass the intended second authentication factor, resulting in unauthorized account access. The patch introduces per-user failed-OTP tracking, blocks verification after 30 failed attempts for one hour, clears the counter after a successful OTP verification, and provides administrator recovery actions to purge affected lockouts.
    SSVC
    Exploitation: none Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-06-22 15:48 UTC
    CWE
    • CWE-307 - Improper Restriction of Excessive Authentication Attempts
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: 0 , ≤ 6.8.0 (semver)
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-56450",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-06-22T15:48:34.062796Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-06-22T15:48:49.228Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "defaultStatus": "unaffected",
              "product": "ail framework",
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThanOrEqual": "6.8.0",
                  "status": "affected",
                  "version": "0",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Aurelien Thirion"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Stephen O"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eAIL did not restrict repeated failed attempts to verify a two-factor authentication (OTP) code. An attacker who had reached the 2FA verification step, such as after successfully completing the password-authentication stage, could submit an unlimited number of OTP guesses. This could enable brute-force guessing of a valid code and bypass the intended second authentication factor, resulting in unauthorized account access.\u003c/p\u003e\n\u003cp\u003eThe patch introduces per-user failed-OTP tracking, blocks verification after 30 failed attempts for one hour, clears the counter after a successful OTP verification, and provides administrator recovery actions to purge affected lockouts.\u003c/p\u003e\u003cbr\u003e"
                }
              ],
              "value": "AIL did not restrict repeated failed attempts to verify a two-factor authentication (OTP) code. An attacker who had reached the 2FA verification step, such as after successfully completing the password-authentication stage, could submit an unlimited number of OTP guesses. This could enable brute-force guessing of a valid code and bypass the intended second authentication factor, resulting in unauthorized account access.\n\n\nThe patch introduces per-user failed-OTP tracking, blocks verification after 30 failed attempts for one hour, clears the counter after a successful OTP verification, and provides administrator recovery actions to purge affected lockouts."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-112",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-112 Brute Force"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 5.1,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "ACTIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "LOW",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-307",
                  "description": "CWE-307 Improper Restriction of Excessive Authentication Attempts",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-06-22T13:02:30.320Z",
            "orgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
            "shortName": "CIRCL"
          },
          "references": [
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/d3a394fe68fd5aeee86f3a3c91d4a0350f91e974"
            }
          ],
          "source": {
            "discovery": "UNKNOWN"
          },
          "title": "AIL Framework - Missing Rate Limiting Enables Brute-Force Attacks Against Two-Factor Authentication Codes",
          "x_generator": {
            "engine": "Vulnogram 0.2.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
        "assignerShortName": "CIRCL",
        "cveId": "CVE-2026-56450",
        "datePublished": "2026-06-22T13:02:30.320Z",
        "dateReserved": "2026-06-22T13:02:27.234Z",
        "dateUpdated": "2026-06-22T15:48:49.228Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-56448 (GCVE-0-2026-56448)

    Vulnerability from nvd – Published: 2026-06-22 12:54 – Updated: 2026-06-22 15:48
    VLAI
    Title
    Authenticated Path Traversal in AIL Framework Investigation Downloads Allows Arbitrary File Read
    Summary
    A path traversal vulnerability exists in AIL Framework before the release containing commit 0041456af25da0cdea1c1c4624e46baff2731d8f. An authenticated AIL user can supply crafted object identifiers through the investigation workflow to cause file paths to resolve outside the intended image, favicon, or screenshot storage directories. This may allow the attacker to download and read arbitrary files that are accessible to the AIL process. The issue occurs because user-controlled path components were joined with application storage paths without verifying that the resolved path remained within the expected directory. The affected download functionality could then include the contents of such files in a generated archive.
    SSVC
    Exploitation: none Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-06-22 15:47 UTC
    CWE
    • CWE-22 - Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: 0 , ≤ 6.8.0 (semver)
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-56448",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-06-22T15:47:56.194887Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-06-22T15:48:10.172Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "defaultStatus": "unaffected",
              "product": "ail framework",
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThanOrEqual": "6.8.0",
                  "status": "affected",
                  "version": "0",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Aurelien Thirion"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Stephen O"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Tom\u00e1s Illuminati"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eA path traversal vulnerability exists in AIL Framework before the release containing commit \u003ccode\u003e0041456af25da0cdea1c1c4624e46baff2731d8f\u003c/code\u003e. An authenticated AIL user can supply crafted object identifiers through the investigation workflow to cause file paths to resolve outside the intended image, favicon, or screenshot storage directories. This may allow the attacker to download and read arbitrary files that are accessible to the AIL process.\u003c/p\u003e\u003cp\u003eThe issue occurs because user-controlled path components were joined with application storage paths without verifying that the resolved path remained within the expected directory. The affected download functionality could then include the contents of such files in a generated archive.\u003c/p\u003e\u003cbr\u003e"
                }
              ],
              "value": "A path traversal vulnerability exists in AIL Framework before the release containing commit 0041456af25da0cdea1c1c4624e46baff2731d8f. An authenticated AIL user can supply crafted object identifiers through the investigation workflow to cause file paths to resolve outside the intended image, favicon, or screenshot storage directories. This may allow the attacker to download and read arbitrary files that are accessible to the AIL process.\n\nThe issue occurs because user-controlled path components were joined with application storage paths without verifying that the resolved path remained within the expected directory. The affected download functionality could then include the contents of such files in a generated archive."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-126",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-126 Path Traversal"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "PRESENT",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 8.3,
                "baseSeverity": "HIGH",
                "privilegesRequired": "LOW",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "HIGH",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N/S:P",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "HIGH",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-22",
                  "description": "CWE-22 Improper Limitation of a Pathname to a Restricted Directory (\u0027Path Traversal\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-06-22T12:54:42.423Z",
            "orgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
            "shortName": "CIRCL"
          },
          "references": [
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/0041456af25da0cdea1c1c4624e46baff2731d8f"
            }
          ],
          "source": {
            "discovery": "UNKNOWN"
          },
          "title": "Authenticated Path Traversal in AIL Framework Investigation Downloads Allows Arbitrary File Read",
          "x_generator": {
            "engine": "Vulnogram 0.2.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
        "assignerShortName": "CIRCL",
        "cveId": "CVE-2026-56448",
        "datePublished": "2026-06-22T12:54:42.423Z",
        "dateReserved": "2026-06-22T12:54:39.454Z",
        "dateUpdated": "2026-06-22T15:48:10.172Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-100190 (GCVE-0-2026-100190)

    Vulnerability from cvelistv5 – Published: 2026-09-25 13:52 – Updated: 2026-09-25 16:13
    VLAI
    Title
    Stored Cross-Site Scripting (XSS) via Crawler Capture Import in AIL Framework showDomain Page
    Summary
    The AIL Framework crawler splash domain page (showDomain.html) is vulnerable to stored cross-site script injection (XSS). User-supplied data originating from imported crawler captures—specifically item IDs, URLs, and screenshot file paths—was interpolated directly into inline JavaScript contexts within the HTML template. This included an onclick attribute that embedded raw screenshot and URL values into a JavaScript function call, and an inline script block that assigned a screenshot value to a JavaScript variable without escaping. An attacker with a user-role API client could craft a malicious crawler capture import containing JavaScript payloads in these fields. When any user (including privileged users) subsequently viewed the affected domain page, the injected script would execute in the victim's browser context, potentially allowing session hijacking, data exfiltration, or unauthorized actions on behalf of the victim. The vulnerability is stored in the application's data layer and triggered upon page rendering, requiring no further interaction beyond loading the domain view.
    SSVC
    Exploitation: none Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-09-25 16:13 UTC
    CWE
    • CWE-79 - Improper Neutralization of Input in Web Page ('Cross-site Scripting')
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: unspecified , < 7.1 (semver)
    Create a notification for this product.
    GCVE extensions
    AI involvement GCVE-BCP-05-X-01
    Whole record AI-generated Human-reviewed GNA-1

    Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model.

    ai-computer-assisted:llm-generatedai-computer-assisted:classification
    Model Source Identifier
    qwen3.8:27b ollama qwen3.8:27b
    Patch provenance GCVE-BCP-05-X-02
    Generator
    patch2vuln.py on 2026-09-25 13:45
    Model
    qwen3.8:27b
    Input
    https://github.com/ail-project/ail-framework/commit/31376ee3d04519c898bb9b3671453a41c4117340.patch c110d16dd8ee…
    Confidence
    medium
    Commit Subject Patch SHA-256
    31376ee3d045 chg: [security] prevent stored XSS through imported capture c110d16dd8ee…
    Fix summary

    The fix removes all capture-derived values (item IDs, URLs, screenshot paths) from inline JavaScript contexts (onclick attributes and inline script variable assignments). These values are now stored in HTML data attributes (data-screenshot, data-url, data-item-id), which are properly HTML-escaped by the Jinja2 template engine. Screenshot click handlers are bound programmatically via addEventListener on elements with a .reload-image class, and the reload_image function reads values from the DOM element's dataset rather than receiving raw string parameters. Additionally, item IDs are URL-encoded with encodeURIComponent before being appended to link hrefs, preventing injection through the ID field.

    Patch summary

    In showDomain.html: (1) Replaced inline onclick="reload_image('...')" with a data-attribute-based approach using data-screenshot, data-url, and data-item-id attributes on the table cell element, plus a .reload-image CSS class. (2) Removed the inline script block that assigned screenshot, URL, and ID values directly into JavaScript variables via Jinja2 interpolation; replaced with dataset reads from the domain_screenshot img element. (3) Changed reload_image() to accept a DOM element and read values from element.dataset instead of raw string arguments. (4) Added a programmatic event binding loop using document.querySelectorAll('.reload-image').forEach() with addEventListener('click'). (5) Applied encodeURIComponent() to item IDs when constructing screenshot link hrefs. (6) Changed the href URL construction to use url_for with keyword arguments instead of string interpolation.

    CVSS rationale

    AV:N: Exploitable over the network via the web application. AC:L: No special race conditions or complex setup; a crafted capture import suffices. AT:N: No manipulation of the attack target required. PR:L: Requires a user-role API client to import a malicious crawler capture (authenticated, low privilege). UI:P: The stored XSS in the inline script block executes passively when the victim loads the domain page; no click or active interaction is needed for the inline script vector. VC:N/VI:N/VA:N: The vulnerable component (server-side application) is not directly compromised in confidentiality, integrity, or availability. SC:H: Scope changes to the victim's browser session, enabling theft of session tokens, cookies, and sensitive data. SI:H: Scope integrity is impacted as the attacker can perform arbitrary actions in the victim's authenticated session. SA:N: No meaningful impact on the availability of the attacker's scope.

    Weakness rationale
    • CWE-79 The patch explicitly addresses stored XSS by removing user-controlled values (screenshot paths, URLs, item IDs from crawler capture imports) from inline JavaScript contexts and replacing them with properly escaped data attributes and programmatic event binding. The commit message confirms the intent: 'prevent stored XSS through imported capture metadata in showDomain.'
    Attack pattern rationale
    • CAPEC-1 The patch directly remediates a stored XSS vector where attacker-controlled data from a crawler capture import is reflected into inline JavaScript without neutralization. CAPEC-1 is the canonical attack pattern for XSS. The specific sub-variant is stored (persistent) XSS via a data import mechanism, but CAPEC-1 is the closest and most appropriate mapping available in the CAPEC catalog.
    Assumptions to verify
    • The UI:P (Passive) rating assumes the inline script vector (screenshot variable assignment) executes on page load without requiring a user click. The onclick vector would require UI:A, but the inline script vector is sufficient for exploitation.
    • PR:L assumes the attacker needs a user-role API client to import a crafted crawler capture, as stated in the commit message. The exact privilege level and authentication mechanism are not further specified in the patch.
    • The version boundary 'less_than 7.1' is inferred from the tag_version_boundary metadata showing 21 commits after the fix before the v7.1 tag, suggesting the fix is included in v7.1. Exact affected version ranges are not confirmed.
    • CAPEC-1 is selected as the closest available attack pattern for stored XSS; no more specific CAPEC for stored XSS via data import exists in the catalog.
    • The patch does not include test cases or additional context about whether other template files have similar inline JavaScript interpolation patterns; this advisory covers only the single file in the patch.
    Model comparison

    Selected qwen3.8:27b by deterministic-consensus-v1
    The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required.

    Model Score Agreement Confidence Assumptions
    qwen3.8:27b 5 9 medium 5
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-100190",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-09-25T16:13:08.012327Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-09-25T16:13:26.973Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "defaultStatus": "unaffected",
              "modules": [
                "crawler/crawler_splash"
              ],
              "product": "ail framework",
              "programFiles": [
                "var/www/templates/crawler/crawler_splash/showDomain.html"
              ],
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThan": "7.1",
                  "status": "affected",
                  "version": "unspecified",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Aurelien Thirion"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Jeroen Pinoy"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe AIL Framework crawler splash domain page (showDomain.html) is vulnerable to stored cross-site script injection (XSS). User-supplied data originating from imported crawler captures\u2014specifically item IDs, URLs, and screenshot file paths\u2014was interpolated directly into inline JavaScript contexts within the HTML template. This included an onclick attribute that embedded raw screenshot and URL values into a JavaScript function call, and an inline script block that assigned a screenshot value to a JavaScript variable without escaping. An attacker with a user-role API client could craft a malicious crawler capture import containing JavaScript payloads in these fields. When any user (including privileged users) subsequently viewed the affected domain page, the injected script would execute in the victim\u0027s browser context, potentially allowing session hijacking, data exfiltration, or unauthorized actions on behalf of the victim. The vulnerability is stored in the application\u0027s data layer and triggered upon page rendering, requiring no further interaction beyond loading the domain view.\u003c/p\u003e"
                }
              ],
              "value": "The AIL Framework crawler splash domain page (showDomain.html) is vulnerable to stored cross-site script injection (XSS). User-supplied data originating from imported crawler captures\u2014specifically item IDs, URLs, and screenshot file paths\u2014was interpolated directly into inline JavaScript contexts within the HTML template. This included an onclick attribute that embedded raw screenshot and URL values into a JavaScript function call, and an inline script block that assigned a screenshot value to a JavaScript variable without escaping. An attacker with a user-role API client could craft a malicious crawler capture import containing JavaScript payloads in these fields. When any user (including privileged users) subsequently viewed the affected domain page, the injected script would execute in the victim\u0027s browser context, potentially allowing session hijacking, data exfiltration, or unauthorized actions on behalf of the victim. The vulnerability is stored in the application\u0027s data layer and triggered upon page rendering, requiring no further interaction beyond loading the domain view."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-1",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-1 Cross Site Scripting (XSS)"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 6.3,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "LOW",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "HIGH",
                "subIntegrityImpact": "HIGH",
                "userInteraction": "PASSIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:N/VI:N/VA:N/SC:H/SI:H/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-79",
                  "description": "CWE-79 Improper Neutralization of Input in Web Page (\u0027Cross-site Scripting\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-09-25T13:52:19.648Z",
            "orgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
            "shortName": "CIRCL"
          },
          "references": [
            {
              "name": "Security patch",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/31376ee3d04519c898bb9b3671453a41c4117340"
            }
          ],
          "solutions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe fix removes all capture-derived values (item IDs, URLs, screenshot paths) from inline JavaScript contexts (onclick attributes and inline script variable assignments). These values are now stored in HTML data attributes (data-screenshot, data-url, data-item-id), which are properly HTML-escaped by the Jinja2 template engine. Screenshot click handlers are bound programmatically via addEventListener on elements with a .reload-image class, and the reload_image function reads values from the DOM element\u0027s dataset rather than receiving raw string parameters. Additionally, item IDs are URL-encoded with encodeURIComponent before being appended to link hrefs, preventing injection through the ID field.\u003c/p\u003e"
                }
              ],
              "value": "The fix removes all capture-derived values (item IDs, URLs, screenshot paths) from inline JavaScript contexts (onclick attributes and inline script variable assignments). These values are now stored in HTML data attributes (data-screenshot, data-url, data-item-id), which are properly HTML-escaped by the Jinja2 template engine. Screenshot click handlers are bound programmatically via addEventListener on elements with a .reload-image class, and the reload_image function reads values from the DOM element\u0027s dataset rather than receiving raw string parameters. Additionally, item IDs are URL-encoded with encodeURIComponent before being appended to link hrefs, preventing injection through the ID field."
            }
          ],
          "source": {
            "discovery": "UNKNOWN"
          },
          "title": "Stored Cross-Site Scripting (XSS) via Crawler Capture Import in AIL Framework showDomain Page",
          "x_gcve": [
            {
              "extensions": {
                "bcp-05-x-01": {
                  "ai_annotations": [
                    {
                      "ai_level": "generated",
                      "description": "Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model.",
                      "gna_source": 1,
                      "models": [
                        {
                          "gna_source": 1,
                          "identifier": "qwen3.8:27b",
                          "name": "qwen3.8:27b",
                          "source": "ollama"
                        }
                      ],
                      "review_status": "full",
                      "scope": "record",
                      "tags": [
                        "ai-computer-assisted:llm-generated",
                        "ai-computer-assisted:classification"
                      ]
                    }
                  ]
                },
                "bcp-05-x-02": {
                  "x_patch2vuln": {
                    "assumptions": [
                      "The UI:P (Passive) rating assumes the inline script vector (screenshot variable assignment) executes on page load without requiring a user click. The onclick vector would require UI:A, but the inline script vector is sufficient for exploitation.",
                      "PR:L assumes the attacker needs a user-role API client to import a crafted crawler capture, as stated in the commit message. The exact privilege level and authentication mechanism are not further specified in the patch.",
                      "The version boundary \u0027less_than 7.1\u0027 is inferred from the tag_version_boundary metadata showing 21 commits after the fix before the v7.1 tag, suggesting the fix is included in v7.1. Exact affected version ranges are not confirmed.",
                      "CAPEC-1 is selected as the closest available attack pattern for stored XSS; no more specific CAPEC for stored XSS via data import exists in the catalog.",
                      "The patch does not include test cases or additional context about whether other template files have similar inline JavaScript interpolation patterns; this advisory covers only the single file in the patch."
                    ],
                    "capecRationale": [
                      {
                        "capecId": "CAPEC-1",
                        "rationale": "The patch directly remediates a stored XSS vector where attacker-controlled data from a crawler capture import is reflected into inline JavaScript without neutralization. CAPEC-1 is the canonical attack pattern for XSS. The specific sub-variant is stored (persistent) XSS via a data import mechanism, but CAPEC-1 is the closest and most appropriate mapping available in the CAPEC catalog."
                      }
                    ],
                    "commit": "31376ee3d04519c898bb9b3671453a41c4117340",
                    "confidence": "medium",
                    "credits": [
                      {
                        "lang": "en",
                        "type": "remediation developer",
                        "value": "terrtia"
                      }
                    ],
                    "cvssRationale": "AV:N: Exploitable over the network via the web application. AC:L: No special race conditions or complex setup; a crafted capture import suffices. AT:N: No manipulation of the attack target required. PR:L: Requires a user-role API client to import a malicious crawler capture (authenticated, low privilege). UI:P: The stored XSS in the inline script block executes passively when the victim loads the domain page; no click or active interaction is needed for the inline script vector. VC:N/VI:N/VA:N: The vulnerable component (server-side application) is not directly compromised in confidentiality, integrity, or availability. SC:H: Scope changes to the victim\u0027s browser session, enabling theft of session tokens, cookies, and sensitive data. SI:H: Scope integrity is impacted as the attacker can perform arbitrary actions in the victim\u0027s authenticated session. SA:N: No meaningful impact on the availability of the attacker\u0027s scope.",
                    "fixSummary": "The fix removes all capture-derived values (item IDs, URLs, screenshot paths) from inline JavaScript contexts (onclick attributes and inline script variable assignments). These values are now stored in HTML data attributes (data-screenshot, data-url, data-item-id), which are properly HTML-escaped by the Jinja2 template engine. Screenshot click handlers are bound programmatically via addEventListener on elements with a .reload-image class, and the reload_image function reads values from the DOM element\u0027s dataset rather than receiving raw string parameters. Additionally, item IDs are URL-encoded with encodeURIComponent before being appended to link hrefs, preventing injection through the ID field.",
                    "generatedAt": "2026-09-25T13:45:46.199650Z",
                    "generator": "patch2vuln.py",
                    "model": "qwen3.8:27b",
                    "modelComparison": {
                      "rankings": [
                        {
                          "agreementScore": 9,
                          "assumptionCount": 5,
                          "confidence": "medium",
                          "model": "qwen3.8:27b",
                          "score": 5
                        }
                      ],
                      "selectedModel": "qwen3.8:27b",
                      "selectionMethod": "deterministic-consensus-v1",
                      "selectionNotice": "The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required."
                    },
                    "patchSha256": "c110d16dd8eee489472853615089aeb6b6e034457dcbaec9b038bf85ad96b920",
                    "patchSummary": "In showDomain.html: (1) Replaced inline onclick=\"reload_image(\u0027...\u0027)\" with a data-attribute-based approach using data-screenshot, data-url, and data-item-id attributes on the table cell element, plus a .reload-image CSS class. (2) Removed the inline script block that assigned screenshot, URL, and ID values directly into JavaScript variables via Jinja2 interpolation; replaced with dataset reads from the domain_screenshot img element. (3) Changed reload_image() to accept a DOM element and read values from element.dataset instead of raw string arguments. (4) Added a programmatic event binding loop using document.querySelectorAll(\u0027.reload-image\u0027).forEach() with addEventListener(\u0027click\u0027). (5) Applied encodeURIComponent() to item IDs when constructing screenshot link hrefs. (6) Changed the href URL construction to use url_for with keyword arguments instead of string interpolation.",
                    "patchTruncated": false,
                    "patches": [
                      {
                        "commit": "31376ee3d04519c898bb9b3671453a41c4117340",
                        "patchSha256": "c110d16dd8eee489472853615089aeb6b6e034457dcbaec9b038bf85ad96b920",
                        "source": "https://github.com/ail-project/ail-framework/commit/31376ee3d04519c898bb9b3671453a41c4117340.patch",
                        "sourceUrl": "https://github.com/ail-project/ail-framework/commit/31376ee3d04519c898bb9b3671453a41c4117340.patch",
                        "subject": "chg: [security] prevent stored XSS through imported capture"
                      }
                    ],
                    "source": "https://github.com/ail-project/ail-framework/commit/31376ee3d04519c898bb9b3671453a41c4117340.patch",
                    "subject": "chg: [security] prevent stored XSS through imported capture",
                    "tagVersionBoundary": {
                      "commits_after_fix": 21,
                      "repository": "https://github.com/ail-project/ail-framework",
                      "tag": "v7.1",
                      "version": "7.1",
                      "version_type": "custom"
                    },
                    "weaknessRationale": [
                      {
                        "cweId": "CWE-79",
                        "rationale": "The patch explicitly addresses stored XSS by removing user-controlled values (screenshot paths, URLs, item IDs from crawler capture imports) from inline JavaScript contexts and replacing them with properly escaped data attributes and programmatic event binding. The commit message confirms the intent: \u0027prevent stored XSS through imported capture metadata in showDomain.\u0027"
                      }
                    ]
                  }
                }
              },
              "recordType": "advisory",
              "vulnId": "GCVE-1-2026-20292"
            }
          ],
          "x_generator": {
            "engine": "Vulnogram 0.2.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
        "assignerShortName": "CIRCL",
        "cveId": "CVE-2026-100190",
        "datePublished": "2026-09-25T13:52:19.648Z",
        "dateReserved": "2026-09-25T13:52:13.769Z",
        "dateUpdated": "2026-09-25T16:13:26.973Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-100187 (GCVE-0-2026-100187)

    Vulnerability from cvelistv5 – Published: 2026-09-25 13:42 – Updated: 2026-09-25 14:49
    VLAI
    Title
    AIL Framework Onion Module: Non-Onion URL Accepted as Crawler Task Due to Bypassed Domain Validation
    Summary
    The Onion module in AIL Framework contained a performance shortcut in its URL extraction logic that accepted URLs as valid .onion targets based solely on a length check (exactly 69 characters) and a suffix check (ending in ".onion"), without performing proper hostname parsing or onion-domain validation. An unauthenticated attacker who could publish or control web content crawled by the framework could embed a crafted URL containing an IP address or non-onion hostname with a path ending in ".onion" that satisfied the length and suffix conditions. Such a URL would be extracted, its domain naively sliced from the string, and queued as a legitimate onion crawler task. This allowed unauthenticated content publishers to inject arbitrary non-onion targets into the crawler's task queue, influencing crawler behavior and potentially directing it toward unintended network resources. The vulnerability required no authentication, no user interaction, and only the ability to place crafted content in a location the framework would crawl. The security impact is a loss of integrity in the crawler's target selection: the framework processes and acts upon URLs that do not correspond to legitimate .onion services.
    SSVC
    Exploitation: none Automatable: yes Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-09-25 14:45 UTC
    CWE
    • CWE-20 - Improper Input Validation
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: unspecified , < 7.1 (semver)
    Create a notification for this product.
    GCVE extensions
    AI involvement GCVE-BCP-05-X-01
    Whole record AI-generated Not human-reviewed GNA-1

    Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.

    ai-computer-assisted:llm-generatedai-computer-assisted:classification
    Model Source Identifier
    qwen3.8:27b ollama qwen3.8:27b
    Patch provenance GCVE-BCP-05-X-02
    Generator
    patch2vuln.py on 2026-09-25 13:37
    Model
    qwen3.8:27b
    Input
    https://github.com/ail-project/ail-framework/commit/5c8a68b3d8c7d7b03e5febe4ac5b5aca91826adb.patch 9fbf19112822…
    Confidence
    medium
    Commit Subject Patch SHA-256
    5c8a68b3d8c7 chg: [security] Onion module, prevent non-onion crawler task 9fbf19112822…
    Fix summary

    The length-based shortcut that bypassed onion-domain validation is removed. Every extracted URL is now parsed using the standard URL domain extraction function, and the resulting hostname is validated against the existing onion-domain validation routine before the URL is added to the crawler task set. This ensures that only URLs whose hostname is a genuine .onion domain can be queued as crawler tasks.

    Patch summary

    In bin/modules/Onion.py, the conditional block that checked len(url) == 69 and url.endswith('.onion') to shortcut domain extraction (url[7:]) without calling crawlers.is_valid_onion_domain() is removed. The code is replaced with an unconditional call to crawlers.get_url_domain(url) followed by a check that the returned domain is truthy and passes crawlers.is_valid_onion_domain(domain) before adding the domain and URL to the respective sets. Net change: 2 insertions, 9 deletions in a single file.

    CVSS rationale

    Attack Vector is Network because the attacker publishes crafted content on the web that the framework crawls. Attack Complexity is Low because the attacker only needs to construct a URL of exactly 69 characters ending in .onion with a non-onion hostname. No special Adversary Techniques are required. Privileges Required is None because the attacker is an unauthenticated content publisher. User Interaction is None because the crawler processes the content automatically. The primary impact is Low Integrity on the vulnerable component: the crawler task queue is polluted with non-onion URLs, violating the integrity of the framework's target selection. No confidentiality or availability impact is evident from the patch. No subsequent component impact is identified in the evidence.

    Weakness rationale
    • CWE-20 The URL input was validated using an insufficient heuristic (string length and suffix) that could be satisfied by non-onion URLs. The proper hostname parsing and onion-domain validation step was bypassed by the shortcut, allowing attacker-controlled URLs to be accepted as valid onion targets.
    Attack pattern rationale
    • CAPEC-126 The attacker tampers with URL parameters embedded in untrusted crawled content to bypass the application's validation logic and inject non-onion targets into the crawler task queue. CAPEC-126 is the closest available pattern describing manipulation of input parameters to achieve unintended application behavior. The mapping is approximate because the attack vector is content-based injection rather than direct request parameter manipulation, but the core mechanism (crafting input to bypass validation) aligns with this pattern.
    Assumptions to verify
    • The affected version range is inferred from the tag_version_boundary metadata indicating the fix commit is 24 commits before the v7.1 tag; the exact version number of the vulnerable release is not specified in the patch.
    • The CVSS assumes the attacker can place crafted content in a location the AIL Framework crawler will process; the specific crawling scope and configuration are not detailed in the patch.
    • CAPEC-126 (Parameter Tampering) is the closest available attack pattern; the actual attack is content-based URL injection rather than classic request parameter tampering, so the mapping is approximate.
    • The impact is assessed as Low Integrity based on the evidence that non-onion URLs are queued as crawler tasks; broader downstream consequences (e.g., SSRF-like effects) are not evidenced in the patch and are not assumed.
    • The commit date (24 Sep 2026) is taken as-is from the patch metadata; no independent verification of the timeline is performed.
    Model comparison

    Selected qwen3.8:27b by deterministic-consensus-v1
    The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required.

    Model Score Agreement Confidence Assumptions
    qwen3.8:27b 5 9 medium 5
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-100187",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "yes"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-09-25T14:45:47.206440Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-09-25T14:49:57.208Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "modules": [
                "Onion module"
              ],
              "product": "ail framework",
              "programFiles": [
                "bin/modules/Onion.py"
              ],
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThan": "7.1",
                  "status": "affected",
                  "version": "unspecified",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Aurelien Thirion"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Jeroen Pinoy"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe Onion module in AIL Framework contained a performance shortcut in its URL extraction logic that accepted URLs as valid .onion targets based solely on a length check (exactly 69 characters) and a suffix check (ending in \".onion\"), without performing proper hostname parsing or onion-domain validation. An unauthenticated attacker who could publish or control web content crawled by the framework could embed a crafted URL containing an IP address or non-onion hostname with a path ending in \".onion\" that satisfied the length and suffix conditions. Such a URL would be extracted, its domain naively sliced from the string, and queued as a legitimate onion crawler task. This allowed unauthenticated content publishers to inject arbitrary non-onion targets into the crawler\u0027s task queue, influencing crawler behavior and potentially directing it toward unintended network resources. The vulnerability required no authentication, no user interaction, and only the ability to place crafted content in a location the framework would crawl. The security impact is a loss of integrity in the crawler\u0027s target selection: the framework processes and acts upon URLs that do not correspond to legitimate .onion services.\u003c/p\u003e"
                }
              ],
              "value": "The Onion module in AIL Framework contained a performance shortcut in its URL extraction logic that accepted URLs as valid .onion targets based solely on a length check (exactly 69 characters) and a suffix check (ending in \".onion\"), without performing proper hostname parsing or onion-domain validation. An unauthenticated attacker who could publish or control web content crawled by the framework could embed a crafted URL containing an IP address or non-onion hostname with a path ending in \".onion\" that satisfied the length and suffix conditions. Such a URL would be extracted, its domain naively sliced from the string, and queued as a legitimate onion crawler task. This allowed unauthenticated content publishers to inject arbitrary non-onion targets into the crawler\u0027s task queue, influencing crawler behavior and potentially directing it toward unintended network resources. The vulnerability required no authentication, no user interaction, and only the ability to place crafted content in a location the framework would crawl. The security impact is a loss of integrity in the crawler\u0027s target selection: the framework processes and acts upon URLs that do not correspond to legitimate .onion services."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-126",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-126 Parameter Tampering"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 6.9,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "LOW",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-20",
                  "description": "CWE-20 Improper Input Validation",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-09-25T13:42:16.854Z",
            "orgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
            "shortName": "CIRCL"
          },
          "references": [
            {
              "name": "Security patch",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/5c8a68b3d8c7d7b03e5febe4ac5b5aca91826adb"
            }
          ],
          "solutions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe length-based shortcut that bypassed onion-domain validation is removed. Every extracted URL is now parsed using the standard URL domain extraction function, and the resulting hostname is validated against the existing onion-domain validation routine before the URL is added to the crawler task set. This ensures that only URLs whose hostname is a genuine .onion domain can be queued as crawler tasks.\u003c/p\u003e"
                }
              ],
              "value": "The length-based shortcut that bypassed onion-domain validation is removed. Every extracted URL is now parsed using the standard URL domain extraction function, and the resulting hostname is validated against the existing onion-domain validation routine before the URL is added to the crawler task set. This ensures that only URLs whose hostname is a genuine .onion domain can be queued as crawler tasks."
            }
          ],
          "title": "AIL Framework Onion Module: Non-Onion URL Accepted as Crawler Task Due to Bypassed Domain Validation",
          "x_gcve": [
            {
              "extensions": {
                "bcp-05-x-01": {
                  "ai_annotations": [
                    {
                      "ai_level": "generated",
                      "description": "Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.",
                      "gna_source": 1,
                      "models": [
                        {
                          "gna_source": 1,
                          "identifier": "qwen3.8:27b",
                          "name": "qwen3.8:27b",
                          "source": "ollama"
                        }
                      ],
                      "review_status": "none",
                      "scope": "record",
                      "tags": [
                        "ai-computer-assisted:llm-generated",
                        "ai-computer-assisted:classification"
                      ]
                    }
                  ]
                },
                "bcp-05-x-02": {
                  "x_patch2vuln": {
                    "assumptions": [
                      "The affected version range is inferred from the tag_version_boundary metadata indicating the fix commit is 24 commits before the v7.1 tag; the exact version number of the vulnerable release is not specified in the patch.",
                      "The CVSS assumes the attacker can place crafted content in a location the AIL Framework crawler will process; the specific crawling scope and configuration are not detailed in the patch.",
                      "CAPEC-126 (Parameter Tampering) is the closest available attack pattern; the actual attack is content-based URL injection rather than classic request parameter tampering, so the mapping is approximate.",
                      "The impact is assessed as Low Integrity based on the evidence that non-onion URLs are queued as crawler tasks; broader downstream consequences (e.g., SSRF-like effects) are not evidenced in the patch and are not assumed.",
                      "The commit date (24 Sep 2026) is taken as-is from the patch metadata; no independent verification of the timeline is performed."
                    ],
                    "capecRationale": [
                      {
                        "capecId": "CAPEC-126",
                        "rationale": "The attacker tampers with URL parameters embedded in untrusted crawled content to bypass the application\u0027s validation logic and inject non-onion targets into the crawler task queue. CAPEC-126 is the closest available pattern describing manipulation of input parameters to achieve unintended application behavior. The mapping is approximate because the attack vector is content-based injection rather than direct request parameter manipulation, but the core mechanism (crafting input to bypass validation) aligns with this pattern."
                      }
                    ],
                    "commit": "5c8a68b3d8c7d7b03e5febe4ac5b5aca91826adb",
                    "confidence": "medium",
                    "credits": [
                      {
                        "lang": "en",
                        "type": "remediation developer",
                        "value": "terrtia"
                      }
                    ],
                    "cvssRationale": "Attack Vector is Network because the attacker publishes crafted content on the web that the framework crawls. Attack Complexity is Low because the attacker only needs to construct a URL of exactly 69 characters ending in .onion with a non-onion hostname. No special Adversary Techniques are required. Privileges Required is None because the attacker is an unauthenticated content publisher. User Interaction is None because the crawler processes the content automatically. The primary impact is Low Integrity on the vulnerable component: the crawler task queue is polluted with non-onion URLs, violating the integrity of the framework\u0027s target selection. No confidentiality or availability impact is evident from the patch. No subsequent component impact is identified in the evidence.",
                    "fixSummary": "The length-based shortcut that bypassed onion-domain validation is removed. Every extracted URL is now parsed using the standard URL domain extraction function, and the resulting hostname is validated against the existing onion-domain validation routine before the URL is added to the crawler task set. This ensures that only URLs whose hostname is a genuine .onion domain can be queued as crawler tasks.",
                    "generatedAt": "2026-09-25T13:37:37.543009Z",
                    "generator": "patch2vuln.py",
                    "model": "qwen3.8:27b",
                    "modelComparison": {
                      "rankings": [
                        {
                          "agreementScore": 9,
                          "assumptionCount": 5,
                          "confidence": "medium",
                          "model": "qwen3.8:27b",
                          "score": 5
                        }
                      ],
                      "selectedModel": "qwen3.8:27b",
                      "selectionMethod": "deterministic-consensus-v1",
                      "selectionNotice": "The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required."
                    },
                    "patchSha256": "9fbf191128229c1859f3643b5f50921cdf5f36fd70734e8f68a05e237b987d60",
                    "patchSummary": "In bin/modules/Onion.py, the conditional block that checked len(url) == 69 and url.endswith(\u0027.onion\u0027) to shortcut domain extraction (url[7:]) without calling crawlers.is_valid_onion_domain() is removed. The code is replaced with an unconditional call to crawlers.get_url_domain(url) followed by a check that the returned domain is truthy and passes crawlers.is_valid_onion_domain(domain) before adding the domain and URL to the respective sets. Net change: 2 insertions, 9 deletions in a single file.",
                    "patchTruncated": false,
                    "patches": [
                      {
                        "commit": "5c8a68b3d8c7d7b03e5febe4ac5b5aca91826adb",
                        "patchSha256": "9fbf191128229c1859f3643b5f50921cdf5f36fd70734e8f68a05e237b987d60",
                        "source": "https://github.com/ail-project/ail-framework/commit/5c8a68b3d8c7d7b03e5febe4ac5b5aca91826adb.patch",
                        "sourceUrl": "https://github.com/ail-project/ail-framework/commit/5c8a68b3d8c7d7b03e5febe4ac5b5aca91826adb.patch",
                        "subject": "chg: [security] Onion module, prevent non-onion crawler task"
                      }
                    ],
                    "source": "https://github.com/ail-project/ail-framework/commit/5c8a68b3d8c7d7b03e5febe4ac5b5aca91826adb.patch",
                    "subject": "chg: [security] Onion module, prevent non-onion crawler task",
                    "tagVersionBoundary": {
                      "commits_after_fix": 24,
                      "repository": "https://github.com/ail-project/ail-framework",
                      "tag": "v7.1",
                      "version": "7.1",
                      "version_type": "custom"
                    },
                    "weaknessRationale": [
                      {
                        "cweId": "CWE-20",
                        "rationale": "The URL input was validated using an insufficient heuristic (string length and suffix) that could be satisfied by non-onion URLs. The proper hostname parsing and onion-domain validation step was bypassed by the shortcut, allowing attacker-controlled URLs to be accepted as valid onion targets."
                      }
                    ]
                  }
                }
              },
              "recordType": "advisory",
              "vulnId": "GCVE-1-2026-20276"
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
        "assignerShortName": "CIRCL",
        "cveId": "CVE-2026-100187",
        "datePublished": "2026-09-25T13:42:16.854Z",
        "dateReserved": "2026-09-25T13:42:12.578Z",
        "dateUpdated": "2026-09-25T14:49:57.208Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-100177 (GCVE-0-2026-100177)

    Vulnerability from cvelistv5 – Published: 2026-09-25 13:35 – Updated: 2026-09-25 14:55
    VLAI
    Title
    Ail Framework Crawler: Missing Cookiejar Authorization Check Allows Cross-Organization Cookiejar Attachment
    Summary
    The AIL Framework crawler task creation API (api_add_crawler_task) contained an insufficient authorization check when a user supplied a cookiejar UUID to attach to a one-shot or scheduled crawler task. The original code only verified that the cookiejar existed and, if its access level was 0, compared the cookiejar's owning user ID to the requesting user ID. It did not validate organizational boundaries, did not account for the requesting user's role. When the cookiejar level was not 0, no access check was performed at all. An authenticated user could therefore reference another organization's cookiejar by UUID and have the crawler use that organization's stored cookies (session tokens, authentication credentials) when performing web crawls, effectively leaking or exfiltrating the victim organization's session data. The vulnerability requires an authenticated user with the ability to create crawler tasks. The attacker must know or guess a valid cookiejar UUID belonging to another organization. The impact is unauthorized access to another organization's stored cookies and session data through the crawler infrastructure.
    SSVC
    Exploitation: none Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-09-25 14:55 UTC
    CWE
    • CWE-639 - Authorization Bypass Through User-Controlled Key
    • CWE-20 - Improper Input Validation
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: unspecified , < 7.1 (semver)
    Create a notification for this product.
    GCVE extensions
    AI involvement GCVE-BCP-05-X-01
    Whole record AI-generated Not human-reviewed GNA-1

    Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.

    ai-computer-assisted:llm-generatedai-computer-assisted:classification
    Model Source Identifier
    qwen3.8:27b ollama qwen3.8:27b
    Patch provenance GCVE-BCP-05-X-02
    Generator
    patch2vuln.py on 2026-09-25 13:30
    Model
    qwen3.8:27b
    Input
    https://github.com/ail-project/ail-framework/commit/3773ca36658c57ce592aebe74e27c855eb64f58a.patch 43e163a1b90d…
    Confidence
    medium
    Commit Subject Patch SHA-256
    3773ca36658c chg: [security] crawler, enforce cookiejar ACL when creating 43e163a1b90d…
    Fix summary

    The cookiejar attachment path in api_add_crawler_task is now validated through the existing api_check_cookiejar_access_acl() function, which enforces organization, user, and role-based access control for the 'view' action on the referenced cookiejar. The user_role parameter is propagated from the API and UI entry points (api_rest.py, crawler_splash.py) into the ACL check. Separately, URL scheme validation is enforced unconditionally: only http and https schemes are accepted, and non-conforming URLs are rejected with a 400 error before any further processing.

    Patch summary

    In bin/lib/crawlers.py: (1) is_global_url() now returns False for any scheme other than http/https (previously returned True for data/file schemes) and handles URLs lacking a netloc by prepending http://. (2) api_validate_global_urls() now rejects non-HTTP/HTTPS schemes with a 400 error before the local-IP filter check. (3) The Cookiejar class gains a get_creator() alias. (4) The CrawlerTask.create() method validates the URL scheme. (5) api_add_crawler_task() replaces the inline level-0 user-ID comparison with a call to api_check_cookiejar_access_acl(cookiejar_uuid, user_org, user_id, user_role, action='view') and accepts a new user_role parameter. (6) api_add_crawler_capture() now calls api_validate_global_urls(). In var/www/blueprints/api_rest.py and crawler_splash.py: user_role is extracted from the authenticated session and passed to api_add_crawler_task().

    CVSS rationale

    The vulnerability is exploitable over the network (AV:N) with low complexity (AC:L) since the attacker only needs to substitute a known or guessed cookiejar UUID in an API request. No attack target manipulation is required (AT:N). An authenticated user with crawler task creation privileges is needed (PR:L). No user interaction is required (UI:N). The vulnerable component itself does not lose confidentiality, integrity, or availability (VC:N, VI:N, VA:N). However, the subsequent impact is high on confidentiality (SC:H) because the attacker gains access to another organization's stored cookies and session tokens via the crawler, which could be used to impersonate the victim on target sites. No subsequent integrity or availability impact is evident (SI:N, SA:N).

    Weakness rationale
    • CWE-639 The cookiejar UUID is a user-supplied identifier (key) that was not properly validated against the requesting user's organization and role. The old code only compared user IDs when level was 0 and skipped the check entirely otherwise, allowing cross-organization access to another user's cookiejar.
    • CWE-20 The URL scheme validation was incorrect: data: and file: schemes were treated as valid global URLs, and the scheme check was skipped when the local-IP filter was disabled. The fix enforces that only http and https schemes are accepted unconditionally.
    Attack pattern rationale
    • CAPEC-1 The attacker tampers with the cookiejar UUID parameter in the crawler task creation API request to reference a resource (cookiejar) belonging to another organization. The system failed to validate that the referenced object was accessible to the requesting user's organization. This is the closest CAPEC pattern to an IDOR-style parameter substitution; no CAPEC specifically named 'Insecure Direct Object Reference' exists, so CAPEC-1 (modifying a request parameter to access unauthorized resources) is the best available match.
    Assumptions to verify
    • The api_check_cookiejar_access_acl() function is assumed to correctly enforce organization, user, and role-based access control; its implementation is not included in this patch.
    • The cookiejar UUID is assumed to be guessable or discoverable by an authenticated user (e.g., via enumeration or information leakage); if UUIDs are truly random and unguessable, exploitability is reduced but the authorization flaw remains.
    • The CVSS assumes the primary security impact is subsequent confidentiality (access to another org's cookies/sessions) rather than direct compromise of the Ail Framework itself.
    • The CAPEC-1 mapping is the closest available pattern for an IDOR/parameter-substitution attack; no CAPEC specifically covers insecure direct object reference, so this mapping carries some uncertainty.
    • The affected version boundary is inferred from the tag v7.1 (26 commits after the fix commit), suggesting the fix landed before the v7.1 release; exact affected version range is not confirmed.
    • The URL scheme validation fix (rejecting data:/file: schemes) is treated as a secondary hardening change within the same patch set rather than a separate vulnerability.
    Model comparison

    Selected qwen3.8:27b by deterministic-consensus-v1
    The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required.

    Model Score Agreement Confidence Assumptions
    qwen3.8:27b 4 9 medium 6
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-100177",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-09-25T14:55:38.429027Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-09-25T14:55:51.640Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "modules": [
                "bin/lib/crawlers.py",
                "var/www/blueprints/api_rest.py",
                "var/www/blueprints/crawler_splash.py"
              ],
              "product": "ail framework",
              "programFiles": [
                "bin/lib/crawlers.py",
                "var/www/blueprints/api_rest.py",
                "var/www/blueprints/crawler_splash.py"
              ],
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThan": "7.1",
                  "status": "affected",
                  "version": "unspecified",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "terrtia"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Jeroen Pinoy"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe AIL Framework crawler task creation API (api_add_crawler_task) contained an insufficient authorization check when a user supplied a cookiejar UUID to attach to a one-shot or scheduled crawler task. The original code only verified that the cookiejar existed and, if its access level was 0, compared the cookiejar\u0027s owning user ID to the requesting user ID. It did not validate organizational boundaries, did not account for the requesting user\u0027s role. When the cookiejar level was not 0, no access check was performed at all. An authenticated user could therefore reference another organization\u0027s cookiejar by UUID and have the crawler use that organization\u0027s stored cookies (session tokens, authentication credentials) when performing web crawls, effectively leaking or exfiltrating the victim organization\u0027s session data.\u003cbr\u003e\u003c/p\u003e\u003cp\u003eThe vulnerability requires an authenticated user with the ability to create crawler tasks. The attacker must know or guess a valid cookiejar UUID belonging to another organization. The impact is unauthorized access to another organization\u0027s stored cookies and session data through the crawler infrastructure.\u003c/p\u003e"
                }
              ],
              "value": "The AIL Framework crawler task creation API (api_add_crawler_task) contained an insufficient authorization check when a user supplied a cookiejar UUID to attach to a one-shot or scheduled crawler task. The original code only verified that the cookiejar existed and, if its access level was 0, compared the cookiejar\u0027s owning user ID to the requesting user ID. It did not validate organizational boundaries, did not account for the requesting user\u0027s role. When the cookiejar level was not 0, no access check was performed at all. An authenticated user could therefore reference another organization\u0027s cookiejar by UUID and have the crawler use that organization\u0027s stored cookies (session tokens, authentication credentials) when performing web crawls, effectively leaking or exfiltrating the victim organization\u0027s session data.\n\n\nThe vulnerability requires an authenticated user with the ability to create crawler tasks. The attacker must know or guess a valid cookiejar UUID belonging to another organization. The impact is unauthorized access to another organization\u0027s stored cookies and session data through the crawler infrastructure."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-1",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-1 Tamper with URLs"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 6.3,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "LOW",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "HIGH",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:N/VA:N/SC:H/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-639",
                  "description": "CWE-639 Authorization Bypass Through User-Controlled Key",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            },
            {
              "descriptions": [
                {
                  "cweId": "CWE-20",
                  "description": "CWE-20 Improper Input Validation",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-09-25T13:35:50.465Z",
            "orgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
            "shortName": "CIRCL"
          },
          "references": [
            {
              "name": "Security patch",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/3773ca36658c57ce592aebe74e27c855eb64f58a"
            }
          ],
          "solutions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe cookiejar attachment path in api_add_crawler_task is now validated through the existing api_check_cookiejar_access_acl() function, which enforces organization, user, and role-based access control for the \u0027view\u0027 action on the referenced cookiejar. The user_role parameter is propagated from the API and UI entry points (api_rest.py, crawler_splash.py) into the ACL check. Separately, URL scheme validation is enforced unconditionally: only http and https schemes are accepted, and non-conforming URLs are rejected with a 400 error before any further processing.\u003c/p\u003e"
                }
              ],
              "value": "The cookiejar attachment path in api_add_crawler_task is now validated through the existing api_check_cookiejar_access_acl() function, which enforces organization, user, and role-based access control for the \u0027view\u0027 action on the referenced cookiejar. The user_role parameter is propagated from the API and UI entry points (api_rest.py, crawler_splash.py) into the ACL check. Separately, URL scheme validation is enforced unconditionally: only http and https schemes are accepted, and non-conforming URLs are rejected with a 400 error before any further processing."
            }
          ],
          "title": "Ail Framework Crawler: Missing Cookiejar Authorization Check Allows Cross-Organization Cookiejar Attachment",
          "x_gcve": [
            {
              "extensions": {
                "bcp-05-x-01": {
                  "ai_annotations": [
                    {
                      "ai_level": "generated",
                      "description": "Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.",
                      "gna_source": 1,
                      "models": [
                        {
                          "gna_source": 1,
                          "identifier": "qwen3.8:27b",
                          "name": "qwen3.8:27b",
                          "source": "ollama"
                        }
                      ],
                      "review_status": "none",
                      "scope": "record",
                      "tags": [
                        "ai-computer-assisted:llm-generated",
                        "ai-computer-assisted:classification"
                      ]
                    }
                  ]
                },
                "bcp-05-x-02": {
                  "x_patch2vuln": {
                    "assumptions": [
                      "The api_check_cookiejar_access_acl() function is assumed to correctly enforce organization, user, and role-based access control; its implementation is not included in this patch.",
                      "The cookiejar UUID is assumed to be guessable or discoverable by an authenticated user (e.g., via enumeration or information leakage); if UUIDs are truly random and unguessable, exploitability is reduced but the authorization flaw remains.",
                      "The CVSS assumes the primary security impact is subsequent confidentiality (access to another org\u0027s cookies/sessions) rather than direct compromise of the Ail Framework itself.",
                      "The CAPEC-1 mapping is the closest available pattern for an IDOR/parameter-substitution attack; no CAPEC specifically covers insecure direct object reference, so this mapping carries some uncertainty.",
                      "The affected version boundary is inferred from the tag v7.1 (26 commits after the fix commit), suggesting the fix landed before the v7.1 release; exact affected version range is not confirmed.",
                      "The URL scheme validation fix (rejecting data:/file: schemes) is treated as a secondary hardening change within the same patch set rather than a separate vulnerability."
                    ],
                    "capecRationale": [
                      {
                        "capecId": "CAPEC-1",
                        "rationale": "The attacker tampers with the cookiejar UUID parameter in the crawler task creation API request to reference a resource (cookiejar) belonging to another organization. The system failed to validate that the referenced object was accessible to the requesting user\u0027s organization. This is the closest CAPEC pattern to an IDOR-style parameter substitution; no CAPEC specifically named \u0027Insecure Direct Object Reference\u0027 exists, so CAPEC-1 (modifying a request parameter to access unauthorized resources) is the best available match."
                      }
                    ],
                    "commit": "3773ca36658c57ce592aebe74e27c855eb64f58a",
                    "confidence": "medium",
                    "credits": [
                      {
                        "lang": "en",
                        "type": "remediation developer",
                        "value": "terrtia"
                      }
                    ],
                    "cvssRationale": "The vulnerability is exploitable over the network (AV:N) with low complexity (AC:L) since the attacker only needs to substitute a known or guessed cookiejar UUID in an API request. No attack target manipulation is required (AT:N). An authenticated user with crawler task creation privileges is needed (PR:L). No user interaction is required (UI:N). The vulnerable component itself does not lose confidentiality, integrity, or availability (VC:N, VI:N, VA:N). However, the subsequent impact is high on confidentiality (SC:H) because the attacker gains access to another organization\u0027s stored cookies and session tokens via the crawler, which could be used to impersonate the victim on target sites. No subsequent integrity or availability impact is evident (SI:N, SA:N).",
                    "fixSummary": "The cookiejar attachment path in api_add_crawler_task is now validated through the existing api_check_cookiejar_access_acl() function, which enforces organization, user, and role-based access control for the \u0027view\u0027 action on the referenced cookiejar. The user_role parameter is propagated from the API and UI entry points (api_rest.py, crawler_splash.py) into the ACL check. Separately, URL scheme validation is enforced unconditionally: only http and https schemes are accepted, and non-conforming URLs are rejected with a 400 error before any further processing.",
                    "generatedAt": "2026-09-25T13:30:48.386437Z",
                    "generator": "patch2vuln.py",
                    "model": "qwen3.8:27b",
                    "modelComparison": {
                      "rankings": [
                        {
                          "agreementScore": 9,
                          "assumptionCount": 6,
                          "confidence": "medium",
                          "model": "qwen3.8:27b",
                          "score": 4
                        }
                      ],
                      "selectedModel": "qwen3.8:27b",
                      "selectionMethod": "deterministic-consensus-v1",
                      "selectionNotice": "The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required."
                    },
                    "patchSha256": "43e163a1b90d5926293d5dbd7982d46241f08d7a9d2cb0edf86c963f794afac5",
                    "patchSummary": "In bin/lib/crawlers.py: (1) is_global_url() now returns False for any scheme other than http/https (previously returned True for data/file schemes) and handles URLs lacking a netloc by prepending http://. (2) api_validate_global_urls() now rejects non-HTTP/HTTPS schemes with a 400 error before the local-IP filter check. (3) The Cookiejar class gains a get_creator() alias. (4) The CrawlerTask.create() method validates the URL scheme. (5) api_add_crawler_task() replaces the inline level-0 user-ID comparison with a call to api_check_cookiejar_access_acl(cookiejar_uuid, user_org, user_id, user_role, action=\u0027view\u0027) and accepts a new user_role parameter. (6) api_add_crawler_capture() now calls api_validate_global_urls(). In var/www/blueprints/api_rest.py and crawler_splash.py: user_role is extracted from the authenticated session and passed to api_add_crawler_task().",
                    "patchTruncated": false,
                    "patches": [
                      {
                        "commit": "3773ca36658c57ce592aebe74e27c855eb64f58a",
                        "patchSha256": "43e163a1b90d5926293d5dbd7982d46241f08d7a9d2cb0edf86c963f794afac5",
                        "source": "https://github.com/ail-project/ail-framework/commit/3773ca36658c57ce592aebe74e27c855eb64f58a.patch",
                        "sourceUrl": "https://github.com/ail-project/ail-framework/commit/3773ca36658c57ce592aebe74e27c855eb64f58a.patch",
                        "subject": "chg: [security] crawler, enforce cookiejar ACL when creating"
                      }
                    ],
                    "source": "https://github.com/ail-project/ail-framework/commit/3773ca36658c57ce592aebe74e27c855eb64f58a.patch",
                    "subject": "chg: [security] crawler, enforce cookiejar ACL when creating",
                    "tagVersionBoundary": {
                      "commits_after_fix": 26,
                      "repository": "https://github.com/ail-project/ail-framework",
                      "tag": "v7.1",
                      "version": "7.1",
                      "version_type": "custom"
                    },
                    "weaknessRationale": [
                      {
                        "cweId": "CWE-639",
                        "rationale": "The cookiejar UUID is a user-supplied identifier (key) that was not properly validated against the requesting user\u0027s organization and role. The old code only compared user IDs when level was 0 and skipped the check entirely otherwise, allowing cross-organization access to another user\u0027s cookiejar."
                      },
                      {
                        "cweId": "CWE-20",
                        "rationale": "The URL scheme validation was incorrect: data: and file: schemes were treated as valid global URLs, and the scheme check was skipped when the local-IP filter was disabled. The fix enforces that only http and https schemes are accepted unconditionally."
                      }
                    ]
                  }
                }
              },
              "recordType": "advisory",
              "vulnId": "GCVE-1-2026-20183"
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
        "assignerShortName": "CIRCL",
        "cveId": "CVE-2026-100177",
        "datePublished": "2026-09-25T13:35:50.465Z",
        "dateReserved": "2026-09-25T13:35:37.184Z",
        "dateUpdated": "2026-09-25T14:55:51.640Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-100176 (GCVE-0-2026-100176)

    Vulnerability from cvelistv5 – Published: 2026-09-25 13:29 – Updated: 2026-09-25 14:59
    VLAI
    Title
    Stored Cross-Site Scripting (XSS) in AIL Framework Username Timeline Tooltip
    Summary
    The AIL Framework's username timeline feature is vulnerable to stored cross-site scripting (XSS). Usernames imported from chats and crawled forums are stored without character restrictions. When an authenticated analyst views the username timeline, the application renders these stored usernames into the DOM using D3's html() method in the tooltip. Because the username value (d.obj) is interpolated directly into an HTML string without sanitization, a crafted username containing HTML event handlers (e.g., <img src=x onerror=alert(1)>) will execute arbitrary JavaScript in the analyst's browser when the analyst hovers over the corresponding timeline entry. The attack requires the victim to be an authenticated analyst with access to the timeline view and to interact with the malicious timeline entry (hover). Successful exploitation can lead to session hijacking, data exfiltration, or unauthorized actions performed within the analyst's authenticated session. The vulnerability resides in the client-side JavaScript file var/www/static/js/d3/timeline_basic.js.
    SSVC
    Exploitation: none Automatable: no Technical Impact: total
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-09-25 14:56 UTC
    CWE
    • CWE-79 - Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: unspecified , < 7.1 (semver)
    Create a notification for this product.
    GCVE extensions
    AI involvement GCVE-BCP-05-X-01
    Whole record AI-generated Not human-reviewed GNA-1

    Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.

    ai-computer-assisted:llm-generatedai-computer-assisted:classification
    Model Source Identifier
    qwen3.8:27b ollama qwen3.8:27b
    Patch provenance GCVE-BCP-05-X-02
    Generator
    patch2vuln.py on 2026-09-25 13:24
    Model
    qwen3.8:27b
    Input
    https://github.com/ail-project/ail-framework/commit/455dd92c4179c53204368d93681ded4b57e31643.patch 36262636a3a7…
    Confidence
    medium
    Commit Subject Patch SHA-256
    455dd92c4179 chg: [security] fix XSS in username timeline tooltip. 36262636a3a7…
    Fix summary

    The fix applies the existing sanitize_text() helper to the user-controlled username value (d.obj) immediately before it is interpolated into the D3 tooltip HTML string. This ensures that any HTML or script content embedded in the stored username is neutralized before DOM insertion, preventing script execution while preserving the tooltip's intended formatting (line breaks and date/time display).

    Patch summary

    In var/www/static/js/d3/timeline_basic.js, the single line constructing the tooltip HTML was changed from tooltip.html(`${d.obj}<br>...`) to tooltip.html(`${sanitize_text(d.obj)}<br>...`). The only modification is wrapping the untrusted d.obj variable with the sanitize_text() function call at the HTML sink, leaving the rest of the tooltip template (br tags, date formatting) unchanged.

    CVSS rationale

    AV:N: The vulnerability is in a web application accessible over the network. AC:L: The attacker only needs to craft a username with HTML/JS in a chat or forum that gets crawled; no race conditions or complex conditions are needed. AT:N: No attack on the target system is required; the malicious username is stored as part of normal data import. PR:N: The attacker does not need any account or privilege on the AIL Framework; they only need to be a user in a source chat/forum. UI:A: The victim (analyst) must actively hover over the specific timeline entry to trigger script execution. VC:H: XSS in an authenticated analyst session can expose sensitive intelligence data, session tokens, and credentials. VI:H: The attacker can perform actions as the analyst, modify data, or exfiltrate information. VA:N: No impact on availability. SC/SI/SA:N: No subsequent system impact is evidenced.

    Weakness rationale
    • CWE-79 The patch inserts a user-controlled value (username from imported chats/forums) into an HTML context via D3's html() method without sanitization. The fix adds sanitize_text() at the sink, confirming the root cause is missing output encoding/neutralization of untrusted data in an HTML context, which is the definition of CWE-79 (stored XSS variant).
    Attack pattern rationale
    • CAPEC-1 CAPEC-1 describes the general pattern of injecting client-side scripts into web pages via untrusted input. The patch evidence shows a stored username (untrusted input from chats/forums) being rendered into an HTML tooltip without sanitization, matching the stored-XSS sub-pattern of CAPEC-1. This is the closest and most direct CAPEC mapping for an XSS vulnerability where attacker-controlled data is persisted and later rendered in a victim's browser.
    Assumptions to verify
    • The UI:A (Active) user interaction metric assumes the analyst must deliberately hover over the specific timeline entry to trigger the XSS; passive rendering without hover is not evidenced in the patch.
    • The affected version boundary is inferred from the tag_version_boundary metadata (v7.1, 29 commits after fix); the exact last affected and first fixed version numbers are not explicitly stated in the patch.
    • PR:N assumes the attacker does not need an account on the AIL Framework itself, only a presence in a crawled chat or forum source; if the platform requires the attacker to be a registered user to have their username crawled, PR:L might be more appropriate.
    • The CAPEC-1 mapping is the closest available pattern for stored XSS; no more specific CAPEC ID for 'stored XSS via imported data rendered in a tooltip' exists in the CAPEC catalog.
    • The sanitize_text() helper is assumed to perform adequate HTML entity encoding or equivalent neutralization; its implementation is not shown in the patch.
    • VC:H and VI:H reflect the sensitivity of an intelligence-analysis platform where an authenticated analyst session may contain classified or highly sensitive data; if the deployment context is less sensitive, lower impact ratings could apply.
    Model comparison

    Selected qwen3.8:27b by deterministic-consensus-v1
    The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required.

    Model Score Agreement Confidence Assumptions
    qwen3.8:27b 4 9 medium 6
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-100176",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "total"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-09-25T14:56:38.970855Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-09-25T14:59:28.644Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "modules": [
                "username timeline (D3 timeline_basic)"
              ],
              "product": "ail framework",
              "programFiles": [
                "var/www/static/js/d3/timeline_basic.js"
              ],
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThan": "7.1",
                  "status": "affected",
                  "version": "unspecified",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Aurelien Thirion"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Jeroen Pinoy"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe AIL Framework\u0027s username timeline feature is vulnerable to stored cross-site scripting (XSS). Usernames imported from chats and crawled forums are stored without character restrictions. When an authenticated analyst views the username timeline, the application renders these stored usernames into the DOM using D3\u0027s html() method in the tooltip. Because the username value (d.obj) is interpolated directly into an HTML string without sanitization, a crafted username containing HTML event handlers (e.g., \u0026lt;img src=x onerror=alert(1)\u0026gt;) will execute arbitrary JavaScript in the analyst\u0027s browser when the analyst hovers over the corresponding timeline entry. The attack requires the victim to be an authenticated analyst with access to the timeline view and to interact with the malicious timeline entry (hover). Successful exploitation can lead to session hijacking, data exfiltration, or unauthorized actions performed within the analyst\u0027s authenticated session. The vulnerability resides in the client-side JavaScript file var/www/static/js/d3/timeline_basic.js.\u003c/p\u003e"
                }
              ],
              "value": "The AIL Framework\u0027s username timeline feature is vulnerable to stored cross-site scripting (XSS). Usernames imported from chats and crawled forums are stored without character restrictions. When an authenticated analyst views the username timeline, the application renders these stored usernames into the DOM using D3\u0027s html() method in the tooltip. Because the username value (d.obj) is interpolated directly into an HTML string without sanitization, a crafted username containing HTML event handlers (e.g., \u003cimg src=x onerror=alert(1)\u003e) will execute arbitrary JavaScript in the analyst\u0027s browser when the analyst hovers over the corresponding timeline entry. The attack requires the victim to be an authenticated analyst with access to the timeline view and to interact with the malicious timeline entry (hover). Successful exploitation can lead to session hijacking, data exfiltration, or unauthorized actions performed within the analyst\u0027s authenticated session. The vulnerability resides in the client-side JavaScript file var/www/static/js/d3/timeline_basic.js."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-1",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-1 Cross Site Scripting"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 8.5,
                "baseSeverity": "HIGH",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "ACTIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "HIGH",
                "vulnIntegrityImpact": "HIGH",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-79",
                  "description": "CWE-79 Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-09-25T13:29:17.333Z",
            "orgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
            "shortName": "CIRCL"
          },
          "references": [
            {
              "name": "Security patch",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/455dd92c4179c53204368d93681ded4b57e31643"
            }
          ],
          "solutions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe fix applies the existing sanitize_text() helper to the user-controlled username value (d.obj) immediately before it is interpolated into the D3 tooltip HTML string. This ensures that any HTML or script content embedded in the stored username is neutralized before DOM insertion, preventing script execution while preserving the tooltip\u0027s intended formatting (line breaks and date/time display).\u003c/p\u003e"
                }
              ],
              "value": "The fix applies the existing sanitize_text() helper to the user-controlled username value (d.obj) immediately before it is interpolated into the D3 tooltip HTML string. This ensures that any HTML or script content embedded in the stored username is neutralized before DOM insertion, preventing script execution while preserving the tooltip\u0027s intended formatting (line breaks and date/time display)."
            }
          ],
          "title": "Stored Cross-Site Scripting (XSS) in AIL Framework Username Timeline Tooltip",
          "x_gcve": [
            {
              "extensions": {
                "bcp-05-x-01": {
                  "ai_annotations": [
                    {
                      "ai_level": "generated",
                      "description": "Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.",
                      "gna_source": 1,
                      "models": [
                        {
                          "gna_source": 1,
                          "identifier": "qwen3.8:27b",
                          "name": "qwen3.8:27b",
                          "source": "ollama"
                        }
                      ],
                      "review_status": "none",
                      "scope": "record",
                      "tags": [
                        "ai-computer-assisted:llm-generated",
                        "ai-computer-assisted:classification"
                      ]
                    }
                  ]
                },
                "bcp-05-x-02": {
                  "x_patch2vuln": {
                    "assumptions": [
                      "The UI:A (Active) user interaction metric assumes the analyst must deliberately hover over the specific timeline entry to trigger the XSS; passive rendering without hover is not evidenced in the patch.",
                      "The affected version boundary is inferred from the tag_version_boundary metadata (v7.1, 29 commits after fix); the exact last affected and first fixed version numbers are not explicitly stated in the patch.",
                      "PR:N assumes the attacker does not need an account on the AIL Framework itself, only a presence in a crawled chat or forum source; if the platform requires the attacker to be a registered user to have their username crawled, PR:L might be more appropriate.",
                      "The CAPEC-1 mapping is the closest available pattern for stored XSS; no more specific CAPEC ID for \u0027stored XSS via imported data rendered in a tooltip\u0027 exists in the CAPEC catalog.",
                      "The sanitize_text() helper is assumed to perform adequate HTML entity encoding or equivalent neutralization; its implementation is not shown in the patch.",
                      "VC:H and VI:H reflect the sensitivity of an intelligence-analysis platform where an authenticated analyst session may contain classified or highly sensitive data; if the deployment context is less sensitive, lower impact ratings could apply."
                    ],
                    "capecRationale": [
                      {
                        "capecId": "CAPEC-1",
                        "rationale": "CAPEC-1 describes the general pattern of injecting client-side scripts into web pages via untrusted input. The patch evidence shows a stored username (untrusted input from chats/forums) being rendered into an HTML tooltip without sanitization, matching the stored-XSS sub-pattern of CAPEC-1. This is the closest and most direct CAPEC mapping for an XSS vulnerability where attacker-controlled data is persisted and later rendered in a victim\u0027s browser."
                      }
                    ],
                    "commit": "455dd92c4179c53204368d93681ded4b57e31643",
                    "confidence": "medium",
                    "credits": [
                      {
                        "lang": "en",
                        "type": "remediation developer",
                        "value": "terrtia"
                      }
                    ],
                    "cvssRationale": "AV:N: The vulnerability is in a web application accessible over the network. AC:L: The attacker only needs to craft a username with HTML/JS in a chat or forum that gets crawled; no race conditions or complex conditions are needed. AT:N: No attack on the target system is required; the malicious username is stored as part of normal data import. PR:N: The attacker does not need any account or privilege on the AIL Framework; they only need to be a user in a source chat/forum. UI:A: The victim (analyst) must actively hover over the specific timeline entry to trigger script execution. VC:H: XSS in an authenticated analyst session can expose sensitive intelligence data, session tokens, and credentials. VI:H: The attacker can perform actions as the analyst, modify data, or exfiltrate information. VA:N: No impact on availability. SC/SI/SA:N: No subsequent system impact is evidenced.",
                    "fixSummary": "The fix applies the existing sanitize_text() helper to the user-controlled username value (d.obj) immediately before it is interpolated into the D3 tooltip HTML string. This ensures that any HTML or script content embedded in the stored username is neutralized before DOM insertion, preventing script execution while preserving the tooltip\u0027s intended formatting (line breaks and date/time display).",
                    "generatedAt": "2026-09-25T13:24:29.029450Z",
                    "generator": "patch2vuln.py",
                    "model": "qwen3.8:27b",
                    "modelComparison": {
                      "rankings": [
                        {
                          "agreementScore": 9,
                          "assumptionCount": 6,
                          "confidence": "medium",
                          "model": "qwen3.8:27b",
                          "score": 4
                        }
                      ],
                      "selectedModel": "qwen3.8:27b",
                      "selectionMethod": "deterministic-consensus-v1",
                      "selectionNotice": "The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required."
                    },
                    "patchSha256": "36262636a3a75bbee1ac4f863ce7a5ce7939eb2e21fed5ede98403d38c29ec40",
                    "patchSummary": "In var/www/static/js/d3/timeline_basic.js, the single line constructing the tooltip HTML was changed from tooltip.html(`${d.obj}\u003cbr\u003e...`) to tooltip.html(`${sanitize_text(d.obj)}\u003cbr\u003e...`). The only modification is wrapping the untrusted d.obj variable with the sanitize_text() function call at the HTML sink, leaving the rest of the tooltip template (br tags, date formatting) unchanged.",
                    "patchTruncated": false,
                    "patches": [
                      {
                        "commit": "455dd92c4179c53204368d93681ded4b57e31643",
                        "patchSha256": "36262636a3a75bbee1ac4f863ce7a5ce7939eb2e21fed5ede98403d38c29ec40",
                        "source": "https://github.com/ail-project/ail-framework/commit/455dd92c4179c53204368d93681ded4b57e31643.patch",
                        "sourceUrl": "https://github.com/ail-project/ail-framework/commit/455dd92c4179c53204368d93681ded4b57e31643.patch",
                        "subject": "chg: [security] fix XSS in username timeline tooltip."
                      }
                    ],
                    "source": "https://github.com/ail-project/ail-framework/commit/455dd92c4179c53204368d93681ded4b57e31643.patch",
                    "subject": "chg: [security] fix XSS in username timeline tooltip.",
                    "tagVersionBoundary": {
                      "commits_after_fix": 29,
                      "repository": "https://github.com/ail-project/ail-framework",
                      "tag": "v7.1",
                      "version": "7.1",
                      "version_type": "custom"
                    },
                    "weaknessRationale": [
                      {
                        "cweId": "CWE-79",
                        "rationale": "The patch inserts a user-controlled value (username from imported chats/forums) into an HTML context via D3\u0027s html() method without sanitization. The fix adds sanitize_text() at the sink, confirming the root cause is missing output encoding/neutralization of untrusted data in an HTML context, which is the definition of CWE-79 (stored XSS variant)."
                      }
                    ]
                  }
                }
              },
              "recordType": "advisory",
              "vulnId": "GCVE-1-2026-20279"
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
        "assignerShortName": "CIRCL",
        "cveId": "CVE-2026-100176",
        "datePublished": "2026-09-25T13:29:17.333Z",
        "dateReserved": "2026-09-25T13:29:14.017Z",
        "dateUpdated": "2026-09-25T14:59:28.644Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-100174 (GCVE-0-2026-100174)

    Vulnerability from cvelistv5 – Published: 2026-09-25 13:22 – Updated: 2026-09-25 15:14
    VLAI
    Title
    Stored Cross-Site Scripting (XSS) in AIL Framework Tag Selector via Unescaped Tag Names
    Summary
    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.
    SSVC
    Exploitation: none Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-09-25 15:14 UTC
    CWE
    • CWE-79 - Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
    • CWE-94 - Improper Control of Generation of Code ('Code Injection')
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: 0 , < 7.1 (semver)
    Create a notification for this product.
    GCVE extensions
    AI involvement GCVE-BCP-05-X-01
    Whole record AI-generated Not human-reviewed GNA-1

    Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.

    ai-computer-assisted:llm-generatedai-computer-assisted:classification
    Model Source Identifier
    qwen3.8:27b ollama qwen3.8:27b
    Patch provenance GCVE-BCP-05-X-02
    Generator
    patch2vuln.py on 2026-09-25 13:16
    Model
    qwen3.8:27b
    Input
    https://github.com/ail-project/ail-framework/commit/b2d0ed05f6cf79b2312a3f1f923d0d1a5d7a9edb.patch 2d147dabcc9b…
    Confidence
    medium
    Commit Subject Patch SHA-256
    b2d0ed05f6cf chg: [security] prevent stored XSS in 2d147dabcc9b…
    Fix summary

    The fix ensures that tag names and display values are rendered as plain text rather than as HTML when no custom renderer is explicitly configured. In the suggestion rendering path, the default (non-renderer) case now uses jQuery's .text() method, which HTML-escapes the content. In the selection rendering path, the default case uses document.createTextNode() to insert the value as a text node. Custom renderers, which are developer-supplied and trusted to produce safe HTML, continue to use .html() or .prepend() with raw HTML. The eval() call was also replaced with JSON.parse() to eliminate a code-injection vector.

    Patch summary

    In var/www/static/js/tags.js: (1) Replaced eval(data) with JSON.parse(data) for parsing array-like data strings. (2) In _renderComboItems, introduced a hasRenderer flag; when no custom renderer is set, the displayed value is inserted via resultItemEl.text(displayed) instead of the html property in the jQuery constructor. (3) In the selection rendering block, introduced a hasSelectionRenderer flag; when no custom selection renderer is set, the value is prepended as a text node via document.createTextNode(selectedItemHtml) instead of being set through the html property. (4) The comma separator for text-mode selections is now appended as a text node rather than concatenated into an HTML string.

    CVSS rationale

    AV:N: The vulnerability is exploitable over the network via a web application. AC:L: No race conditions or special timing are required; the payload is stored and triggers on page load. AT:N: No manipulation of the attack target is needed; the stored payload executes automatically. PR:L: The attacker needs a low-privilege authenticated account with permission to create custom tags. UI:P: The victim passively interacts by loading a page that contains the tag selector; no active click or download is required. VC:L: The XSS can read data from the victim's session and page context. VI:L: The XSS can modify page content and submit forms. VA:N: No availability impact is evident. SC:L: The compromised session can access other resources within the same origin. SI:L: The attacker can modify data through the victim's authenticated session. SA:N: No availability impact on subsequent components.

    Weakness rationale
    • CWE-79 The patch explicitly addresses stored XSS: user-controlled tag names were inserted into the DOM as HTML via jQuery's html property without escaping. The fix renders these values as text nodes, which is the canonical remediation for CWE-79. The commit subject line also explicitly states 'prevent stored XSS'.
    • CWE-94 The replacement of eval(data) with JSON.parse(data) addresses a secondary code-injection weakness where a crafted data string could execute arbitrary JavaScript. This is a contributing factor but the primary vulnerability is the stored XSS in tag rendering.
    Attack pattern rationale
    • CAPEC-66 CAPEC-66 describes the general XSS attack pattern where attacker-controlled input is reflected or stored and later rendered as executable content in a victim's browser. This patch fixes a stored XSS variant where malicious tag names are persisted and rendered as HTML. The mapping is direct and well-supported by the commit message and code changes. No more specific CAPEC entry for stored XSS in a tag/selector widget exists in the CAPEC catalog, making CAPEC-66 the closest and most appropriate match.
    Assumptions to verify
    • The affected version range is inferred from the tag_version_boundary metadata indicating the fix commit is 31 commits before the v7.1 tag; exact version boundaries are not explicitly stated in the patch.
    • The UI:P (Passive) rating assumes the victim only needs to load a page containing the tag selector; if the application requires the victim to explicitly open a specific dialog or widget, UI:A (Active) could be more appropriate.
    • The CAPEC-66 mapping is the closest available pattern; no CAPEC entry specifically covers stored XSS in a tag-selector UI component, so the general XSS pattern is used.
    • The PR:L rating assumes that creating a custom tag requires only a basic authenticated account; if tag creation requires elevated privileges, PR:H would be more appropriate.
    • The eval() to JSON.parse() change is treated as a secondary hardening fix within the same patch set; the primary vulnerability addressed is the stored XSS in tag rendering.
    • No specific reporter or finder is identified in the patch metadata or commit message; only the remediation developer (commit author) is credited.
    Model comparison

    Selected qwen3.8:27b by deterministic-consensus-v1
    The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required.

    Model Score Agreement Confidence Assumptions
    qwen3.8:27b 4 9 medium 6
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-100174",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-09-25T15:14:24.607198Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-09-25T15:14:51.969Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "modules": [
                "tag selector (tags.js)"
              ],
              "product": "ail framework",
              "programFiles": [
                "var/www/static/js/tags.js"
              ],
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThan": "7.1",
                  "status": "affected",
                  "version": "0",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Aurelien Thirion"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Jeroen Pinoy"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe 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., \u0026lt;img src=x onerror=alert(1)\u0026gt; or \u0026lt;svg onload=...\u0026gt;) 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\u0027s html property, causing the embedded script to execute in the victim\u0027s browser context.\u003c/p\u003e\u003cp\u003eThe 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\u0027s 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.\u003c/p\u003e\u003cp\u003ePreconditions: 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\u0027s stored tag. The attack is stored (persistent) and does not require the victim to perform any action beyond loading the page.\u003c/p\u003e\u003cp\u003eSecurity impact: successful exploitation allows arbitrary JavaScript execution in the victim\u0027s browser within the application\u0027s origin, potentially leading to session hijacking, unauthorized data access, form manipulation, or further client-side attacks.\u003c/p\u003e"
                }
              ],
              "value": "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., \u003cimg src=x onerror=alert(1)\u003e or \u003csvg onload=...\u003e) 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\u0027s html property, causing the embedded script to execute in the victim\u0027s browser context.\n\nThe 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\u0027s 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.\n\nPreconditions: 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\u0027s stored tag. The attack is stored (persistent) and does not require the victim to perform any action beyond loading the page.\n\nSecurity impact: successful exploitation allows arbitrary JavaScript execution in the victim\u0027s browser within the application\u0027s origin, potentially leading to session hijacking, unauthorized data access, form manipulation, or further client-side attacks."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-66",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-66 Cross Site Scripting (XSS)"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 5.1,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "LOW",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "LOW",
                "subIntegrityImpact": "LOW",
                "userInteraction": "PASSIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "LOW",
                "vulnIntegrityImpact": "LOW",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-79",
                  "description": "CWE-79 Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            },
            {
              "descriptions": [
                {
                  "cweId": "CWE-94",
                  "description": "CWE-94 Improper Control of Generation of Code (\u0027Code Injection\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-09-25T13:22:38.669Z",
            "orgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
            "shortName": "CIRCL"
          },
          "references": [
            {
              "name": "Security patch",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/b2d0ed05f6cf79b2312a3f1f923d0d1a5d7a9edb"
            }
          ],
          "solutions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe fix ensures that tag names and display values are rendered as plain text rather than as HTML when no custom renderer is explicitly configured. In the suggestion rendering path, the default (non-renderer) case now uses jQuery\u0027s .text() method, which HTML-escapes the content. In the selection rendering path, the default case uses document.createTextNode() to insert the value as a text node. Custom renderers, which are developer-supplied and trusted to produce safe HTML, continue to use .html() or .prepend() with raw HTML. The eval() call was also replaced with JSON.parse() to eliminate a code-injection vector.\u003c/p\u003e"
                }
              ],
              "value": "The fix ensures that tag names and display values are rendered as plain text rather than as HTML when no custom renderer is explicitly configured. In the suggestion rendering path, the default (non-renderer) case now uses jQuery\u0027s .text() method, which HTML-escapes the content. In the selection rendering path, the default case uses document.createTextNode() to insert the value as a text node. Custom renderers, which are developer-supplied and trusted to produce safe HTML, continue to use .html() or .prepend() with raw HTML. The eval() call was also replaced with JSON.parse() to eliminate a code-injection vector."
            }
          ],
          "title": "Stored Cross-Site Scripting (XSS) in AIL Framework Tag Selector via Unescaped Tag Names",
          "x_gcve": [
            {
              "extensions": {
                "bcp-05-x-01": {
                  "ai_annotations": [
                    {
                      "ai_level": "generated",
                      "description": "Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.",
                      "gna_source": 1,
                      "models": [
                        {
                          "gna_source": 1,
                          "identifier": "qwen3.8:27b",
                          "name": "qwen3.8:27b",
                          "source": "ollama"
                        }
                      ],
                      "review_status": "none",
                      "scope": "record",
                      "tags": [
                        "ai-computer-assisted:llm-generated",
                        "ai-computer-assisted:classification"
                      ]
                    }
                  ]
                },
                "bcp-05-x-02": {
                  "x_patch2vuln": {
                    "assumptions": [
                      "The affected version range is inferred from the tag_version_boundary metadata indicating the fix commit is 31 commits before the v7.1 tag; exact version boundaries are not explicitly stated in the patch.",
                      "The UI:P (Passive) rating assumes the victim only needs to load a page containing the tag selector; if the application requires the victim to explicitly open a specific dialog or widget, UI:A (Active) could be more appropriate.",
                      "The CAPEC-66 mapping is the closest available pattern; no CAPEC entry specifically covers stored XSS in a tag-selector UI component, so the general XSS pattern is used.",
                      "The PR:L rating assumes that creating a custom tag requires only a basic authenticated account; if tag creation requires elevated privileges, PR:H would be more appropriate.",
                      "The eval() to JSON.parse() change is treated as a secondary hardening fix within the same patch set; the primary vulnerability addressed is the stored XSS in tag rendering.",
                      "No specific reporter or finder is identified in the patch metadata or commit message; only the remediation developer (commit author) is credited."
                    ],
                    "capecRationale": [
                      {
                        "capecId": "CAPEC-66",
                        "rationale": "CAPEC-66 describes the general XSS attack pattern where attacker-controlled input is reflected or stored and later rendered as executable content in a victim\u0027s browser. This patch fixes a stored XSS variant where malicious tag names are persisted and rendered as HTML. The mapping is direct and well-supported by the commit message and code changes. No more specific CAPEC entry for stored XSS in a tag/selector widget exists in the CAPEC catalog, making CAPEC-66 the closest and most appropriate match."
                      }
                    ],
                    "commit": "b2d0ed05f6cf79b2312a3f1f923d0d1a5d7a9edb",
                    "confidence": "medium",
                    "credits": [
                      {
                        "lang": "en",
                        "type": "remediation developer",
                        "value": "terrtia"
                      }
                    ],
                    "cvssRationale": "AV:N: The vulnerability is exploitable over the network via a web application. AC:L: No race conditions or special timing are required; the payload is stored and triggers on page load. AT:N: No manipulation of the attack target is needed; the stored payload executes automatically. PR:L: The attacker needs a low-privilege authenticated account with permission to create custom tags. UI:P: The victim passively interacts by loading a page that contains the tag selector; no active click or download is required. VC:L: The XSS can read data from the victim\u0027s session and page context. VI:L: The XSS can modify page content and submit forms. VA:N: No availability impact is evident. SC:L: The compromised session can access other resources within the same origin. SI:L: The attacker can modify data through the victim\u0027s authenticated session. SA:N: No availability impact on subsequent components.",
                    "fixSummary": "The fix ensures that tag names and display values are rendered as plain text rather than as HTML when no custom renderer is explicitly configured. In the suggestion rendering path, the default (non-renderer) case now uses jQuery\u0027s .text() method, which HTML-escapes the content. In the selection rendering path, the default case uses document.createTextNode() to insert the value as a text node. Custom renderers, which are developer-supplied and trusted to produce safe HTML, continue to use .html() or .prepend() with raw HTML. The eval() call was also replaced with JSON.parse() to eliminate a code-injection vector.",
                    "generatedAt": "2026-09-25T13:16:06.156442Z",
                    "generator": "patch2vuln.py",
                    "model": "qwen3.8:27b",
                    "modelComparison": {
                      "rankings": [
                        {
                          "agreementScore": 9,
                          "assumptionCount": 6,
                          "confidence": "medium",
                          "model": "qwen3.8:27b",
                          "score": 4
                        }
                      ],
                      "selectedModel": "qwen3.8:27b",
                      "selectionMethod": "deterministic-consensus-v1",
                      "selectionNotice": "The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required."
                    },
                    "patchSha256": "2d147dabcc9bebce7722917d80f13e49a10f9a2a4089ec6207cce9edb9187f77",
                    "patchSummary": "In var/www/static/js/tags.js: (1) Replaced eval(data) with JSON.parse(data) for parsing array-like data strings. (2) In _renderComboItems, introduced a hasRenderer flag; when no custom renderer is set, the displayed value is inserted via resultItemEl.text(displayed) instead of the html property in the jQuery constructor. (3) In the selection rendering block, introduced a hasSelectionRenderer flag; when no custom selection renderer is set, the value is prepended as a text node via document.createTextNode(selectedItemHtml) instead of being set through the html property. (4) The comma separator for text-mode selections is now appended as a text node rather than concatenated into an HTML string.",
                    "patchTruncated": false,
                    "patches": [
                      {
                        "commit": "b2d0ed05f6cf79b2312a3f1f923d0d1a5d7a9edb",
                        "patchSha256": "2d147dabcc9bebce7722917d80f13e49a10f9a2a4089ec6207cce9edb9187f77",
                        "source": "https://github.com/ail-project/ail-framework/commit/b2d0ed05f6cf79b2312a3f1f923d0d1a5d7a9edb.patch",
                        "sourceUrl": "https://github.com/ail-project/ail-framework/commit/b2d0ed05f6cf79b2312a3f1f923d0d1a5d7a9edb.patch",
                        "subject": "chg: [security] prevent stored XSS in"
                      }
                    ],
                    "source": "https://github.com/ail-project/ail-framework/commit/b2d0ed05f6cf79b2312a3f1f923d0d1a5d7a9edb.patch",
                    "subject": "chg: [security] prevent stored XSS in",
                    "tagVersionBoundary": {
                      "commits_after_fix": 31,
                      "repository": "https://github.com/ail-project/ail-framework",
                      "tag": "v7.1",
                      "version": "7.1",
                      "version_type": "custom"
                    },
                    "weaknessRationale": [
                      {
                        "cweId": "CWE-79",
                        "rationale": "The patch explicitly addresses stored XSS: user-controlled tag names were inserted into the DOM as HTML via jQuery\u0027s html property without escaping. The fix renders these values as text nodes, which is the canonical remediation for CWE-79. The commit subject line also explicitly states \u0027prevent stored XSS\u0027."
                      },
                      {
                        "cweId": "CWE-94",
                        "rationale": "The replacement of eval(data) with JSON.parse(data) addresses a secondary code-injection weakness where a crafted data string could execute arbitrary JavaScript. This is a contributing factor but the primary vulnerability is the stored XSS in tag rendering."
                      }
                    ]
                  }
                }
              },
              "recordType": "advisory",
              "vulnId": "GCVE-1-2026-20269"
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
        "assignerShortName": "CIRCL",
        "cveId": "CVE-2026-100174",
        "datePublished": "2026-09-25T13:22:38.669Z",
        "dateReserved": "2026-09-25T13:22:15.197Z",
        "dateUpdated": "2026-09-25T15:14:51.969Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-100172 (GCVE-0-2026-100172)

    Vulnerability from cvelistv5 – Published: 2026-09-25 13:13 – Updated: 2026-09-25 15:19
    VLAI
    Title
    Stored XSS in AIL Framework extracted-match popovers via unescaped dynamic values in HTML-enabled data-content attributes
    Summary
    The AIL Framework (ail-project/ail-framework) contains a stored cross-site scripting (XSS) vulnerability in two Jinja2 templates that render popovers for matched, tracked, or tagged content: var/www/templates/chats_explorer/block_message.html and var/www/templates/objects/item/show_item.html. In both templates, dynamic values associated with this content, including icon color, icon style, icon glyph, subtype, identifier, name, description, and matched value, are interpolated directly into the data-content HTML attribute of Bootstrap popover elements without appropriate output encoding. Because the popovers are configured with data-html="true", the content is interpreted as HTML in the victim's browser. An authenticated attacker who can influence matched, tracked, or tagged content may inject arbitrary HTML or JavaScript into these values. When a victim displays the affected popover, the injected markup may execute in the victim's session, potentially enabling data exfiltration or actions with the victim's privileges. The vulnerability is classified as stored XSS because the malicious payload can persist in the affected match, tracking, or tag-related data and be delivered to users who view the affected content.
    SSVC
    Exploitation: none Automatable: no Technical Impact: total
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-09-25 15:15 UTC
    CWE
    • CWE-79 - Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: unspecified , < 7.1 (semver)
    Create a notification for this product.
    GCVE extensions
    AI involvement GCVE-BCP-05-X-01
    Whole record AI-generated Not human-reviewed GNA-1

    Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.

    ai-computer-assisted:llm-generatedai-computer-assisted:classification
    Model Source Identifier
    qwen3.8:27b ollama qwen3.8:27b
    Patch provenance GCVE-BCP-05-X-02
    Generator
    patch2vuln.py on 2026-09-25 12:56
    Model
    qwen3.8:27b
    Input
    https://github.com/ail-project/ail-framework/commit/ee63a0a96646790255e038f5ca5dd0ab5fe98db2.patch bd188338f882…
    Confidence
    medium
    Commit Subject Patch SHA-256
    ee63a0a96646 chg: [security] fix XSS in show item and message popover of bd188338f882…
    Fix summary

    The fix applies double HTML-escaping (Jinja2 forceescape|forceescape) to every dynamic value interpolated into the HTML-enabled data-content attribute of the popover elements in both templates. Double-escaping is required because the values must survive both the outer HTML attribute context and the inner HTML parsing performed by the popover plugin. This neutralizes any HTML or script injection from the extracted-match fields.

    Patch summary

    In block_message.html and show_item.html, the Jinja2 expressions for extracted_matches fields (icon color, icon style, icon, subtype, id, name, description) and the matched value r[1] are each suffixed with |forceescape|forceescape. No other logic, routing, or configuration changes are made. Two lines changed in total (one per file).

    CVSS rationale

    AV:N: web application reachable over the network. AC:L: crafting a message or item with a malicious extracted-match value requires no special race or timing. AT:N: no manipulation of the attack target is needed. PR:L: the attacker must be an authenticated user capable of creating or modifying chat messages or items. UI:P: the victim must passively interact (hover over the element) to trigger the popover rendering; no click or explicit action is required. VC:H: the injected script can read session cookies, DOM data, and API responses in the victim's browser. VI:H: the script can perform authenticated actions on behalf of the victim (create, modify, delete data). VA:N: no direct denial-of-service impact is evident. SC/SI/SA:N: the subcomponent (the AIL Framework server) is not directly compromised; the impact is confined to the victim's browser session.

    Weakness rationale
    • CWE-79 Dynamic values from extracted-match data are interpolated into an HTML-enabled attribute without output encoding, allowing script injection. The fix adds forceescape, confirming the root cause is missing output encoding in an HTML context. CWE-79 is the precise weakness.
    Attack pattern rationale
    • CAPEC-1 The patch directly addresses stored XSS: attacker-controlled content is persisted in application data (chat messages, items) and rendered as executable HTML in a victim's browser via an unescaped data-content attribute. CAPEC-1 is the canonical attack pattern for XSS and is the closest match. No uncertainty in this mapping.
    Assumptions to verify
    • The AIL Framework requires authenticated access to create or modify chat messages and items; PR:L is assumed based on the application being a threat-intelligence platform with user accounts.
    • The extracted-match data (icon color, style, subtype, id, name, description) can be influenced by an authenticated user through normal application workflows (e.g., submitting content that the extraction pipeline processes).
    • The popover is triggered on hover (data-trigger="hover"), classified as passive user interaction (UI:P).
    • The tag v7.1 boundary with 143 commits after the fix suggests the fix landed before v7.1, but exact affected version ranges are not confirmed by the patch alone.
    • CAPEC-1 is selected as the closest standard attack pattern; no more specific CAPEC for stored XSS in HTML attributes exists in the CAPEC catalog.
    Model comparison

    Selected qwen3.8:27b by deterministic-consensus-v1
    The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required.

    Model Score Agreement Confidence Assumptions
    qwen3.8:27b 5 9 medium 5
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-100172",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "total"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-09-25T15:15:12.313075Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-09-25T15:19:12.598Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "modules": [
                "chats_explorer (block_message.html)",
                "objects/item (show_item.html)"
              ],
              "product": "ail framework",
              "programFiles": [
                "var/www/templates/chats_explorer/block_message.html",
                "var/www/templates/objects/item/show_item.html"
              ],
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThan": "7.1",
                  "status": "affected",
                  "version": "unspecified",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Aurelien Thirion"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Jeroen Pinoy"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe AIL Framework (ail-project/ail-framework) contains a stored cross-site scripting (XSS) vulnerability in two Jinja2 templates that render popovers for matched, tracked, or tagged content: var/www/templates/chats_explorer/block_message.html and var/www/templates/objects/item/show_item.html. In both templates, dynamic values associated with this content, including icon color, icon style, icon glyph, subtype, identifier, name, description, and matched value, are interpolated directly into the data-content HTML attribute of Bootstrap popover elements without appropriate output encoding. Because the popovers are configured with data-html=\"true\", the content is interpreted as HTML in the victim\u0027s browser. An authenticated attacker who can influence matched, tracked, or tagged content may inject arbitrary HTML or JavaScript into these values. When a victim displays the affected popover, the injected markup may execute in the victim\u0027s session, potentially enabling data exfiltration or actions with the victim\u0027s privileges. The vulnerability is classified as stored XSS because the malicious payload can persist in the affected match, tracking, or tag-related data and be delivered to users who view the affected content.\u003c/p\u003e"
                }
              ],
              "value": "The AIL Framework (ail-project/ail-framework) contains a stored cross-site scripting (XSS) vulnerability in two Jinja2 templates that render popovers for matched, tracked, or tagged content: var/www/templates/chats_explorer/block_message.html and var/www/templates/objects/item/show_item.html. In both templates, dynamic values associated with this content, including icon color, icon style, icon glyph, subtype, identifier, name, description, and matched value, are interpolated directly into the data-content HTML attribute of Bootstrap popover elements without appropriate output encoding. Because the popovers are configured with data-html=\"true\", the content is interpreted as HTML in the victim\u0027s browser. An authenticated attacker who can influence matched, tracked, or tagged content may inject arbitrary HTML or JavaScript into these values. When a victim displays the affected popover, the injected markup may execute in the victim\u0027s session, potentially enabling data exfiltration or actions with the victim\u0027s privileges. The vulnerability is classified as stored XSS because the malicious payload can persist in the affected match, tracking, or tag-related data and be delivered to users who view the affected content."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-1",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-1 Cross Site Scripting (XSS)"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 8.5,
                "baseSeverity": "HIGH",
                "privilegesRequired": "LOW",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "PASSIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "HIGH",
                "vulnIntegrityImpact": "HIGH",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-79",
                  "description": "CWE-79 Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-09-25T13:13:56.996Z",
            "orgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
            "shortName": "CIRCL"
          },
          "references": [
            {
              "name": "Security patch",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/ee63a0a96646790255e038f5ca5dd0ab5fe98db2"
            }
          ],
          "solutions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe fix applies double HTML-escaping (Jinja2 forceescape|forceescape) to every dynamic value interpolated into the HTML-enabled data-content attribute of the popover elements in both templates. Double-escaping is required because the values must survive both the outer HTML attribute context and the inner HTML parsing performed by the popover plugin. This neutralizes any HTML or script injection from the extracted-match fields.\u003c/p\u003e"
                }
              ],
              "value": "The fix applies double HTML-escaping (Jinja2 forceescape|forceescape) to every dynamic value interpolated into the HTML-enabled data-content attribute of the popover elements in both templates. Double-escaping is required because the values must survive both the outer HTML attribute context and the inner HTML parsing performed by the popover plugin. This neutralizes any HTML or script injection from the extracted-match fields."
            }
          ],
          "title": "Stored XSS in AIL Framework extracted-match popovers via unescaped dynamic values in HTML-enabled data-content attributes",
          "x_gcve": [
            {
              "extensions": {
                "bcp-05-x-01": {
                  "ai_annotations": [
                    {
                      "ai_level": "generated",
                      "description": "Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.",
                      "gna_source": 1,
                      "models": [
                        {
                          "gna_source": 1,
                          "identifier": "qwen3.8:27b",
                          "name": "qwen3.8:27b",
                          "source": "ollama"
                        }
                      ],
                      "review_status": "none",
                      "scope": "record",
                      "tags": [
                        "ai-computer-assisted:llm-generated",
                        "ai-computer-assisted:classification"
                      ]
                    }
                  ]
                },
                "bcp-05-x-02": {
                  "x_patch2vuln": {
                    "assumptions": [
                      "The AIL Framework requires authenticated access to create or modify chat messages and items; PR:L is assumed based on the application being a threat-intelligence platform with user accounts.",
                      "The extracted-match data (icon color, style, subtype, id, name, description) can be influenced by an authenticated user through normal application workflows (e.g., submitting content that the extraction pipeline processes).",
                      "The popover is triggered on hover (data-trigger=\"hover\"), classified as passive user interaction (UI:P).",
                      "The tag v7.1 boundary with 143 commits after the fix suggests the fix landed before v7.1, but exact affected version ranges are not confirmed by the patch alone.",
                      "CAPEC-1 is selected as the closest standard attack pattern; no more specific CAPEC for stored XSS in HTML attributes exists in the CAPEC catalog."
                    ],
                    "capecRationale": [
                      {
                        "capecId": "CAPEC-1",
                        "rationale": "The patch directly addresses stored XSS: attacker-controlled content is persisted in application data (chat messages, items) and rendered as executable HTML in a victim\u0027s browser via an unescaped data-content attribute. CAPEC-1 is the canonical attack pattern for XSS and is the closest match. No uncertainty in this mapping."
                      }
                    ],
                    "commit": "ee63a0a96646790255e038f5ca5dd0ab5fe98db2",
                    "confidence": "medium",
                    "credits": [
                      {
                        "lang": "en",
                        "type": "remediation developer",
                        "value": "terrtia"
                      }
                    ],
                    "cvssRationale": "AV:N: web application reachable over the network. AC:L: crafting a message or item with a malicious extracted-match value requires no special race or timing. AT:N: no manipulation of the attack target is needed. PR:L: the attacker must be an authenticated user capable of creating or modifying chat messages or items. UI:P: the victim must passively interact (hover over the element) to trigger the popover rendering; no click or explicit action is required. VC:H: the injected script can read session cookies, DOM data, and API responses in the victim\u0027s browser. VI:H: the script can perform authenticated actions on behalf of the victim (create, modify, delete data). VA:N: no direct denial-of-service impact is evident. SC/SI/SA:N: the subcomponent (the AIL Framework server) is not directly compromised; the impact is confined to the victim\u0027s browser session.",
                    "fixSummary": "The fix applies double HTML-escaping (Jinja2 forceescape|forceescape) to every dynamic value interpolated into the HTML-enabled data-content attribute of the popover elements in both templates. Double-escaping is required because the values must survive both the outer HTML attribute context and the inner HTML parsing performed by the popover plugin. This neutralizes any HTML or script injection from the extracted-match fields.",
                    "generatedAt": "2026-09-25T12:56:24.137641Z",
                    "generator": "patch2vuln.py",
                    "model": "qwen3.8:27b",
                    "modelComparison": {
                      "rankings": [
                        {
                          "agreementScore": 9,
                          "assumptionCount": 5,
                          "confidence": "medium",
                          "model": "qwen3.8:27b",
                          "score": 5
                        }
                      ],
                      "selectedModel": "qwen3.8:27b",
                      "selectionMethod": "deterministic-consensus-v1",
                      "selectionNotice": "The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required."
                    },
                    "patchSha256": "bd188338f8828ab59743776228d2991b51a3f83b870dedf073a54c6139ad9e26",
                    "patchSummary": "In block_message.html and show_item.html, the Jinja2 expressions for extracted_matches fields (icon color, icon style, icon, subtype, id, name, description) and the matched value r[1] are each suffixed with |forceescape|forceescape. No other logic, routing, or configuration changes are made. Two lines changed in total (one per file).",
                    "patchTruncated": false,
                    "patches": [
                      {
                        "commit": "ee63a0a96646790255e038f5ca5dd0ab5fe98db2",
                        "patchSha256": "bd188338f8828ab59743776228d2991b51a3f83b870dedf073a54c6139ad9e26",
                        "source": "https://github.com/ail-project/ail-framework/commit/ee63a0a96646790255e038f5ca5dd0ab5fe98db2.patch",
                        "sourceUrl": "https://github.com/ail-project/ail-framework/commit/ee63a0a96646790255e038f5ca5dd0ab5fe98db2.patch",
                        "subject": "chg: [security] fix XSS in show item and message popover of"
                      }
                    ],
                    "source": "https://github.com/ail-project/ail-framework/commit/ee63a0a96646790255e038f5ca5dd0ab5fe98db2.patch",
                    "subject": "chg: [security] fix XSS in show item and message popover of",
                    "tagVersionBoundary": {
                      "commits_after_fix": 143,
                      "repository": "https://github.com/ail-project/ail-framework",
                      "tag": "v7.1",
                      "version": "7.1",
                      "version_type": "custom"
                    },
                    "weaknessRationale": [
                      {
                        "cweId": "CWE-79",
                        "rationale": "Dynamic values from extracted-match data are interpolated into an HTML-enabled attribute without output encoding, allowing script injection. The fix adds forceescape, confirming the root cause is missing output encoding in an HTML context. CWE-79 is the precise weakness."
                      }
                    ]
                  }
                }
              },
              "recordType": "advisory",
              "vulnId": "GCVE-1-2026-20239"
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
        "assignerShortName": "CIRCL",
        "cveId": "CVE-2026-100172",
        "datePublished": "2026-09-25T13:13:56.996Z",
        "dateReserved": "2026-09-25T13:13:52.747Z",
        "dateUpdated": "2026-09-25T15:19:12.598Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-56450 (GCVE-0-2026-56450)

    Vulnerability from cvelistv5 – Published: 2026-06-22 13:02 – Updated: 2026-06-22 15:48
    VLAI
    Title
    AIL Framework - Missing Rate Limiting Enables Brute-Force Attacks Against Two-Factor Authentication Codes
    Summary
    AIL did not restrict repeated failed attempts to verify a two-factor authentication (OTP) code. An attacker who had reached the 2FA verification step, such as after successfully completing the password-authentication stage, could submit an unlimited number of OTP guesses. This could enable brute-force guessing of a valid code and bypass the intended second authentication factor, resulting in unauthorized account access. The patch introduces per-user failed-OTP tracking, blocks verification after 30 failed attempts for one hour, clears the counter after a successful OTP verification, and provides administrator recovery actions to purge affected lockouts.
    SSVC
    Exploitation: none Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-06-22 15:48 UTC
    CWE
    • CWE-307 - Improper Restriction of Excessive Authentication Attempts
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: 0 , ≤ 6.8.0 (semver)
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-56450",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-06-22T15:48:34.062796Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-06-22T15:48:49.228Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "defaultStatus": "unaffected",
              "product": "ail framework",
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThanOrEqual": "6.8.0",
                  "status": "affected",
                  "version": "0",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Aurelien Thirion"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Stephen O"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eAIL did not restrict repeated failed attempts to verify a two-factor authentication (OTP) code. An attacker who had reached the 2FA verification step, such as after successfully completing the password-authentication stage, could submit an unlimited number of OTP guesses. This could enable brute-force guessing of a valid code and bypass the intended second authentication factor, resulting in unauthorized account access.\u003c/p\u003e\n\u003cp\u003eThe patch introduces per-user failed-OTP tracking, blocks verification after 30 failed attempts for one hour, clears the counter after a successful OTP verification, and provides administrator recovery actions to purge affected lockouts.\u003c/p\u003e\u003cbr\u003e"
                }
              ],
              "value": "AIL did not restrict repeated failed attempts to verify a two-factor authentication (OTP) code. An attacker who had reached the 2FA verification step, such as after successfully completing the password-authentication stage, could submit an unlimited number of OTP guesses. This could enable brute-force guessing of a valid code and bypass the intended second authentication factor, resulting in unauthorized account access.\n\n\nThe patch introduces per-user failed-OTP tracking, blocks verification after 30 failed attempts for one hour, clears the counter after a successful OTP verification, and provides administrator recovery actions to purge affected lockouts."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-112",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-112 Brute Force"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 5.1,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "ACTIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "LOW",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-307",
                  "description": "CWE-307 Improper Restriction of Excessive Authentication Attempts",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-06-22T13:02:30.320Z",
            "orgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
            "shortName": "CIRCL"
          },
          "references": [
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/d3a394fe68fd5aeee86f3a3c91d4a0350f91e974"
            }
          ],
          "source": {
            "discovery": "UNKNOWN"
          },
          "title": "AIL Framework - Missing Rate Limiting Enables Brute-Force Attacks Against Two-Factor Authentication Codes",
          "x_generator": {
            "engine": "Vulnogram 0.2.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
        "assignerShortName": "CIRCL",
        "cveId": "CVE-2026-56450",
        "datePublished": "2026-06-22T13:02:30.320Z",
        "dateReserved": "2026-06-22T13:02:27.234Z",
        "dateUpdated": "2026-06-22T15:48:49.228Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-56448 (GCVE-0-2026-56448)

    Vulnerability from cvelistv5 – Published: 2026-06-22 12:54 – Updated: 2026-06-22 15:48
    VLAI
    Title
    Authenticated Path Traversal in AIL Framework Investigation Downloads Allows Arbitrary File Read
    Summary
    A path traversal vulnerability exists in AIL Framework before the release containing commit 0041456af25da0cdea1c1c4624e46baff2731d8f. An authenticated AIL user can supply crafted object identifiers through the investigation workflow to cause file paths to resolve outside the intended image, favicon, or screenshot storage directories. This may allow the attacker to download and read arbitrary files that are accessible to the AIL process. The issue occurs because user-controlled path components were joined with application storage paths without verifying that the resolved path remained within the expected directory. The affected download functionality could then include the contents of such files in a generated archive.
    SSVC
    Exploitation: none Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-06-22 15:47 UTC
    CWE
    • CWE-22 - Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: 0 , ≤ 6.8.0 (semver)
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-56448",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-06-22T15:47:56.194887Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-06-22T15:48:10.172Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "defaultStatus": "unaffected",
              "product": "ail framework",
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThanOrEqual": "6.8.0",
                  "status": "affected",
                  "version": "0",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Aurelien Thirion"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Stephen O"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Tom\u00e1s Illuminati"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eA path traversal vulnerability exists in AIL Framework before the release containing commit \u003ccode\u003e0041456af25da0cdea1c1c4624e46baff2731d8f\u003c/code\u003e. An authenticated AIL user can supply crafted object identifiers through the investigation workflow to cause file paths to resolve outside the intended image, favicon, or screenshot storage directories. This may allow the attacker to download and read arbitrary files that are accessible to the AIL process.\u003c/p\u003e\u003cp\u003eThe issue occurs because user-controlled path components were joined with application storage paths without verifying that the resolved path remained within the expected directory. The affected download functionality could then include the contents of such files in a generated archive.\u003c/p\u003e\u003cbr\u003e"
                }
              ],
              "value": "A path traversal vulnerability exists in AIL Framework before the release containing commit 0041456af25da0cdea1c1c4624e46baff2731d8f. An authenticated AIL user can supply crafted object identifiers through the investigation workflow to cause file paths to resolve outside the intended image, favicon, or screenshot storage directories. This may allow the attacker to download and read arbitrary files that are accessible to the AIL process.\n\nThe issue occurs because user-controlled path components were joined with application storage paths without verifying that the resolved path remained within the expected directory. The affected download functionality could then include the contents of such files in a generated archive."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-126",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-126 Path Traversal"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "PRESENT",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 8.3,
                "baseSeverity": "HIGH",
                "privilegesRequired": "LOW",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "HIGH",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N/S:P",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "HIGH",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-22",
                  "description": "CWE-22 Improper Limitation of a Pathname to a Restricted Directory (\u0027Path Traversal\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-06-22T12:54:42.423Z",
            "orgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
            "shortName": "CIRCL"
          },
          "references": [
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/0041456af25da0cdea1c1c4624e46baff2731d8f"
            }
          ],
          "source": {
            "discovery": "UNKNOWN"
          },
          "title": "Authenticated Path Traversal in AIL Framework Investigation Downloads Allows Arbitrary File Read",
          "x_generator": {
            "engine": "Vulnogram 0.2.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
        "assignerShortName": "CIRCL",
        "cveId": "CVE-2026-56448",
        "datePublished": "2026-06-22T12:54:42.423Z",
        "dateReserved": "2026-06-22T12:54:39.454Z",
        "dateUpdated": "2026-06-22T15:48:10.172Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    GCVE-1-2026-20292 (CVE-2026-100190)

    Vulnerability from gna-1 – Published: 2026-09-25 13:49 – Updated: 2026-09-25 13:52
    VLAI
    Title
    Stored Cross-Site Scripting (XSS) via Crawler Capture Import in AIL Framework showDomain Page
    Summary
    The AIL Framework crawler splash domain page (showDomain.html) is vulnerable to stored cross-site script injection (XSS). User-supplied data originating from imported crawler captures—specifically item IDs, URLs, and screenshot file paths—was interpolated directly into inline JavaScript contexts within the HTML template. This included an onclick attribute that embedded raw screenshot and URL values into a JavaScript function call, and an inline script block that assigned a screenshot value to a JavaScript variable without escaping. An attacker with a user-role API client could craft a malicious crawler capture import containing JavaScript payloads in these fields. When any user (including privileged users) subsequently viewed the affected domain page, the injected script would execute in the victim's browser context, potentially allowing session hijacking, data exfiltration, or unauthorized actions on behalf of the victim. The vulnerability is stored in the application's data layer and triggered upon page rendering, requiring no further interaction beyond loading the domain view.
    CWE
    • CWE-79 - Improper Neutralization of Input in Web Page ('Cross-site Scripting')
    Assigner
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: unspecified , < 7.1 (semver)
    Create a notification for this product.
    GCVE extensions
    AI involvement GCVE-BCP-05-X-01
    Whole record AI-generated Human-reviewed GNA-1

    Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model.

    ai-computer-assisted:llm-generatedai-computer-assisted:classification
    Model Source Identifier
    qwen3.8:27b ollama qwen3.8:27b
    Patch provenance GCVE-BCP-05-X-02
    Generator
    patch2vuln.py on 2026-09-25 13:45
    Model
    qwen3.8:27b
    Input
    https://github.com/ail-project/ail-framework/commit/31376ee3d04519c898bb9b3671453a41c4117340.patch c110d16dd8ee…
    Confidence
    medium
    Commit Subject Patch SHA-256
    31376ee3d045 chg: [security] prevent stored XSS through imported capture c110d16dd8ee…
    Fix summary

    The fix removes all capture-derived values (item IDs, URLs, screenshot paths) from inline JavaScript contexts (onclick attributes and inline script variable assignments). These values are now stored in HTML data attributes (data-screenshot, data-url, data-item-id), which are properly HTML-escaped by the Jinja2 template engine. Screenshot click handlers are bound programmatically via addEventListener on elements with a .reload-image class, and the reload_image function reads values from the DOM element's dataset rather than receiving raw string parameters. Additionally, item IDs are URL-encoded with encodeURIComponent before being appended to link hrefs, preventing injection through the ID field.

    Patch summary

    In showDomain.html: (1) Replaced inline onclick="reload_image('...')" with a data-attribute-based approach using data-screenshot, data-url, and data-item-id attributes on the table cell element, plus a .reload-image CSS class. (2) Removed the inline script block that assigned screenshot, URL, and ID values directly into JavaScript variables via Jinja2 interpolation; replaced with dataset reads from the domain_screenshot img element. (3) Changed reload_image() to accept a DOM element and read values from element.dataset instead of raw string arguments. (4) Added a programmatic event binding loop using document.querySelectorAll('.reload-image').forEach() with addEventListener('click'). (5) Applied encodeURIComponent() to item IDs when constructing screenshot link hrefs. (6) Changed the href URL construction to use url_for with keyword arguments instead of string interpolation.

    CVSS rationale

    AV:N: Exploitable over the network via the web application. AC:L: No special race conditions or complex setup; a crafted capture import suffices. AT:N: No manipulation of the attack target required. PR:L: Requires a user-role API client to import a malicious crawler capture (authenticated, low privilege). UI:P: The stored XSS in the inline script block executes passively when the victim loads the domain page; no click or active interaction is needed for the inline script vector. VC:N/VI:N/VA:N: The vulnerable component (server-side application) is not directly compromised in confidentiality, integrity, or availability. SC:H: Scope changes to the victim's browser session, enabling theft of session tokens, cookies, and sensitive data. SI:H: Scope integrity is impacted as the attacker can perform arbitrary actions in the victim's authenticated session. SA:N: No meaningful impact on the availability of the attacker's scope.

    Weakness rationale
    • CWE-79 The patch explicitly addresses stored XSS by removing user-controlled values (screenshot paths, URLs, item IDs from crawler capture imports) from inline JavaScript contexts and replacing them with properly escaped data attributes and programmatic event binding. The commit message confirms the intent: 'prevent stored XSS through imported capture metadata in showDomain.'
    Attack pattern rationale
    • CAPEC-1 The patch directly remediates a stored XSS vector where attacker-controlled data from a crawler capture import is reflected into inline JavaScript without neutralization. CAPEC-1 is the canonical attack pattern for XSS. The specific sub-variant is stored (persistent) XSS via a data import mechanism, but CAPEC-1 is the closest and most appropriate mapping available in the CAPEC catalog.
    Assumptions to verify
    • The UI:P (Passive) rating assumes the inline script vector (screenshot variable assignment) executes on page load without requiring a user click. The onclick vector would require UI:A, but the inline script vector is sufficient for exploitation.
    • PR:L assumes the attacker needs a user-role API client to import a crafted crawler capture, as stated in the commit message. The exact privilege level and authentication mechanism are not further specified in the patch.
    • The version boundary 'less_than 7.1' is inferred from the tag_version_boundary metadata showing 21 commits after the fix before the v7.1 tag, suggesting the fix is included in v7.1. Exact affected version ranges are not confirmed.
    • CAPEC-1 is selected as the closest available attack pattern for stored XSS; no more specific CAPEC for stored XSS via data import exists in the catalog.
    • The patch does not include test cases or additional context about whether other template files have similar inline JavaScript interpolation patterns; this advisory covers only the single file in the patch.
    Model comparison

    Selected qwen3.8:27b by deterministic-consensus-v1
    The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required.

    Model Score Agreement Confidence Assumptions
    qwen3.8:27b 5 9 medium 5

    {
      "containers": {
        "cna": {
          "affected": [
            {
              "defaultStatus": "unaffected",
              "modules": [
                "crawler/crawler_splash"
              ],
              "product": "ail framework",
              "programFiles": [
                "var/www/templates/crawler/crawler_splash/showDomain.html"
              ],
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThan": "7.1",
                  "status": "affected",
                  "version": "unspecified",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Aurelien Thirion"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Jeroen Pinoy"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe AIL Framework crawler splash domain page (showDomain.html) is vulnerable to stored cross-site script injection (XSS). User-supplied data originating from imported crawler captures\u2014specifically item IDs, URLs, and screenshot file paths\u2014was interpolated directly into inline JavaScript contexts within the HTML template. This included an onclick attribute that embedded raw screenshot and URL values into a JavaScript function call, and an inline script block that assigned a screenshot value to a JavaScript variable without escaping. An attacker with a user-role API client could craft a malicious crawler capture import containing JavaScript payloads in these fields. When any user (including privileged users) subsequently viewed the affected domain page, the injected script would execute in the victim\u0027s browser context, potentially allowing session hijacking, data exfiltration, or unauthorized actions on behalf of the victim. The vulnerability is stored in the application\u0027s data layer and triggered upon page rendering, requiring no further interaction beyond loading the domain view.\u003c/p\u003e"
                }
              ],
              "value": "The AIL Framework crawler splash domain page (showDomain.html) is vulnerable to stored cross-site script injection (XSS). User-supplied data originating from imported crawler captures\u2014specifically item IDs, URLs, and screenshot file paths\u2014was interpolated directly into inline JavaScript contexts within the HTML template. This included an onclick attribute that embedded raw screenshot and URL values into a JavaScript function call, and an inline script block that assigned a screenshot value to a JavaScript variable without escaping. An attacker with a user-role API client could craft a malicious crawler capture import containing JavaScript payloads in these fields. When any user (including privileged users) subsequently viewed the affected domain page, the injected script would execute in the victim\u0027s browser context, potentially allowing session hijacking, data exfiltration, or unauthorized actions on behalf of the victim. The vulnerability is stored in the application\u0027s data layer and triggered upon page rendering, requiring no further interaction beyond loading the domain view."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-1",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-1 Cross Site Scripting (XSS)"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 6.3,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "LOW",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "HIGH",
                "subIntegrityImpact": "HIGH",
                "userInteraction": "PASSIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:N/VI:N/VA:N/SC:H/SI:H/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-79",
                  "description": "CWE-79 Improper Neutralization of Input in Web Page (\u0027Cross-site Scripting\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "orgId": "00000000-0000-4000-9000-000000000000"
          },
          "references": [
            {
              "name": "Security patch",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/31376ee3d04519c898bb9b3671453a41c4117340"
            }
          ],
          "solutions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe fix removes all capture-derived values (item IDs, URLs, screenshot paths) from inline JavaScript contexts (onclick attributes and inline script variable assignments). These values are now stored in HTML data attributes (data-screenshot, data-url, data-item-id), which are properly HTML-escaped by the Jinja2 template engine. Screenshot click handlers are bound programmatically via addEventListener on elements with a .reload-image class, and the reload_image function reads values from the DOM element\u0027s dataset rather than receiving raw string parameters. Additionally, item IDs are URL-encoded with encodeURIComponent before being appended to link hrefs, preventing injection through the ID field.\u003c/p\u003e"
                }
              ],
              "value": "The fix removes all capture-derived values (item IDs, URLs, screenshot paths) from inline JavaScript contexts (onclick attributes and inline script variable assignments). These values are now stored in HTML data attributes (data-screenshot, data-url, data-item-id), which are properly HTML-escaped by the Jinja2 template engine. Screenshot click handlers are bound programmatically via addEventListener on elements with a .reload-image class, and the reload_image function reads values from the DOM element\u0027s dataset rather than receiving raw string parameters. Additionally, item IDs are URL-encoded with encodeURIComponent before being appended to link hrefs, preventing injection through the ID field."
            }
          ],
          "source": {
            "discovery": "UNKNOWN"
          },
          "title": "Stored Cross-Site Scripting (XSS) via Crawler Capture Import in AIL Framework showDomain Page",
          "x_gcve": [
            {
              "extensions": {
                "bcp-05-x-01": {
                  "ai_annotations": [
                    {
                      "ai_level": "generated",
                      "description": "Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model.",
                      "gna_source": 1,
                      "models": [
                        {
                          "gna_source": 1,
                          "identifier": "qwen3.8:27b",
                          "name": "qwen3.8:27b",
                          "source": "ollama"
                        }
                      ],
                      "review_status": "full",
                      "scope": "record",
                      "tags": [
                        "ai-computer-assisted:llm-generated",
                        "ai-computer-assisted:classification"
                      ]
                    }
                  ]
                },
                "bcp-05-x-02": {
                  "x_patch2vuln": {
                    "assumptions": [
                      "The UI:P (Passive) rating assumes the inline script vector (screenshot variable assignment) executes on page load without requiring a user click. The onclick vector would require UI:A, but the inline script vector is sufficient for exploitation.",
                      "PR:L assumes the attacker needs a user-role API client to import a crafted crawler capture, as stated in the commit message. The exact privilege level and authentication mechanism are not further specified in the patch.",
                      "The version boundary \u0027less_than 7.1\u0027 is inferred from the tag_version_boundary metadata showing 21 commits after the fix before the v7.1 tag, suggesting the fix is included in v7.1. Exact affected version ranges are not confirmed.",
                      "CAPEC-1 is selected as the closest available attack pattern for stored XSS; no more specific CAPEC for stored XSS via data import exists in the catalog.",
                      "The patch does not include test cases or additional context about whether other template files have similar inline JavaScript interpolation patterns; this advisory covers only the single file in the patch."
                    ],
                    "capecRationale": [
                      {
                        "capecId": "CAPEC-1",
                        "rationale": "The patch directly remediates a stored XSS vector where attacker-controlled data from a crawler capture import is reflected into inline JavaScript without neutralization. CAPEC-1 is the canonical attack pattern for XSS. The specific sub-variant is stored (persistent) XSS via a data import mechanism, but CAPEC-1 is the closest and most appropriate mapping available in the CAPEC catalog."
                      }
                    ],
                    "commit": "31376ee3d04519c898bb9b3671453a41c4117340",
                    "confidence": "medium",
                    "credits": [
                      {
                        "lang": "en",
                        "type": "remediation developer",
                        "value": "terrtia"
                      }
                    ],
                    "cvssRationale": "AV:N: Exploitable over the network via the web application. AC:L: No special race conditions or complex setup; a crafted capture import suffices. AT:N: No manipulation of the attack target required. PR:L: Requires a user-role API client to import a malicious crawler capture (authenticated, low privilege). UI:P: The stored XSS in the inline script block executes passively when the victim loads the domain page; no click or active interaction is needed for the inline script vector. VC:N/VI:N/VA:N: The vulnerable component (server-side application) is not directly compromised in confidentiality, integrity, or availability. SC:H: Scope changes to the victim\u0027s browser session, enabling theft of session tokens, cookies, and sensitive data. SI:H: Scope integrity is impacted as the attacker can perform arbitrary actions in the victim\u0027s authenticated session. SA:N: No meaningful impact on the availability of the attacker\u0027s scope.",
                    "fixSummary": "The fix removes all capture-derived values (item IDs, URLs, screenshot paths) from inline JavaScript contexts (onclick attributes and inline script variable assignments). These values are now stored in HTML data attributes (data-screenshot, data-url, data-item-id), which are properly HTML-escaped by the Jinja2 template engine. Screenshot click handlers are bound programmatically via addEventListener on elements with a .reload-image class, and the reload_image function reads values from the DOM element\u0027s dataset rather than receiving raw string parameters. Additionally, item IDs are URL-encoded with encodeURIComponent before being appended to link hrefs, preventing injection through the ID field.",
                    "generatedAt": "2026-09-25T13:45:46.199650Z",
                    "generator": "patch2vuln.py",
                    "model": "qwen3.8:27b",
                    "modelComparison": {
                      "rankings": [
                        {
                          "agreementScore": 9,
                          "assumptionCount": 5,
                          "confidence": "medium",
                          "model": "qwen3.8:27b",
                          "score": 5
                        }
                      ],
                      "selectedModel": "qwen3.8:27b",
                      "selectionMethod": "deterministic-consensus-v1",
                      "selectionNotice": "The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required."
                    },
                    "patchSha256": "c110d16dd8eee489472853615089aeb6b6e034457dcbaec9b038bf85ad96b920",
                    "patchSummary": "In showDomain.html: (1) Replaced inline onclick=\"reload_image(\u0027...\u0027)\" with a data-attribute-based approach using data-screenshot, data-url, and data-item-id attributes on the table cell element, plus a .reload-image CSS class. (2) Removed the inline script block that assigned screenshot, URL, and ID values directly into JavaScript variables via Jinja2 interpolation; replaced with dataset reads from the domain_screenshot img element. (3) Changed reload_image() to accept a DOM element and read values from element.dataset instead of raw string arguments. (4) Added a programmatic event binding loop using document.querySelectorAll(\u0027.reload-image\u0027).forEach() with addEventListener(\u0027click\u0027). (5) Applied encodeURIComponent() to item IDs when constructing screenshot link hrefs. (6) Changed the href URL construction to use url_for with keyword arguments instead of string interpolation.",
                    "patchTruncated": false,
                    "patches": [
                      {
                        "commit": "31376ee3d04519c898bb9b3671453a41c4117340",
                        "patchSha256": "c110d16dd8eee489472853615089aeb6b6e034457dcbaec9b038bf85ad96b920",
                        "source": "https://github.com/ail-project/ail-framework/commit/31376ee3d04519c898bb9b3671453a41c4117340.patch",
                        "sourceUrl": "https://github.com/ail-project/ail-framework/commit/31376ee3d04519c898bb9b3671453a41c4117340.patch",
                        "subject": "chg: [security] prevent stored XSS through imported capture"
                      }
                    ],
                    "source": "https://github.com/ail-project/ail-framework/commit/31376ee3d04519c898bb9b3671453a41c4117340.patch",
                    "subject": "chg: [security] prevent stored XSS through imported capture",
                    "tagVersionBoundary": {
                      "commits_after_fix": 21,
                      "repository": "https://github.com/ail-project/ail-framework",
                      "tag": "v7.1",
                      "version": "7.1",
                      "version_type": "custom"
                    },
                    "weaknessRationale": [
                      {
                        "cweId": "CWE-79",
                        "rationale": "The patch explicitly addresses stored XSS by removing user-controlled values (screenshot paths, URLs, item IDs from crawler capture imports) from inline JavaScript contexts and replacing them with properly escaped data attributes and programmatic event binding. The commit message confirms the intent: \u0027prevent stored XSS through imported capture metadata in showDomain.\u0027"
                      }
                    ]
                  }
                }
              },
              "recordType": "advisory",
              "vulnId": "GCVE-1-2026-20292"
            }
          ],
          "x_generator": {
            "engine": "Vulnogram 0.2.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "00000000-0000-4000-9000-000000000000",
        "cveId": "CVE-2026-100190",
        "datePublished": "2026-09-25T13:49:00.000Z",
        "dateReserved": "2026-09-25T13:52:13.769Z",
        "dateUpdated": "2026-09-25T13:52:14.626493Z",
        "requesterUserId": "00000000-0000-4000-9000-000000000000",
        "serial": 1,
        "state": "PUBLISHED",
        "vulnId": "GCVE-1-2026-20292"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.1"
    }

    GCVE-1-2026-20276 (CVE-2026-100187)

    Vulnerability from gna-1 – Published: 2026-09-25 13:40 – Updated: 2026-09-25 13:53
    VLAI
    Title
    AIL Framework Onion Module: Non-Onion URL Accepted as Crawler Task Due to Bypassed Domain Validation
    Summary
    The Onion module in AIL Framework contained a performance shortcut in its URL extraction logic that accepted URLs as valid .onion targets based solely on a length check (exactly 69 characters) and a suffix check (ending in ".onion"), without performing proper hostname parsing or onion-domain validation. An unauthenticated attacker who could publish or control web content crawled by the framework could embed a crafted URL containing an IP address or non-onion hostname with a path ending in ".onion" that satisfied the length and suffix conditions. Such a URL would be extracted, its domain naively sliced from the string, and queued as a legitimate onion crawler task. This allowed unauthenticated content publishers to inject arbitrary non-onion targets into the crawler's task queue, influencing crawler behavior and potentially directing it toward unintended network resources. The vulnerability required no authentication, no user interaction, and only the ability to place crafted content in a location the framework would crawl. The security impact is a loss of integrity in the crawler's target selection: the framework processes and acts upon URLs that do not correspond to legitimate .onion services.
    CWE
    • CWE-20 - Improper Input Validation
    Assigner
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: unspecified , < 7.1 (semver)
    Create a notification for this product.
    GCVE extensions
    AI involvement GCVE-BCP-05-X-01
    Whole record AI-generated Human-reviewed GNA-1

    Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.

    ai-computer-assisted:llm-generatedai-computer-assisted:classification
    Model Source Identifier
    qwen3.8:27b ollama qwen3.8:27b
    Patch provenance GCVE-BCP-05-X-02
    Generator
    patch2vuln.py on 2026-09-25 13:37
    Model
    qwen3.8:27b
    Input
    https://github.com/ail-project/ail-framework/commit/5c8a68b3d8c7d7b03e5febe4ac5b5aca91826adb.patch 9fbf19112822…
    Confidence
    medium
    Commit Subject Patch SHA-256
    5c8a68b3d8c7 chg: [security] Onion module, prevent non-onion crawler task 9fbf19112822…
    Fix summary

    The length-based shortcut that bypassed onion-domain validation is removed. Every extracted URL is now parsed using the standard URL domain extraction function, and the resulting hostname is validated against the existing onion-domain validation routine before the URL is added to the crawler task set. This ensures that only URLs whose hostname is a genuine .onion domain can be queued as crawler tasks.

    Patch summary

    In bin/modules/Onion.py, the conditional block that checked len(url) == 69 and url.endswith('.onion') to shortcut domain extraction (url[7:]) without calling crawlers.is_valid_onion_domain() is removed. The code is replaced with an unconditional call to crawlers.get_url_domain(url) followed by a check that the returned domain is truthy and passes crawlers.is_valid_onion_domain(domain) before adding the domain and URL to the respective sets. Net change: 2 insertions, 9 deletions in a single file.

    CVSS rationale

    Attack Vector is Network because the attacker publishes crafted content on the web that the framework crawls. Attack Complexity is Low because the attacker only needs to construct a URL of exactly 69 characters ending in .onion with a non-onion hostname. No special Adversary Techniques are required. Privileges Required is None because the attacker is an unauthenticated content publisher. User Interaction is None because the crawler processes the content automatically. The primary impact is Low Integrity on the vulnerable component: the crawler task queue is polluted with non-onion URLs, violating the integrity of the framework's target selection. No confidentiality or availability impact is evident from the patch. No subsequent component impact is identified in the evidence.

    Weakness rationale
    • CWE-20 The URL input was validated using an insufficient heuristic (string length and suffix) that could be satisfied by non-onion URLs. The proper hostname parsing and onion-domain validation step was bypassed by the shortcut, allowing attacker-controlled URLs to be accepted as valid onion targets.
    Attack pattern rationale
    • CAPEC-126 The attacker tampers with URL parameters embedded in untrusted crawled content to bypass the application's validation logic and inject non-onion targets into the crawler task queue. CAPEC-126 is the closest available pattern describing manipulation of input parameters to achieve unintended application behavior. The mapping is approximate because the attack vector is content-based injection rather than direct request parameter manipulation, but the core mechanism (crafting input to bypass validation) aligns with this pattern.
    Assumptions to verify
    • The affected version range is inferred from the tag_version_boundary metadata indicating the fix commit is 24 commits before the v7.1 tag; the exact version number of the vulnerable release is not specified in the patch.
    • The CVSS assumes the attacker can place crafted content in a location the AIL Framework crawler will process; the specific crawling scope and configuration are not detailed in the patch.
    • CAPEC-126 (Parameter Tampering) is the closest available attack pattern; the actual attack is content-based URL injection rather than classic request parameter tampering, so the mapping is approximate.
    • The impact is assessed as Low Integrity based on the evidence that non-onion URLs are queued as crawler tasks; broader downstream consequences (e.g., SSRF-like effects) are not evidenced in the patch and are not assumed.
    • The commit date (24 Sep 2026) is taken as-is from the patch metadata; no independent verification of the timeline is performed.
    Model comparison

    Selected qwen3.8:27b by deterministic-consensus-v1
    The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required.

    Model Score Agreement Confidence Assumptions
    qwen3.8:27b 5 9 medium 5

    {
      "containers": {
        "cna": {
          "affected": [
            {
              "defaultStatus": "unaffected",
              "modules": [
                "Onion module"
              ],
              "product": "ail framework",
              "programFiles": [
                "bin/modules/Onion.py"
              ],
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThan": "7.1",
                  "status": "affected",
                  "version": "unspecified",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Aurelien Thirion"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Jeroen Pinoy"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe Onion module in AIL Framework contained a performance shortcut in its URL extraction logic that accepted URLs as valid .onion targets based solely on a length check (exactly 69 characters) and a suffix check (ending in \".onion\"), without performing proper hostname parsing or onion-domain validation. An unauthenticated attacker who could publish or control web content crawled by the framework could embed a crafted URL containing an IP address or non-onion hostname with a path ending in \".onion\" that satisfied the length and suffix conditions. Such a URL would be extracted, its domain naively sliced from the string, and queued as a legitimate onion crawler task. This allowed unauthenticated content publishers to inject arbitrary non-onion targets into the crawler\u0027s task queue, influencing crawler behavior and potentially directing it toward unintended network resources. The vulnerability required no authentication, no user interaction, and only the ability to place crafted content in a location the framework would crawl. The security impact is a loss of integrity in the crawler\u0027s target selection: the framework processes and acts upon URLs that do not correspond to legitimate .onion services.\u003c/p\u003e"
                }
              ],
              "value": "The Onion module in AIL Framework contained a performance shortcut in its URL extraction logic that accepted URLs as valid .onion targets based solely on a length check (exactly 69 characters) and a suffix check (ending in \".onion\"), without performing proper hostname parsing or onion-domain validation. An unauthenticated attacker who could publish or control web content crawled by the framework could embed a crafted URL containing an IP address or non-onion hostname with a path ending in \".onion\" that satisfied the length and suffix conditions. Such a URL would be extracted, its domain naively sliced from the string, and queued as a legitimate onion crawler task. This allowed unauthenticated content publishers to inject arbitrary non-onion targets into the crawler\u0027s task queue, influencing crawler behavior and potentially directing it toward unintended network resources. The vulnerability required no authentication, no user interaction, and only the ability to place crafted content in a location the framework would crawl. The security impact is a loss of integrity in the crawler\u0027s target selection: the framework processes and acts upon URLs that do not correspond to legitimate .onion services."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-126",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-126 Parameter Tampering"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 6.9,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "LOW",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-20",
                  "description": "CWE-20 Improper Input Validation",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "orgId": "00000000-0000-4000-9000-000000000000"
          },
          "references": [
            {
              "name": "Security patch",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/5c8a68b3d8c7d7b03e5febe4ac5b5aca91826adb"
            }
          ],
          "solutions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe length-based shortcut that bypassed onion-domain validation is removed. Every extracted URL is now parsed using the standard URL domain extraction function, and the resulting hostname is validated against the existing onion-domain validation routine before the URL is added to the crawler task set. This ensures that only URLs whose hostname is a genuine .onion domain can be queued as crawler tasks.\u003c/p\u003e"
                }
              ],
              "value": "The length-based shortcut that bypassed onion-domain validation is removed. Every extracted URL is now parsed using the standard URL domain extraction function, and the resulting hostname is validated against the existing onion-domain validation routine before the URL is added to the crawler task set. This ensures that only URLs whose hostname is a genuine .onion domain can be queued as crawler tasks."
            }
          ],
          "source": {
            "discovery": "UNKNOWN"
          },
          "title": "AIL Framework Onion Module: Non-Onion URL Accepted as Crawler Task Due to Bypassed Domain Validation",
          "x_gcve": [
            {
              "extensions": {
                "bcp-05-x-01": {
                  "ai_annotations": [
                    {
                      "ai_level": "generated",
                      "description": "Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.",
                      "gna_source": 1,
                      "models": [
                        {
                          "gna_source": 1,
                          "identifier": "qwen3.8:27b",
                          "name": "qwen3.8:27b",
                          "source": "ollama"
                        }
                      ],
                      "review_status": "full",
                      "scope": "record",
                      "tags": [
                        "ai-computer-assisted:llm-generated",
                        "ai-computer-assisted:classification"
                      ]
                    }
                  ]
                },
                "bcp-05-x-02": {
                  "x_patch2vuln": {
                    "assumptions": [
                      "The affected version range is inferred from the tag_version_boundary metadata indicating the fix commit is 24 commits before the v7.1 tag; the exact version number of the vulnerable release is not specified in the patch.",
                      "The CVSS assumes the attacker can place crafted content in a location the AIL Framework crawler will process; the specific crawling scope and configuration are not detailed in the patch.",
                      "CAPEC-126 (Parameter Tampering) is the closest available attack pattern; the actual attack is content-based URL injection rather than classic request parameter tampering, so the mapping is approximate.",
                      "The impact is assessed as Low Integrity based on the evidence that non-onion URLs are queued as crawler tasks; broader downstream consequences (e.g., SSRF-like effects) are not evidenced in the patch and are not assumed.",
                      "The commit date (24 Sep 2026) is taken as-is from the patch metadata; no independent verification of the timeline is performed."
                    ],
                    "capecRationale": [
                      {
                        "capecId": "CAPEC-126",
                        "rationale": "The attacker tampers with URL parameters embedded in untrusted crawled content to bypass the application\u0027s validation logic and inject non-onion targets into the crawler task queue. CAPEC-126 is the closest available pattern describing manipulation of input parameters to achieve unintended application behavior. The mapping is approximate because the attack vector is content-based injection rather than direct request parameter manipulation, but the core mechanism (crafting input to bypass validation) aligns with this pattern."
                      }
                    ],
                    "commit": "5c8a68b3d8c7d7b03e5febe4ac5b5aca91826adb",
                    "confidence": "medium",
                    "credits": [
                      {
                        "lang": "en",
                        "type": "remediation developer",
                        "value": "terrtia"
                      }
                    ],
                    "cvssRationale": "Attack Vector is Network because the attacker publishes crafted content on the web that the framework crawls. Attack Complexity is Low because the attacker only needs to construct a URL of exactly 69 characters ending in .onion with a non-onion hostname. No special Adversary Techniques are required. Privileges Required is None because the attacker is an unauthenticated content publisher. User Interaction is None because the crawler processes the content automatically. The primary impact is Low Integrity on the vulnerable component: the crawler task queue is polluted with non-onion URLs, violating the integrity of the framework\u0027s target selection. No confidentiality or availability impact is evident from the patch. No subsequent component impact is identified in the evidence.",
                    "fixSummary": "The length-based shortcut that bypassed onion-domain validation is removed. Every extracted URL is now parsed using the standard URL domain extraction function, and the resulting hostname is validated against the existing onion-domain validation routine before the URL is added to the crawler task set. This ensures that only URLs whose hostname is a genuine .onion domain can be queued as crawler tasks.",
                    "generatedAt": "2026-09-25T13:37:37.543009Z",
                    "generator": "patch2vuln.py",
                    "model": "qwen3.8:27b",
                    "modelComparison": {
                      "rankings": [
                        {
                          "agreementScore": 9,
                          "assumptionCount": 5,
                          "confidence": "medium",
                          "model": "qwen3.8:27b",
                          "score": 5
                        }
                      ],
                      "selectedModel": "qwen3.8:27b",
                      "selectionMethod": "deterministic-consensus-v1",
                      "selectionNotice": "The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required."
                    },
                    "patchSha256": "9fbf191128229c1859f3643b5f50921cdf5f36fd70734e8f68a05e237b987d60",
                    "patchSummary": "In bin/modules/Onion.py, the conditional block that checked len(url) == 69 and url.endswith(\u0027.onion\u0027) to shortcut domain extraction (url[7:]) without calling crawlers.is_valid_onion_domain() is removed. The code is replaced with an unconditional call to crawlers.get_url_domain(url) followed by a check that the returned domain is truthy and passes crawlers.is_valid_onion_domain(domain) before adding the domain and URL to the respective sets. Net change: 2 insertions, 9 deletions in a single file.",
                    "patchTruncated": false,
                    "patches": [
                      {
                        "commit": "5c8a68b3d8c7d7b03e5febe4ac5b5aca91826adb",
                        "patchSha256": "9fbf191128229c1859f3643b5f50921cdf5f36fd70734e8f68a05e237b987d60",
                        "source": "https://github.com/ail-project/ail-framework/commit/5c8a68b3d8c7d7b03e5febe4ac5b5aca91826adb.patch",
                        "sourceUrl": "https://github.com/ail-project/ail-framework/commit/5c8a68b3d8c7d7b03e5febe4ac5b5aca91826adb.patch",
                        "subject": "chg: [security] Onion module, prevent non-onion crawler task"
                      }
                    ],
                    "source": "https://github.com/ail-project/ail-framework/commit/5c8a68b3d8c7d7b03e5febe4ac5b5aca91826adb.patch",
                    "subject": "chg: [security] Onion module, prevent non-onion crawler task",
                    "tagVersionBoundary": {
                      "commits_after_fix": 24,
                      "repository": "https://github.com/ail-project/ail-framework",
                      "tag": "v7.1",
                      "version": "7.1",
                      "version_type": "custom"
                    },
                    "weaknessRationale": [
                      {
                        "cweId": "CWE-20",
                        "rationale": "The URL input was validated using an insufficient heuristic (string length and suffix) that could be satisfied by non-onion URLs. The proper hostname parsing and onion-domain validation step was bypassed by the shortcut, allowing attacker-controlled URLs to be accepted as valid onion targets."
                      }
                    ]
                  }
                }
              },
              "recordType": "advisory",
              "vulnId": "GCVE-1-2026-20276"
            }
          ],
          "x_generator": {
            "engine": "Vulnogram 0.2.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "00000000-0000-4000-9000-000000000000",
        "cveId": "CVE-2026-100187",
        "datePublished": "2026-09-25T13:40:00.000Z",
        "dateReserved": "2026-09-25T13:42:00.000Z",
        "dateUpdated": "2026-09-25T13:53:04.756019Z",
        "requesterUserId": "00000000-0000-4000-9000-000000000000",
        "serial": 1,
        "state": "PUBLISHED",
        "vulnId": "GCVE-1-2026-20276"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.1"
    }

    GCVE-1-2026-20183 (CVE-2026-100177)

    Vulnerability from gna-1 – Published: 2026-09-25 13:35 – Updated: 2026-09-25 13:55
    VLAI
    Title
    Ail Framework Crawler: Missing Cookiejar Authorization Check Allows Cross-Organization Cookiejar Attachment
    Summary
    The AIL Framework crawler task creation API (api_add_crawler_task) contained an insufficient authorization check when a user supplied a cookiejar UUID to attach to a one-shot or scheduled crawler task. The original code only verified that the cookiejar existed and, if its access level was 0, compared the cookiejar's owning user ID to the requesting user ID. It did not validate organizational boundaries, did not account for the requesting user's role. When the cookiejar level was not 0, no access check was performed at all. An authenticated user could therefore reference another organization's cookiejar by UUID and have the crawler use that organization's stored cookies (session tokens, authentication credentials) when performing web crawls, effectively leaking or exfiltrating the victim organization's session data. The vulnerability requires an authenticated user with the ability to create crawler tasks. The attacker must know or guess a valid cookiejar UUID belonging to another organization. The impact is unauthorized access to another organization's stored cookies and session data through the crawler infrastructure.
    CWE
    • CWE-639 - Authorization Bypass Through User-Controlled Key
    • CWE-20 - Improper Input Validation
    Assigner
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: unspecified , < 7.1 (semver)
    Create a notification for this product.
    GCVE extensions
    AI involvement GCVE-BCP-05-X-01
    Whole record AI-generated Human-reviewed GNA-1

    Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.

    ai-computer-assisted:llm-generatedai-computer-assisted:classification
    Model Source Identifier
    qwen3.8:27b ollama qwen3.8:27b
    Patch provenance GCVE-BCP-05-X-02
    Generator
    patch2vuln.py on 2026-09-25 13:30
    Model
    qwen3.8:27b
    Input
    https://github.com/ail-project/ail-framework/commit/3773ca36658c57ce592aebe74e27c855eb64f58a.patch 43e163a1b90d…
    Confidence
    medium
    Commit Subject Patch SHA-256
    3773ca36658c chg: [security] crawler, enforce cookiejar ACL when creating 43e163a1b90d…
    Fix summary

    The cookiejar attachment path in api_add_crawler_task is now validated through the existing api_check_cookiejar_access_acl() function, which enforces organization, user, and role-based access control for the 'view' action on the referenced cookiejar. The user_role parameter is propagated from the API and UI entry points (api_rest.py, crawler_splash.py) into the ACL check. Separately, URL scheme validation is enforced unconditionally: only http and https schemes are accepted, and non-conforming URLs are rejected with a 400 error before any further processing.

    Patch summary

    In bin/lib/crawlers.py: (1) is_global_url() now returns False for any scheme other than http/https (previously returned True for data/file schemes) and handles URLs lacking a netloc by prepending http://. (2) api_validate_global_urls() now rejects non-HTTP/HTTPS schemes with a 400 error before the local-IP filter check. (3) The Cookiejar class gains a get_creator() alias. (4) The CrawlerTask.create() method validates the URL scheme. (5) api_add_crawler_task() replaces the inline level-0 user-ID comparison with a call to api_check_cookiejar_access_acl(cookiejar_uuid, user_org, user_id, user_role, action='view') and accepts a new user_role parameter. (6) api_add_crawler_capture() now calls api_validate_global_urls(). In var/www/blueprints/api_rest.py and crawler_splash.py: user_role is extracted from the authenticated session and passed to api_add_crawler_task().

    CVSS rationale

    The vulnerability is exploitable over the network (AV:N) with low complexity (AC:L) since the attacker only needs to substitute a known or guessed cookiejar UUID in an API request. No attack target manipulation is required (AT:N). An authenticated user with crawler task creation privileges is needed (PR:L). No user interaction is required (UI:N). The vulnerable component itself does not lose confidentiality, integrity, or availability (VC:N, VI:N, VA:N). However, the subsequent impact is high on confidentiality (SC:H) because the attacker gains access to another organization's stored cookies and session tokens via the crawler, which could be used to impersonate the victim on target sites. No subsequent integrity or availability impact is evident (SI:N, SA:N).

    Weakness rationale
    • CWE-639 The cookiejar UUID is a user-supplied identifier (key) that was not properly validated against the requesting user's organization and role. The old code only compared user IDs when level was 0 and skipped the check entirely otherwise, allowing cross-organization access to another user's cookiejar.
    • CWE-20 The URL scheme validation was incorrect: data: and file: schemes were treated as valid global URLs, and the scheme check was skipped when the local-IP filter was disabled. The fix enforces that only http and https schemes are accepted unconditionally.
    Attack pattern rationale
    • CAPEC-1 The attacker tampers with the cookiejar UUID parameter in the crawler task creation API request to reference a resource (cookiejar) belonging to another organization. The system failed to validate that the referenced object was accessible to the requesting user's organization. This is the closest CAPEC pattern to an IDOR-style parameter substitution; no CAPEC specifically named 'Insecure Direct Object Reference' exists, so CAPEC-1 (modifying a request parameter to access unauthorized resources) is the best available match.
    Assumptions to verify
    • The api_check_cookiejar_access_acl() function is assumed to correctly enforce organization, user, and role-based access control; its implementation is not included in this patch.
    • The cookiejar UUID is assumed to be guessable or discoverable by an authenticated user (e.g., via enumeration or information leakage); if UUIDs are truly random and unguessable, exploitability is reduced but the authorization flaw remains.
    • The CVSS assumes the primary security impact is subsequent confidentiality (access to another org's cookies/sessions) rather than direct compromise of the Ail Framework itself.
    • The CAPEC-1 mapping is the closest available pattern for an IDOR/parameter-substitution attack; no CAPEC specifically covers insecure direct object reference, so this mapping carries some uncertainty.
    • The affected version boundary is inferred from the tag v7.1 (26 commits after the fix commit), suggesting the fix landed before the v7.1 release; exact affected version range is not confirmed.
    • The URL scheme validation fix (rejecting data:/file: schemes) is treated as a secondary hardening change within the same patch set rather than a separate vulnerability.
    Model comparison

    Selected qwen3.8:27b by deterministic-consensus-v1
    The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required.

    Model Score Agreement Confidence Assumptions
    qwen3.8:27b 4 9 medium 6

    {
      "containers": {
        "cna": {
          "affected": [
            {
              "defaultStatus": "unaffected",
              "modules": [
                "bin/lib/crawlers.py",
                "var/www/blueprints/api_rest.py",
                "var/www/blueprints/crawler_splash.py"
              ],
              "product": "ail framework",
              "programFiles": [
                "bin/lib/crawlers.py",
                "var/www/blueprints/api_rest.py",
                "var/www/blueprints/crawler_splash.py"
              ],
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThan": "7.1",
                  "status": "affected",
                  "version": "unspecified",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "terrtia"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Jeroen Pinoy"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe AIL Framework crawler task creation API (api_add_crawler_task) contained an insufficient authorization check when a user supplied a cookiejar UUID to attach to a one-shot or scheduled crawler task. The original code only verified that the cookiejar existed and, if its access level was 0, compared the cookiejar\u0027s owning user ID to the requesting user ID. It did not validate organizational boundaries, did not account for the requesting user\u0027s role. When the cookiejar level was not 0, no access check was performed at all. An authenticated user could therefore reference another organization\u0027s cookiejar by UUID and have the crawler use that organization\u0027s stored cookies (session tokens, authentication credentials) when performing web crawls, effectively leaking or exfiltrating the victim organization\u0027s session data.\u003cbr\u003e\u003c/p\u003e\u003cp\u003eThe vulnerability requires an authenticated user with the ability to create crawler tasks. The attacker must know or guess a valid cookiejar UUID belonging to another organization. The impact is unauthorized access to another organization\u0027s stored cookies and session data through the crawler infrastructure.\u003c/p\u003e"
                }
              ],
              "value": "The AIL Framework crawler task creation API (api_add_crawler_task) contained an insufficient authorization check when a user supplied a cookiejar UUID to attach to a one-shot or scheduled crawler task. The original code only verified that the cookiejar existed and, if its access level was 0, compared the cookiejar\u0027s owning user ID to the requesting user ID. It did not validate organizational boundaries, did not account for the requesting user\u0027s role. When the cookiejar level was not 0, no access check was performed at all. An authenticated user could therefore reference another organization\u0027s cookiejar by UUID and have the crawler use that organization\u0027s stored cookies (session tokens, authentication credentials) when performing web crawls, effectively leaking or exfiltrating the victim organization\u0027s session data.\n\n\nThe vulnerability requires an authenticated user with the ability to create crawler tasks. The attacker must know or guess a valid cookiejar UUID belonging to another organization. The impact is unauthorized access to another organization\u0027s stored cookies and session data through the crawler infrastructure."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-1",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-1 Tamper with URLs"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 6.3,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "LOW",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "HIGH",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:N/VA:N/SC:H/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-639",
                  "description": "CWE-639 Authorization Bypass Through User-Controlled Key",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            },
            {
              "descriptions": [
                {
                  "cweId": "CWE-20",
                  "description": "CWE-20 Improper Input Validation",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "orgId": "00000000-0000-4000-9000-000000000000"
          },
          "references": [
            {
              "name": "Security patch",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/3773ca36658c57ce592aebe74e27c855eb64f58a"
            }
          ],
          "solutions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe cookiejar attachment path in api_add_crawler_task is now validated through the existing api_check_cookiejar_access_acl() function, which enforces organization, user, and role-based access control for the \u0027view\u0027 action on the referenced cookiejar. The user_role parameter is propagated from the API and UI entry points (api_rest.py, crawler_splash.py) into the ACL check. Separately, URL scheme validation is enforced unconditionally: only http and https schemes are accepted, and non-conforming URLs are rejected with a 400 error before any further processing.\u003c/p\u003e"
                }
              ],
              "value": "The cookiejar attachment path in api_add_crawler_task is now validated through the existing api_check_cookiejar_access_acl() function, which enforces organization, user, and role-based access control for the \u0027view\u0027 action on the referenced cookiejar. The user_role parameter is propagated from the API and UI entry points (api_rest.py, crawler_splash.py) into the ACL check. Separately, URL scheme validation is enforced unconditionally: only http and https schemes are accepted, and non-conforming URLs are rejected with a 400 error before any further processing."
            }
          ],
          "source": {
            "discovery": "UNKNOWN"
          },
          "title": "Ail Framework Crawler: Missing Cookiejar Authorization Check Allows Cross-Organization Cookiejar Attachment",
          "x_gcve": [
            {
              "extensions": {
                "bcp-05-x-01": {
                  "ai_annotations": [
                    {
                      "ai_level": "generated",
                      "description": "Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.",
                      "gna_source": 1,
                      "models": [
                        {
                          "gna_source": 1,
                          "identifier": "qwen3.8:27b",
                          "name": "qwen3.8:27b",
                          "source": "ollama"
                        }
                      ],
                      "review_status": "full",
                      "scope": "record",
                      "tags": [
                        "ai-computer-assisted:llm-generated",
                        "ai-computer-assisted:classification"
                      ]
                    }
                  ]
                },
                "bcp-05-x-02": {
                  "x_patch2vuln": {
                    "assumptions": [
                      "The api_check_cookiejar_access_acl() function is assumed to correctly enforce organization, user, and role-based access control; its implementation is not included in this patch.",
                      "The cookiejar UUID is assumed to be guessable or discoverable by an authenticated user (e.g., via enumeration or information leakage); if UUIDs are truly random and unguessable, exploitability is reduced but the authorization flaw remains.",
                      "The CVSS assumes the primary security impact is subsequent confidentiality (access to another org\u0027s cookies/sessions) rather than direct compromise of the Ail Framework itself.",
                      "The CAPEC-1 mapping is the closest available pattern for an IDOR/parameter-substitution attack; no CAPEC specifically covers insecure direct object reference, so this mapping carries some uncertainty.",
                      "The affected version boundary is inferred from the tag v7.1 (26 commits after the fix commit), suggesting the fix landed before the v7.1 release; exact affected version range is not confirmed.",
                      "The URL scheme validation fix (rejecting data:/file: schemes) is treated as a secondary hardening change within the same patch set rather than a separate vulnerability."
                    ],
                    "capecRationale": [
                      {
                        "capecId": "CAPEC-1",
                        "rationale": "The attacker tampers with the cookiejar UUID parameter in the crawler task creation API request to reference a resource (cookiejar) belonging to another organization. The system failed to validate that the referenced object was accessible to the requesting user\u0027s organization. This is the closest CAPEC pattern to an IDOR-style parameter substitution; no CAPEC specifically named \u0027Insecure Direct Object Reference\u0027 exists, so CAPEC-1 (modifying a request parameter to access unauthorized resources) is the best available match."
                      }
                    ],
                    "commit": "3773ca36658c57ce592aebe74e27c855eb64f58a",
                    "confidence": "medium",
                    "credits": [
                      {
                        "lang": "en",
                        "type": "remediation developer",
                        "value": "terrtia"
                      }
                    ],
                    "cvssRationale": "The vulnerability is exploitable over the network (AV:N) with low complexity (AC:L) since the attacker only needs to substitute a known or guessed cookiejar UUID in an API request. No attack target manipulation is required (AT:N). An authenticated user with crawler task creation privileges is needed (PR:L). No user interaction is required (UI:N). The vulnerable component itself does not lose confidentiality, integrity, or availability (VC:N, VI:N, VA:N). However, the subsequent impact is high on confidentiality (SC:H) because the attacker gains access to another organization\u0027s stored cookies and session tokens via the crawler, which could be used to impersonate the victim on target sites. No subsequent integrity or availability impact is evident (SI:N, SA:N).",
                    "fixSummary": "The cookiejar attachment path in api_add_crawler_task is now validated through the existing api_check_cookiejar_access_acl() function, which enforces organization, user, and role-based access control for the \u0027view\u0027 action on the referenced cookiejar. The user_role parameter is propagated from the API and UI entry points (api_rest.py, crawler_splash.py) into the ACL check. Separately, URL scheme validation is enforced unconditionally: only http and https schemes are accepted, and non-conforming URLs are rejected with a 400 error before any further processing.",
                    "generatedAt": "2026-09-25T13:30:48.386437Z",
                    "generator": "patch2vuln.py",
                    "model": "qwen3.8:27b",
                    "modelComparison": {
                      "rankings": [
                        {
                          "agreementScore": 9,
                          "assumptionCount": 6,
                          "confidence": "medium",
                          "model": "qwen3.8:27b",
                          "score": 4
                        }
                      ],
                      "selectedModel": "qwen3.8:27b",
                      "selectionMethod": "deterministic-consensus-v1",
                      "selectionNotice": "The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required."
                    },
                    "patchSha256": "43e163a1b90d5926293d5dbd7982d46241f08d7a9d2cb0edf86c963f794afac5",
                    "patchSummary": "In bin/lib/crawlers.py: (1) is_global_url() now returns False for any scheme other than http/https (previously returned True for data/file schemes) and handles URLs lacking a netloc by prepending http://. (2) api_validate_global_urls() now rejects non-HTTP/HTTPS schemes with a 400 error before the local-IP filter check. (3) The Cookiejar class gains a get_creator() alias. (4) The CrawlerTask.create() method validates the URL scheme. (5) api_add_crawler_task() replaces the inline level-0 user-ID comparison with a call to api_check_cookiejar_access_acl(cookiejar_uuid, user_org, user_id, user_role, action=\u0027view\u0027) and accepts a new user_role parameter. (6) api_add_crawler_capture() now calls api_validate_global_urls(). In var/www/blueprints/api_rest.py and crawler_splash.py: user_role is extracted from the authenticated session and passed to api_add_crawler_task().",
                    "patchTruncated": false,
                    "patches": [
                      {
                        "commit": "3773ca36658c57ce592aebe74e27c855eb64f58a",
                        "patchSha256": "43e163a1b90d5926293d5dbd7982d46241f08d7a9d2cb0edf86c963f794afac5",
                        "source": "https://github.com/ail-project/ail-framework/commit/3773ca36658c57ce592aebe74e27c855eb64f58a.patch",
                        "sourceUrl": "https://github.com/ail-project/ail-framework/commit/3773ca36658c57ce592aebe74e27c855eb64f58a.patch",
                        "subject": "chg: [security] crawler, enforce cookiejar ACL when creating"
                      }
                    ],
                    "source": "https://github.com/ail-project/ail-framework/commit/3773ca36658c57ce592aebe74e27c855eb64f58a.patch",
                    "subject": "chg: [security] crawler, enforce cookiejar ACL when creating",
                    "tagVersionBoundary": {
                      "commits_after_fix": 26,
                      "repository": "https://github.com/ail-project/ail-framework",
                      "tag": "v7.1",
                      "version": "7.1",
                      "version_type": "custom"
                    },
                    "weaknessRationale": [
                      {
                        "cweId": "CWE-639",
                        "rationale": "The cookiejar UUID is a user-supplied identifier (key) that was not properly validated against the requesting user\u0027s organization and role. The old code only compared user IDs when level was 0 and skipped the check entirely otherwise, allowing cross-organization access to another user\u0027s cookiejar."
                      },
                      {
                        "cweId": "CWE-20",
                        "rationale": "The URL scheme validation was incorrect: data: and file: schemes were treated as valid global URLs, and the scheme check was skipped when the local-IP filter was disabled. The fix enforces that only http and https schemes are accepted unconditionally."
                      }
                    ]
                  }
                }
              },
              "recordType": "advisory",
              "vulnId": "GCVE-1-2026-20183"
            }
          ],
          "x_generator": {
            "engine": "Vulnogram 0.2.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "00000000-0000-4000-9000-000000000000",
        "cveId": "CVE-2026-100177",
        "datePublished": "2026-09-25T13:35:00.000Z",
        "dateReserved": "2026-09-25T13:35:00.000Z",
        "dateUpdated": "2026-09-25T13:55:39.228706Z",
        "requesterUserId": "00000000-0000-4000-9000-000000000000",
        "serial": 1,
        "state": "PUBLISHED",
        "vulnId": "GCVE-1-2026-20183"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.1"
    }

    GCVE-1-2026-20279 (CVE-2026-100176)

    Vulnerability from gna-1 – Published: 2026-09-25 13:29 – Updated: 2026-09-25 13:55
    VLAI
    Title
    Stored Cross-Site Scripting (XSS) in AIL Framework Username Timeline Tooltip
    Summary
    The AIL Framework's username timeline feature is vulnerable to stored cross-site scripting (XSS). Usernames imported from chats and crawled forums are stored without character restrictions. When an authenticated analyst views the username timeline, the application renders these stored usernames into the DOM using D3's html() method in the tooltip. Because the username value (d.obj) is interpolated directly into an HTML string without sanitization, a crafted username containing HTML event handlers (e.g., <img src=x onerror=alert(1)>) will execute arbitrary JavaScript in the analyst's browser when the analyst hovers over the corresponding timeline entry. The attack requires the victim to be an authenticated analyst with access to the timeline view and to interact with the malicious timeline entry (hover). Successful exploitation can lead to session hijacking, data exfiltration, or unauthorized actions performed within the analyst's authenticated session. The vulnerability resides in the client-side JavaScript file var/www/static/js/d3/timeline_basic.js.
    CWE
    • CWE-79 - Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
    Assigner
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: unspecified , < 7.1 (semver)
    Create a notification for this product.
    GCVE extensions
    AI involvement GCVE-BCP-05-X-01
    Whole record AI-generated Human-reviewed GNA-1

    Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.

    ai-computer-assisted:llm-generatedai-computer-assisted:classification
    Model Source Identifier
    qwen3.8:27b ollama qwen3.8:27b
    Patch provenance GCVE-BCP-05-X-02
    Generator
    patch2vuln.py on 2026-09-25 13:24
    Model
    qwen3.8:27b
    Input
    https://github.com/ail-project/ail-framework/commit/455dd92c4179c53204368d93681ded4b57e31643.patch 36262636a3a7…
    Confidence
    medium
    Commit Subject Patch SHA-256
    455dd92c4179 chg: [security] fix XSS in username timeline tooltip. 36262636a3a7…
    Fix summary

    The fix applies the existing sanitize_text() helper to the user-controlled username value (d.obj) immediately before it is interpolated into the D3 tooltip HTML string. This ensures that any HTML or script content embedded in the stored username is neutralized before DOM insertion, preventing script execution while preserving the tooltip's intended formatting (line breaks and date/time display).

    Patch summary

    In var/www/static/js/d3/timeline_basic.js, the single line constructing the tooltip HTML was changed from tooltip.html(`${d.obj}<br>...`) to tooltip.html(`${sanitize_text(d.obj)}<br>...`). The only modification is wrapping the untrusted d.obj variable with the sanitize_text() function call at the HTML sink, leaving the rest of the tooltip template (br tags, date formatting) unchanged.

    CVSS rationale

    AV:N: The vulnerability is in a web application accessible over the network. AC:L: The attacker only needs to craft a username with HTML/JS in a chat or forum that gets crawled; no race conditions or complex conditions are needed. AT:N: No attack on the target system is required; the malicious username is stored as part of normal data import. PR:N: The attacker does not need any account or privilege on the AIL Framework; they only need to be a user in a source chat/forum. UI:A: The victim (analyst) must actively hover over the specific timeline entry to trigger script execution. VC:H: XSS in an authenticated analyst session can expose sensitive intelligence data, session tokens, and credentials. VI:H: The attacker can perform actions as the analyst, modify data, or exfiltrate information. VA:N: No impact on availability. SC/SI/SA:N: No subsequent system impact is evidenced.

    Weakness rationale
    • CWE-79 The patch inserts a user-controlled value (username from imported chats/forums) into an HTML context via D3's html() method without sanitization. The fix adds sanitize_text() at the sink, confirming the root cause is missing output encoding/neutralization of untrusted data in an HTML context, which is the definition of CWE-79 (stored XSS variant).
    Attack pattern rationale
    • CAPEC-1 CAPEC-1 describes the general pattern of injecting client-side scripts into web pages via untrusted input. The patch evidence shows a stored username (untrusted input from chats/forums) being rendered into an HTML tooltip without sanitization, matching the stored-XSS sub-pattern of CAPEC-1. This is the closest and most direct CAPEC mapping for an XSS vulnerability where attacker-controlled data is persisted and later rendered in a victim's browser.
    Assumptions to verify
    • The UI:A (Active) user interaction metric assumes the analyst must deliberately hover over the specific timeline entry to trigger the XSS; passive rendering without hover is not evidenced in the patch.
    • The affected version boundary is inferred from the tag_version_boundary metadata (v7.1, 29 commits after fix); the exact last affected and first fixed version numbers are not explicitly stated in the patch.
    • PR:N assumes the attacker does not need an account on the AIL Framework itself, only a presence in a crawled chat or forum source; if the platform requires the attacker to be a registered user to have their username crawled, PR:L might be more appropriate.
    • The CAPEC-1 mapping is the closest available pattern for stored XSS; no more specific CAPEC ID for 'stored XSS via imported data rendered in a tooltip' exists in the CAPEC catalog.
    • The sanitize_text() helper is assumed to perform adequate HTML entity encoding or equivalent neutralization; its implementation is not shown in the patch.
    • VC:H and VI:H reflect the sensitivity of an intelligence-analysis platform where an authenticated analyst session may contain classified or highly sensitive data; if the deployment context is less sensitive, lower impact ratings could apply.
    Model comparison

    Selected qwen3.8:27b by deterministic-consensus-v1
    The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required.

    Model Score Agreement Confidence Assumptions
    qwen3.8:27b 4 9 medium 6

    {
      "containers": {
        "cna": {
          "affected": [
            {
              "defaultStatus": "unaffected",
              "modules": [
                "username timeline (D3 timeline_basic)"
              ],
              "product": "ail framework",
              "programFiles": [
                "var/www/static/js/d3/timeline_basic.js"
              ],
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThan": "7.1",
                  "status": "affected",
                  "version": "unspecified",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Aurelien Thirion"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Jeroen Pinoy"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe AIL Framework\u0027s username timeline feature is vulnerable to stored cross-site scripting (XSS). Usernames imported from chats and crawled forums are stored without character restrictions. When an authenticated analyst views the username timeline, the application renders these stored usernames into the DOM using D3\u0027s html() method in the tooltip. Because the username value (d.obj) is interpolated directly into an HTML string without sanitization, a crafted username containing HTML event handlers (e.g., \u0026lt;img src=x onerror=alert(1)\u0026gt;) will execute arbitrary JavaScript in the analyst\u0027s browser when the analyst hovers over the corresponding timeline entry. The attack requires the victim to be an authenticated analyst with access to the timeline view and to interact with the malicious timeline entry (hover). Successful exploitation can lead to session hijacking, data exfiltration, or unauthorized actions performed within the analyst\u0027s authenticated session. The vulnerability resides in the client-side JavaScript file var/www/static/js/d3/timeline_basic.js.\u003c/p\u003e"
                }
              ],
              "value": "The AIL Framework\u0027s username timeline feature is vulnerable to stored cross-site scripting (XSS). Usernames imported from chats and crawled forums are stored without character restrictions. When an authenticated analyst views the username timeline, the application renders these stored usernames into the DOM using D3\u0027s html() method in the tooltip. Because the username value (d.obj) is interpolated directly into an HTML string without sanitization, a crafted username containing HTML event handlers (e.g., \u003cimg src=x onerror=alert(1)\u003e) will execute arbitrary JavaScript in the analyst\u0027s browser when the analyst hovers over the corresponding timeline entry. The attack requires the victim to be an authenticated analyst with access to the timeline view and to interact with the malicious timeline entry (hover). Successful exploitation can lead to session hijacking, data exfiltration, or unauthorized actions performed within the analyst\u0027s authenticated session. The vulnerability resides in the client-side JavaScript file var/www/static/js/d3/timeline_basic.js."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-1",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-1 Cross Site Scripting"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 8.5,
                "baseSeverity": "HIGH",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "ACTIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "HIGH",
                "vulnIntegrityImpact": "HIGH",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-79",
                  "description": "CWE-79 Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "orgId": "00000000-0000-4000-9000-000000000000"
          },
          "references": [
            {
              "name": "Security patch",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/455dd92c4179c53204368d93681ded4b57e31643"
            }
          ],
          "solutions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe fix applies the existing sanitize_text() helper to the user-controlled username value (d.obj) immediately before it is interpolated into the D3 tooltip HTML string. This ensures that any HTML or script content embedded in the stored username is neutralized before DOM insertion, preventing script execution while preserving the tooltip\u0027s intended formatting (line breaks and date/time display).\u003c/p\u003e"
                }
              ],
              "value": "The fix applies the existing sanitize_text() helper to the user-controlled username value (d.obj) immediately before it is interpolated into the D3 tooltip HTML string. This ensures that any HTML or script content embedded in the stored username is neutralized before DOM insertion, preventing script execution while preserving the tooltip\u0027s intended formatting (line breaks and date/time display)."
            }
          ],
          "source": {
            "discovery": "UNKNOWN"
          },
          "title": "Stored Cross-Site Scripting (XSS) in AIL Framework Username Timeline Tooltip",
          "x_gcve": [
            {
              "extensions": {
                "bcp-05-x-01": {
                  "ai_annotations": [
                    {
                      "ai_level": "generated",
                      "description": "Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.",
                      "gna_source": 1,
                      "models": [
                        {
                          "gna_source": 1,
                          "identifier": "qwen3.8:27b",
                          "name": "qwen3.8:27b",
                          "source": "ollama"
                        }
                      ],
                      "review_status": "full",
                      "scope": "record",
                      "tags": [
                        "ai-computer-assisted:llm-generated",
                        "ai-computer-assisted:classification"
                      ]
                    }
                  ]
                },
                "bcp-05-x-02": {
                  "x_patch2vuln": {
                    "assumptions": [
                      "The UI:A (Active) user interaction metric assumes the analyst must deliberately hover over the specific timeline entry to trigger the XSS; passive rendering without hover is not evidenced in the patch.",
                      "The affected version boundary is inferred from the tag_version_boundary metadata (v7.1, 29 commits after fix); the exact last affected and first fixed version numbers are not explicitly stated in the patch.",
                      "PR:N assumes the attacker does not need an account on the AIL Framework itself, only a presence in a crawled chat or forum source; if the platform requires the attacker to be a registered user to have their username crawled, PR:L might be more appropriate.",
                      "The CAPEC-1 mapping is the closest available pattern for stored XSS; no more specific CAPEC ID for \u0027stored XSS via imported data rendered in a tooltip\u0027 exists in the CAPEC catalog.",
                      "The sanitize_text() helper is assumed to perform adequate HTML entity encoding or equivalent neutralization; its implementation is not shown in the patch.",
                      "VC:H and VI:H reflect the sensitivity of an intelligence-analysis platform where an authenticated analyst session may contain classified or highly sensitive data; if the deployment context is less sensitive, lower impact ratings could apply."
                    ],
                    "capecRationale": [
                      {
                        "capecId": "CAPEC-1",
                        "rationale": "CAPEC-1 describes the general pattern of injecting client-side scripts into web pages via untrusted input. The patch evidence shows a stored username (untrusted input from chats/forums) being rendered into an HTML tooltip without sanitization, matching the stored-XSS sub-pattern of CAPEC-1. This is the closest and most direct CAPEC mapping for an XSS vulnerability where attacker-controlled data is persisted and later rendered in a victim\u0027s browser."
                      }
                    ],
                    "commit": "455dd92c4179c53204368d93681ded4b57e31643",
                    "confidence": "medium",
                    "credits": [
                      {
                        "lang": "en",
                        "type": "remediation developer",
                        "value": "terrtia"
                      }
                    ],
                    "cvssRationale": "AV:N: The vulnerability is in a web application accessible over the network. AC:L: The attacker only needs to craft a username with HTML/JS in a chat or forum that gets crawled; no race conditions or complex conditions are needed. AT:N: No attack on the target system is required; the malicious username is stored as part of normal data import. PR:N: The attacker does not need any account or privilege on the AIL Framework; they only need to be a user in a source chat/forum. UI:A: The victim (analyst) must actively hover over the specific timeline entry to trigger script execution. VC:H: XSS in an authenticated analyst session can expose sensitive intelligence data, session tokens, and credentials. VI:H: The attacker can perform actions as the analyst, modify data, or exfiltrate information. VA:N: No impact on availability. SC/SI/SA:N: No subsequent system impact is evidenced.",
                    "fixSummary": "The fix applies the existing sanitize_text() helper to the user-controlled username value (d.obj) immediately before it is interpolated into the D3 tooltip HTML string. This ensures that any HTML or script content embedded in the stored username is neutralized before DOM insertion, preventing script execution while preserving the tooltip\u0027s intended formatting (line breaks and date/time display).",
                    "generatedAt": "2026-09-25T13:24:29.029450Z",
                    "generator": "patch2vuln.py",
                    "model": "qwen3.8:27b",
                    "modelComparison": {
                      "rankings": [
                        {
                          "agreementScore": 9,
                          "assumptionCount": 6,
                          "confidence": "medium",
                          "model": "qwen3.8:27b",
                          "score": 4
                        }
                      ],
                      "selectedModel": "qwen3.8:27b",
                      "selectionMethod": "deterministic-consensus-v1",
                      "selectionNotice": "The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required."
                    },
                    "patchSha256": "36262636a3a75bbee1ac4f863ce7a5ce7939eb2e21fed5ede98403d38c29ec40",
                    "patchSummary": "In var/www/static/js/d3/timeline_basic.js, the single line constructing the tooltip HTML was changed from tooltip.html(`${d.obj}\u003cbr\u003e...`) to tooltip.html(`${sanitize_text(d.obj)}\u003cbr\u003e...`). The only modification is wrapping the untrusted d.obj variable with the sanitize_text() function call at the HTML sink, leaving the rest of the tooltip template (br tags, date formatting) unchanged.",
                    "patchTruncated": false,
                    "patches": [
                      {
                        "commit": "455dd92c4179c53204368d93681ded4b57e31643",
                        "patchSha256": "36262636a3a75bbee1ac4f863ce7a5ce7939eb2e21fed5ede98403d38c29ec40",
                        "source": "https://github.com/ail-project/ail-framework/commit/455dd92c4179c53204368d93681ded4b57e31643.patch",
                        "sourceUrl": "https://github.com/ail-project/ail-framework/commit/455dd92c4179c53204368d93681ded4b57e31643.patch",
                        "subject": "chg: [security] fix XSS in username timeline tooltip."
                      }
                    ],
                    "source": "https://github.com/ail-project/ail-framework/commit/455dd92c4179c53204368d93681ded4b57e31643.patch",
                    "subject": "chg: [security] fix XSS in username timeline tooltip.",
                    "tagVersionBoundary": {
                      "commits_after_fix": 29,
                      "repository": "https://github.com/ail-project/ail-framework",
                      "tag": "v7.1",
                      "version": "7.1",
                      "version_type": "custom"
                    },
                    "weaknessRationale": [
                      {
                        "cweId": "CWE-79",
                        "rationale": "The patch inserts a user-controlled value (username from imported chats/forums) into an HTML context via D3\u0027s html() method without sanitization. The fix adds sanitize_text() at the sink, confirming the root cause is missing output encoding/neutralization of untrusted data in an HTML context, which is the definition of CWE-79 (stored XSS variant)."
                      }
                    ]
                  }
                }
              },
              "recordType": "advisory",
              "vulnId": "GCVE-1-2026-20279"
            }
          ],
          "x_generator": {
            "engine": "Vulnogram 0.2.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "00000000-0000-4000-9000-000000000000",
        "cveId": "CVE-2026-100176",
        "datePublished": "2026-09-25T13:29:00.000Z",
        "dateReserved": "2026-09-25T13:29:00.000Z",
        "dateUpdated": "2026-09-25T13:55:11.866831Z",
        "requesterUserId": "00000000-0000-4000-9000-000000000000",
        "serial": 1,
        "state": "PUBLISHED",
        "vulnId": "GCVE-1-2026-20279"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.1"
    }

    GCVE-1-2026-20269 (CVE-2026-100174)

    Vulnerability from gna-1 – Published: 2026-09-25 13:21 – Updated: 2026-09-25 13:54
    VLAI
    Title
    Stored Cross-Site Scripting (XSS) in AIL Framework Tag Selector via Unescaped Tag Names
    Summary
    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.
    CWE
    • CWE-79 - Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
    • CWE-94 - Improper Control of Generation of Code ('Code Injection')
    Assigner
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: 0 , < 7.1 (semver)
    Create a notification for this product.
    GCVE extensions
    AI involvement GCVE-BCP-05-X-01
    Whole record AI-generated Human-reviewed GNA-1

    Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.

    ai-computer-assisted:llm-generatedai-computer-assisted:classification
    Model Source Identifier
    qwen3.8:27b ollama qwen3.8:27b
    Patch provenance GCVE-BCP-05-X-02
    Generator
    patch2vuln.py on 2026-09-25 13:16
    Model
    qwen3.8:27b
    Input
    https://github.com/ail-project/ail-framework/commit/b2d0ed05f6cf79b2312a3f1f923d0d1a5d7a9edb.patch 2d147dabcc9b…
    Confidence
    medium
    Commit Subject Patch SHA-256
    b2d0ed05f6cf chg: [security] prevent stored XSS in 2d147dabcc9b…
    Fix summary

    The fix ensures that tag names and display values are rendered as plain text rather than as HTML when no custom renderer is explicitly configured. In the suggestion rendering path, the default (non-renderer) case now uses jQuery's .text() method, which HTML-escapes the content. In the selection rendering path, the default case uses document.createTextNode() to insert the value as a text node. Custom renderers, which are developer-supplied and trusted to produce safe HTML, continue to use .html() or .prepend() with raw HTML. The eval() call was also replaced with JSON.parse() to eliminate a code-injection vector.

    Patch summary

    In var/www/static/js/tags.js: (1) Replaced eval(data) with JSON.parse(data) for parsing array-like data strings. (2) In _renderComboItems, introduced a hasRenderer flag; when no custom renderer is set, the displayed value is inserted via resultItemEl.text(displayed) instead of the html property in the jQuery constructor. (3) In the selection rendering block, introduced a hasSelectionRenderer flag; when no custom selection renderer is set, the value is prepended as a text node via document.createTextNode(selectedItemHtml) instead of being set through the html property. (4) The comma separator for text-mode selections is now appended as a text node rather than concatenated into an HTML string.

    CVSS rationale

    AV:N: The vulnerability is exploitable over the network via a web application. AC:L: No race conditions or special timing are required; the payload is stored and triggers on page load. AT:N: No manipulation of the attack target is needed; the stored payload executes automatically. PR:L: The attacker needs a low-privilege authenticated account with permission to create custom tags. UI:P: The victim passively interacts by loading a page that contains the tag selector; no active click or download is required. VC:L: The XSS can read data from the victim's session and page context. VI:L: The XSS can modify page content and submit forms. VA:N: No availability impact is evident. SC:L: The compromised session can access other resources within the same origin. SI:L: The attacker can modify data through the victim's authenticated session. SA:N: No availability impact on subsequent components.

    Weakness rationale
    • CWE-79 The patch explicitly addresses stored XSS: user-controlled tag names were inserted into the DOM as HTML via jQuery's html property without escaping. The fix renders these values as text nodes, which is the canonical remediation for CWE-79. The commit subject line also explicitly states 'prevent stored XSS'.
    • CWE-94 The replacement of eval(data) with JSON.parse(data) addresses a secondary code-injection weakness where a crafted data string could execute arbitrary JavaScript. This is a contributing factor but the primary vulnerability is the stored XSS in tag rendering.
    Attack pattern rationale
    • CAPEC-66 CAPEC-66 describes the general XSS attack pattern where attacker-controlled input is reflected or stored and later rendered as executable content in a victim's browser. This patch fixes a stored XSS variant where malicious tag names are persisted and rendered as HTML. The mapping is direct and well-supported by the commit message and code changes. No more specific CAPEC entry for stored XSS in a tag/selector widget exists in the CAPEC catalog, making CAPEC-66 the closest and most appropriate match.
    Assumptions to verify
    • The affected version range is inferred from the tag_version_boundary metadata indicating the fix commit is 31 commits before the v7.1 tag; exact version boundaries are not explicitly stated in the patch.
    • The UI:P (Passive) rating assumes the victim only needs to load a page containing the tag selector; if the application requires the victim to explicitly open a specific dialog or widget, UI:A (Active) could be more appropriate.
    • The CAPEC-66 mapping is the closest available pattern; no CAPEC entry specifically covers stored XSS in a tag-selector UI component, so the general XSS pattern is used.
    • The PR:L rating assumes that creating a custom tag requires only a basic authenticated account; if tag creation requires elevated privileges, PR:H would be more appropriate.
    • The eval() to JSON.parse() change is treated as a secondary hardening fix within the same patch set; the primary vulnerability addressed is the stored XSS in tag rendering.
    • No specific reporter or finder is identified in the patch metadata or commit message; only the remediation developer (commit author) is credited.
    Model comparison

    Selected qwen3.8:27b by deterministic-consensus-v1
    The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required.

    Model Score Agreement Confidence Assumptions
    qwen3.8:27b 4 9 medium 6

    {
      "containers": {
        "cna": {
          "affected": [
            {
              "defaultStatus": "unaffected",
              "modules": [
                "tag selector (tags.js)"
              ],
              "product": "ail framework",
              "programFiles": [
                "var/www/static/js/tags.js"
              ],
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThan": "7.1",
                  "status": "affected",
                  "version": "0",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Aurelien Thirion"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Jeroen Pinoy"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe 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., \u0026lt;img src=x onerror=alert(1)\u0026gt; or \u0026lt;svg onload=...\u0026gt;) 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\u0027s html property, causing the embedded script to execute in the victim\u0027s browser context.\u003c/p\u003e\u003cp\u003eThe 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\u0027s 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.\u003c/p\u003e\u003cp\u003ePreconditions: 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\u0027s stored tag. The attack is stored (persistent) and does not require the victim to perform any action beyond loading the page.\u003c/p\u003e\u003cp\u003eSecurity impact: successful exploitation allows arbitrary JavaScript execution in the victim\u0027s browser within the application\u0027s origin, potentially leading to session hijacking, unauthorized data access, form manipulation, or further client-side attacks.\u003c/p\u003e"
                }
              ],
              "value": "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., \u003cimg src=x onerror=alert(1)\u003e or \u003csvg onload=...\u003e) 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\u0027s html property, causing the embedded script to execute in the victim\u0027s browser context.\n\nThe 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\u0027s 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.\n\nPreconditions: 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\u0027s stored tag. The attack is stored (persistent) and does not require the victim to perform any action beyond loading the page.\n\nSecurity impact: successful exploitation allows arbitrary JavaScript execution in the victim\u0027s browser within the application\u0027s origin, potentially leading to session hijacking, unauthorized data access, form manipulation, or further client-side attacks."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-66",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-66 Cross Site Scripting (XSS)"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 5.1,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "LOW",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "LOW",
                "subIntegrityImpact": "LOW",
                "userInteraction": "PASSIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "LOW",
                "vulnIntegrityImpact": "LOW",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-79",
                  "description": "CWE-79 Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            },
            {
              "descriptions": [
                {
                  "cweId": "CWE-94",
                  "description": "CWE-94 Improper Control of Generation of Code (\u0027Code Injection\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "orgId": "00000000-0000-4000-9000-000000000000"
          },
          "references": [
            {
              "name": "Security patch",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/b2d0ed05f6cf79b2312a3f1f923d0d1a5d7a9edb"
            }
          ],
          "solutions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe fix ensures that tag names and display values are rendered as plain text rather than as HTML when no custom renderer is explicitly configured. In the suggestion rendering path, the default (non-renderer) case now uses jQuery\u0027s .text() method, which HTML-escapes the content. In the selection rendering path, the default case uses document.createTextNode() to insert the value as a text node. Custom renderers, which are developer-supplied and trusted to produce safe HTML, continue to use .html() or .prepend() with raw HTML. The eval() call was also replaced with JSON.parse() to eliminate a code-injection vector.\u003c/p\u003e"
                }
              ],
              "value": "The fix ensures that tag names and display values are rendered as plain text rather than as HTML when no custom renderer is explicitly configured. In the suggestion rendering path, the default (non-renderer) case now uses jQuery\u0027s .text() method, which HTML-escapes the content. In the selection rendering path, the default case uses document.createTextNode() to insert the value as a text node. Custom renderers, which are developer-supplied and trusted to produce safe HTML, continue to use .html() or .prepend() with raw HTML. The eval() call was also replaced with JSON.parse() to eliminate a code-injection vector."
            }
          ],
          "source": {
            "discovery": "UNKNOWN"
          },
          "title": "Stored Cross-Site Scripting (XSS) in AIL Framework Tag Selector via Unescaped Tag Names",
          "x_gcve": [
            {
              "extensions": {
                "bcp-05-x-01": {
                  "ai_annotations": [
                    {
                      "ai_level": "generated",
                      "description": "Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.",
                      "gna_source": 1,
                      "models": [
                        {
                          "gna_source": 1,
                          "identifier": "qwen3.8:27b",
                          "name": "qwen3.8:27b",
                          "source": "ollama"
                        }
                      ],
                      "review_status": "full",
                      "scope": "record",
                      "tags": [
                        "ai-computer-assisted:llm-generated",
                        "ai-computer-assisted:classification"
                      ]
                    }
                  ]
                },
                "bcp-05-x-02": {
                  "x_patch2vuln": {
                    "assumptions": [
                      "The affected version range is inferred from the tag_version_boundary metadata indicating the fix commit is 31 commits before the v7.1 tag; exact version boundaries are not explicitly stated in the patch.",
                      "The UI:P (Passive) rating assumes the victim only needs to load a page containing the tag selector; if the application requires the victim to explicitly open a specific dialog or widget, UI:A (Active) could be more appropriate.",
                      "The CAPEC-66 mapping is the closest available pattern; no CAPEC entry specifically covers stored XSS in a tag-selector UI component, so the general XSS pattern is used.",
                      "The PR:L rating assumes that creating a custom tag requires only a basic authenticated account; if tag creation requires elevated privileges, PR:H would be more appropriate.",
                      "The eval() to JSON.parse() change is treated as a secondary hardening fix within the same patch set; the primary vulnerability addressed is the stored XSS in tag rendering.",
                      "No specific reporter or finder is identified in the patch metadata or commit message; only the remediation developer (commit author) is credited."
                    ],
                    "capecRationale": [
                      {
                        "capecId": "CAPEC-66",
                        "rationale": "CAPEC-66 describes the general XSS attack pattern where attacker-controlled input is reflected or stored and later rendered as executable content in a victim\u0027s browser. This patch fixes a stored XSS variant where malicious tag names are persisted and rendered as HTML. The mapping is direct and well-supported by the commit message and code changes. No more specific CAPEC entry for stored XSS in a tag/selector widget exists in the CAPEC catalog, making CAPEC-66 the closest and most appropriate match."
                      }
                    ],
                    "commit": "b2d0ed05f6cf79b2312a3f1f923d0d1a5d7a9edb",
                    "confidence": "medium",
                    "credits": [
                      {
                        "lang": "en",
                        "type": "remediation developer",
                        "value": "terrtia"
                      }
                    ],
                    "cvssRationale": "AV:N: The vulnerability is exploitable over the network via a web application. AC:L: No race conditions or special timing are required; the payload is stored and triggers on page load. AT:N: No manipulation of the attack target is needed; the stored payload executes automatically. PR:L: The attacker needs a low-privilege authenticated account with permission to create custom tags. UI:P: The victim passively interacts by loading a page that contains the tag selector; no active click or download is required. VC:L: The XSS can read data from the victim\u0027s session and page context. VI:L: The XSS can modify page content and submit forms. VA:N: No availability impact is evident. SC:L: The compromised session can access other resources within the same origin. SI:L: The attacker can modify data through the victim\u0027s authenticated session. SA:N: No availability impact on subsequent components.",
                    "fixSummary": "The fix ensures that tag names and display values are rendered as plain text rather than as HTML when no custom renderer is explicitly configured. In the suggestion rendering path, the default (non-renderer) case now uses jQuery\u0027s .text() method, which HTML-escapes the content. In the selection rendering path, the default case uses document.createTextNode() to insert the value as a text node. Custom renderers, which are developer-supplied and trusted to produce safe HTML, continue to use .html() or .prepend() with raw HTML. The eval() call was also replaced with JSON.parse() to eliminate a code-injection vector.",
                    "generatedAt": "2026-09-25T13:16:06.156442Z",
                    "generator": "patch2vuln.py",
                    "model": "qwen3.8:27b",
                    "modelComparison": {
                      "rankings": [
                        {
                          "agreementScore": 9,
                          "assumptionCount": 6,
                          "confidence": "medium",
                          "model": "qwen3.8:27b",
                          "score": 4
                        }
                      ],
                      "selectedModel": "qwen3.8:27b",
                      "selectionMethod": "deterministic-consensus-v1",
                      "selectionNotice": "The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required."
                    },
                    "patchSha256": "2d147dabcc9bebce7722917d80f13e49a10f9a2a4089ec6207cce9edb9187f77",
                    "patchSummary": "In var/www/static/js/tags.js: (1) Replaced eval(data) with JSON.parse(data) for parsing array-like data strings. (2) In _renderComboItems, introduced a hasRenderer flag; when no custom renderer is set, the displayed value is inserted via resultItemEl.text(displayed) instead of the html property in the jQuery constructor. (3) In the selection rendering block, introduced a hasSelectionRenderer flag; when no custom selection renderer is set, the value is prepended as a text node via document.createTextNode(selectedItemHtml) instead of being set through the html property. (4) The comma separator for text-mode selections is now appended as a text node rather than concatenated into an HTML string.",
                    "patchTruncated": false,
                    "patches": [
                      {
                        "commit": "b2d0ed05f6cf79b2312a3f1f923d0d1a5d7a9edb",
                        "patchSha256": "2d147dabcc9bebce7722917d80f13e49a10f9a2a4089ec6207cce9edb9187f77",
                        "source": "https://github.com/ail-project/ail-framework/commit/b2d0ed05f6cf79b2312a3f1f923d0d1a5d7a9edb.patch",
                        "sourceUrl": "https://github.com/ail-project/ail-framework/commit/b2d0ed05f6cf79b2312a3f1f923d0d1a5d7a9edb.patch",
                        "subject": "chg: [security] prevent stored XSS in"
                      }
                    ],
                    "source": "https://github.com/ail-project/ail-framework/commit/b2d0ed05f6cf79b2312a3f1f923d0d1a5d7a9edb.patch",
                    "subject": "chg: [security] prevent stored XSS in",
                    "tagVersionBoundary": {
                      "commits_after_fix": 31,
                      "repository": "https://github.com/ail-project/ail-framework",
                      "tag": "v7.1",
                      "version": "7.1",
                      "version_type": "custom"
                    },
                    "weaknessRationale": [
                      {
                        "cweId": "CWE-79",
                        "rationale": "The patch explicitly addresses stored XSS: user-controlled tag names were inserted into the DOM as HTML via jQuery\u0027s html property without escaping. The fix renders these values as text nodes, which is the canonical remediation for CWE-79. The commit subject line also explicitly states \u0027prevent stored XSS\u0027."
                      },
                      {
                        "cweId": "CWE-94",
                        "rationale": "The replacement of eval(data) with JSON.parse(data) addresses a secondary code-injection weakness where a crafted data string could execute arbitrary JavaScript. This is a contributing factor but the primary vulnerability is the stored XSS in tag rendering."
                      }
                    ]
                  }
                }
              },
              "recordType": "advisory",
              "vulnId": "GCVE-1-2026-20269"
            }
          ],
          "x_generator": {
            "engine": "Vulnogram 0.2.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "00000000-0000-4000-9000-000000000000",
        "cveId": "CVE-2026-100174",
        "datePublished": "2026-09-25T13:21:00.000Z",
        "dateReserved": "2026-09-25T13:22:00.000Z",
        "dateUpdated": "2026-09-25T13:54:48.431524Z",
        "requesterUserId": "00000000-0000-4000-9000-000000000000",
        "serial": 1,
        "state": "PUBLISHED",
        "vulnId": "GCVE-1-2026-20269"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.1"
    }

    GCVE-1-2026-20239 (CVE-2026-100172)

    Vulnerability from gna-1 – Published: 2026-09-25 13:13 – Updated: 2026-09-25 13:54
    VLAI
    Title
    Stored XSS in AIL Framework extracted-match popovers via unescaped dynamic values in HTML-enabled data-content attributes
    Summary
    The AIL Framework (ail-project/ail-framework) contains a stored cross-site scripting (XSS) vulnerability in two Jinja2 templates that render popovers for matched, tracked, or tagged content: var/www/templates/chats_explorer/block_message.html and var/www/templates/objects/item/show_item.html. In both templates, dynamic values associated with this content, including icon color, icon style, icon glyph, subtype, identifier, name, description, and matched value, are interpolated directly into the data-content HTML attribute of Bootstrap popover elements without appropriate output encoding. Because the popovers are configured with data-html="true", the content is interpreted as HTML in the victim's browser. An authenticated attacker who can influence matched, tracked, or tagged content may inject arbitrary HTML or JavaScript into these values. When a victim displays the affected popover, the injected markup may execute in the victim's session, potentially enabling data exfiltration or actions with the victim's privileges. The vulnerability is classified as stored XSS because the malicious payload can persist in the affected match, tracking, or tag-related data and be delivered to users who view the affected content.
    CWE
    • CWE-79 - Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
    Assigner
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: unspecified , < 7.1 (semver)
    Create a notification for this product.
    GCVE extensions
    AI involvement GCVE-BCP-05-X-01
    Whole record AI-generated Human-reviewed GNA-1

    Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.

    ai-computer-assisted:llm-generatedai-computer-assisted:classification
    Model Source Identifier
    qwen3.8:27b ollama qwen3.8:27b
    Patch provenance GCVE-BCP-05-X-02
    Generator
    patch2vuln.py on 2026-09-25 12:56
    Model
    qwen3.8:27b
    Input
    https://github.com/ail-project/ail-framework/commit/ee63a0a96646790255e038f5ca5dd0ab5fe98db2.patch bd188338f882…
    Confidence
    medium
    Commit Subject Patch SHA-256
    ee63a0a96646 chg: [security] fix XSS in show item and message popover of bd188338f882…
    Fix summary

    The fix applies double HTML-escaping (Jinja2 forceescape|forceescape) to every dynamic value interpolated into the HTML-enabled data-content attribute of the popover elements in both templates. Double-escaping is required because the values must survive both the outer HTML attribute context and the inner HTML parsing performed by the popover plugin. This neutralizes any HTML or script injection from the extracted-match fields.

    Patch summary

    In block_message.html and show_item.html, the Jinja2 expressions for extracted_matches fields (icon color, icon style, icon, subtype, id, name, description) and the matched value r[1] are each suffixed with |forceescape|forceescape. No other logic, routing, or configuration changes are made. Two lines changed in total (one per file).

    CVSS rationale

    AV:N: web application reachable over the network. AC:L: crafting a message or item with a malicious extracted-match value requires no special race or timing. AT:N: no manipulation of the attack target is needed. PR:L: the attacker must be an authenticated user capable of creating or modifying chat messages or items. UI:P: the victim must passively interact (hover over the element) to trigger the popover rendering; no click or explicit action is required. VC:H: the injected script can read session cookies, DOM data, and API responses in the victim's browser. VI:H: the script can perform authenticated actions on behalf of the victim (create, modify, delete data). VA:N: no direct denial-of-service impact is evident. SC/SI/SA:N: the subcomponent (the AIL Framework server) is not directly compromised; the impact is confined to the victim's browser session.

    Weakness rationale
    • CWE-79 Dynamic values from extracted-match data are interpolated into an HTML-enabled attribute without output encoding, allowing script injection. The fix adds forceescape, confirming the root cause is missing output encoding in an HTML context. CWE-79 is the precise weakness.
    Attack pattern rationale
    • CAPEC-1 The patch directly addresses stored XSS: attacker-controlled content is persisted in application data (chat messages, items) and rendered as executable HTML in a victim's browser via an unescaped data-content attribute. CAPEC-1 is the canonical attack pattern for XSS and is the closest match. No uncertainty in this mapping.
    Assumptions to verify
    • The AIL Framework requires authenticated access to create or modify chat messages and items; PR:L is assumed based on the application being a threat-intelligence platform with user accounts.
    • The extracted-match data (icon color, style, subtype, id, name, description) can be influenced by an authenticated user through normal application workflows (e.g., submitting content that the extraction pipeline processes).
    • The popover is triggered on hover (data-trigger="hover"), classified as passive user interaction (UI:P).
    • The tag v7.1 boundary with 143 commits after the fix suggests the fix landed before v7.1, but exact affected version ranges are not confirmed by the patch alone.
    • CAPEC-1 is selected as the closest standard attack pattern; no more specific CAPEC for stored XSS in HTML attributes exists in the CAPEC catalog.
    Model comparison

    Selected qwen3.8:27b by deterministic-consensus-v1
    The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required.

    Model Score Agreement Confidence Assumptions
    qwen3.8:27b 5 9 medium 5

    {
      "containers": {
        "cna": {
          "affected": [
            {
              "defaultStatus": "unaffected",
              "modules": [
                "chats_explorer (block_message.html)",
                "objects/item (show_item.html)"
              ],
              "product": "ail framework",
              "programFiles": [
                "var/www/templates/chats_explorer/block_message.html",
                "var/www/templates/objects/item/show_item.html"
              ],
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThan": "7.1",
                  "status": "affected",
                  "version": "unspecified",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Aurelien Thirion"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Jeroen Pinoy"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe AIL Framework (ail-project/ail-framework) contains a stored cross-site scripting (XSS) vulnerability in two Jinja2 templates that render popovers for matched, tracked, or tagged content: var/www/templates/chats_explorer/block_message.html and var/www/templates/objects/item/show_item.html. In both templates, dynamic values associated with this content, including icon color, icon style, icon glyph, subtype, identifier, name, description, and matched value, are interpolated directly into the data-content HTML attribute of Bootstrap popover elements without appropriate output encoding. Because the popovers are configured with data-html=\"true\", the content is interpreted as HTML in the victim\u0027s browser. An authenticated attacker who can influence matched, tracked, or tagged content may inject arbitrary HTML or JavaScript into these values. When a victim displays the affected popover, the injected markup may execute in the victim\u0027s session, potentially enabling data exfiltration or actions with the victim\u0027s privileges. The vulnerability is classified as stored XSS because the malicious payload can persist in the affected match, tracking, or tag-related data and be delivered to users who view the affected content.\u003c/p\u003e"
                }
              ],
              "value": "The AIL Framework (ail-project/ail-framework) contains a stored cross-site scripting (XSS) vulnerability in two Jinja2 templates that render popovers for matched, tracked, or tagged content: var/www/templates/chats_explorer/block_message.html and var/www/templates/objects/item/show_item.html. In both templates, dynamic values associated with this content, including icon color, icon style, icon glyph, subtype, identifier, name, description, and matched value, are interpolated directly into the data-content HTML attribute of Bootstrap popover elements without appropriate output encoding. Because the popovers are configured with data-html=\"true\", the content is interpreted as HTML in the victim\u0027s browser. An authenticated attacker who can influence matched, tracked, or tagged content may inject arbitrary HTML or JavaScript into these values. When a victim displays the affected popover, the injected markup may execute in the victim\u0027s session, potentially enabling data exfiltration or actions with the victim\u0027s privileges. The vulnerability is classified as stored XSS because the malicious payload can persist in the affected match, tracking, or tag-related data and be delivered to users who view the affected content."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-1",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-1 Cross Site Scripting (XSS)"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 8.5,
                "baseSeverity": "HIGH",
                "privilegesRequired": "LOW",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "PASSIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "HIGH",
                "vulnIntegrityImpact": "HIGH",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-79",
                  "description": "CWE-79 Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "orgId": "00000000-0000-4000-9000-000000000000"
          },
          "references": [
            {
              "name": "Security patch",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/ee63a0a96646790255e038f5ca5dd0ab5fe98db2"
            }
          ],
          "solutions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe fix applies double HTML-escaping (Jinja2 forceescape|forceescape) to every dynamic value interpolated into the HTML-enabled data-content attribute of the popover elements in both templates. Double-escaping is required because the values must survive both the outer HTML attribute context and the inner HTML parsing performed by the popover plugin. This neutralizes any HTML or script injection from the extracted-match fields.\u003c/p\u003e"
                }
              ],
              "value": "The fix applies double HTML-escaping (Jinja2 forceescape|forceescape) to every dynamic value interpolated into the HTML-enabled data-content attribute of the popover elements in both templates. Double-escaping is required because the values must survive both the outer HTML attribute context and the inner HTML parsing performed by the popover plugin. This neutralizes any HTML or script injection from the extracted-match fields."
            }
          ],
          "source": {
            "discovery": "UNKNOWN"
          },
          "title": "Stored XSS in AIL Framework extracted-match popovers via unescaped dynamic values in HTML-enabled data-content attributes",
          "x_gcve": [
            {
              "extensions": {
                "bcp-05-x-01": {
                  "ai_annotations": [
                    {
                      "ai_level": "generated",
                      "description": "Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.",
                      "gna_source": 1,
                      "models": [
                        {
                          "gna_source": 1,
                          "identifier": "qwen3.8:27b",
                          "name": "qwen3.8:27b",
                          "source": "ollama"
                        }
                      ],
                      "review_status": "full",
                      "scope": "record",
                      "tags": [
                        "ai-computer-assisted:llm-generated",
                        "ai-computer-assisted:classification"
                      ]
                    }
                  ]
                },
                "bcp-05-x-02": {
                  "x_patch2vuln": {
                    "assumptions": [
                      "The AIL Framework requires authenticated access to create or modify chat messages and items; PR:L is assumed based on the application being a threat-intelligence platform with user accounts.",
                      "The extracted-match data (icon color, style, subtype, id, name, description) can be influenced by an authenticated user through normal application workflows (e.g., submitting content that the extraction pipeline processes).",
                      "The popover is triggered on hover (data-trigger=\"hover\"), classified as passive user interaction (UI:P).",
                      "The tag v7.1 boundary with 143 commits after the fix suggests the fix landed before v7.1, but exact affected version ranges are not confirmed by the patch alone.",
                      "CAPEC-1 is selected as the closest standard attack pattern; no more specific CAPEC for stored XSS in HTML attributes exists in the CAPEC catalog."
                    ],
                    "capecRationale": [
                      {
                        "capecId": "CAPEC-1",
                        "rationale": "The patch directly addresses stored XSS: attacker-controlled content is persisted in application data (chat messages, items) and rendered as executable HTML in a victim\u0027s browser via an unescaped data-content attribute. CAPEC-1 is the canonical attack pattern for XSS and is the closest match. No uncertainty in this mapping."
                      }
                    ],
                    "commit": "ee63a0a96646790255e038f5ca5dd0ab5fe98db2",
                    "confidence": "medium",
                    "credits": [
                      {
                        "lang": "en",
                        "type": "remediation developer",
                        "value": "terrtia"
                      }
                    ],
                    "cvssRationale": "AV:N: web application reachable over the network. AC:L: crafting a message or item with a malicious extracted-match value requires no special race or timing. AT:N: no manipulation of the attack target is needed. PR:L: the attacker must be an authenticated user capable of creating or modifying chat messages or items. UI:P: the victim must passively interact (hover over the element) to trigger the popover rendering; no click or explicit action is required. VC:H: the injected script can read session cookies, DOM data, and API responses in the victim\u0027s browser. VI:H: the script can perform authenticated actions on behalf of the victim (create, modify, delete data). VA:N: no direct denial-of-service impact is evident. SC/SI/SA:N: the subcomponent (the AIL Framework server) is not directly compromised; the impact is confined to the victim\u0027s browser session.",
                    "fixSummary": "The fix applies double HTML-escaping (Jinja2 forceescape|forceescape) to every dynamic value interpolated into the HTML-enabled data-content attribute of the popover elements in both templates. Double-escaping is required because the values must survive both the outer HTML attribute context and the inner HTML parsing performed by the popover plugin. This neutralizes any HTML or script injection from the extracted-match fields.",
                    "generatedAt": "2026-09-25T12:56:24.137641Z",
                    "generator": "patch2vuln.py",
                    "model": "qwen3.8:27b",
                    "modelComparison": {
                      "rankings": [
                        {
                          "agreementScore": 9,
                          "assumptionCount": 5,
                          "confidence": "medium",
                          "model": "qwen3.8:27b",
                          "score": 5
                        }
                      ],
                      "selectedModel": "qwen3.8:27b",
                      "selectionMethod": "deterministic-consensus-v1",
                      "selectionNotice": "The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required."
                    },
                    "patchSha256": "bd188338f8828ab59743776228d2991b51a3f83b870dedf073a54c6139ad9e26",
                    "patchSummary": "In block_message.html and show_item.html, the Jinja2 expressions for extracted_matches fields (icon color, icon style, icon, subtype, id, name, description) and the matched value r[1] are each suffixed with |forceescape|forceescape. No other logic, routing, or configuration changes are made. Two lines changed in total (one per file).",
                    "patchTruncated": false,
                    "patches": [
                      {
                        "commit": "ee63a0a96646790255e038f5ca5dd0ab5fe98db2",
                        "patchSha256": "bd188338f8828ab59743776228d2991b51a3f83b870dedf073a54c6139ad9e26",
                        "source": "https://github.com/ail-project/ail-framework/commit/ee63a0a96646790255e038f5ca5dd0ab5fe98db2.patch",
                        "sourceUrl": "https://github.com/ail-project/ail-framework/commit/ee63a0a96646790255e038f5ca5dd0ab5fe98db2.patch",
                        "subject": "chg: [security] fix XSS in show item and message popover of"
                      }
                    ],
                    "source": "https://github.com/ail-project/ail-framework/commit/ee63a0a96646790255e038f5ca5dd0ab5fe98db2.patch",
                    "subject": "chg: [security] fix XSS in show item and message popover of",
                    "tagVersionBoundary": {
                      "commits_after_fix": 143,
                      "repository": "https://github.com/ail-project/ail-framework",
                      "tag": "v7.1",
                      "version": "7.1",
                      "version_type": "custom"
                    },
                    "weaknessRationale": [
                      {
                        "cweId": "CWE-79",
                        "rationale": "Dynamic values from extracted-match data are interpolated into an HTML-enabled attribute without output encoding, allowing script injection. The fix adds forceescape, confirming the root cause is missing output encoding in an HTML context. CWE-79 is the precise weakness."
                      }
                    ]
                  }
                }
              },
              "recordType": "advisory",
              "vulnId": "GCVE-1-2026-20239"
            }
          ],
          "x_generator": {
            "engine": "Vulnogram 0.2.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "00000000-0000-4000-9000-000000000000",
        "cveId": "CVE-2026-100172",
        "datePublished": "2026-09-25T13:13:00.000Z",
        "dateReserved": "2026-09-25T13:13:00.000Z",
        "dateUpdated": "2026-09-25T13:54:03.667825Z",
        "requesterUserId": "00000000-0000-4000-9000-000000000000",
        "serial": 1,
        "state": "PUBLISHED",
        "vulnId": "GCVE-1-2026-20239"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.1"
    }

    GCVE-1-2026-20131 (CVE-2026-56450)

    Vulnerability from gna-1 – Published: 2026-06-22 13:02 – Updated: 2026-06-22 13:02
    VLAI
    Title
    AIL Framework - Missing Rate Limiting Enables Brute-Force Attacks Against Two-Factor Authentication Codes
    Summary
    AIL did not restrict repeated failed attempts to verify a two-factor authentication (OTP) code. An attacker who had reached the 2FA verification step, such as after successfully completing the password-authentication stage, could submit an unlimited number of OTP guesses. This could enable brute-force guessing of a valid code and bypass the intended second authentication factor, resulting in unauthorized account access. The patch introduces per-user failed-OTP tracking, blocks verification after 30 failed attempts for one hour, clears the counter after a successful OTP verification, and provides administrator recovery actions to purge affected lockouts.
    CWE
    • CWE-307 - Improper Restriction of Excessive Authentication Attempts
    Assigner
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: 0 , ≤ 6.8.0 (semver)
    Create a notification for this product.

    {
      "containers": {
        "cna": {
          "affected": [
            {
              "defaultStatus": "unaffected",
              "product": "ail framework",
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThanOrEqual": "6.8.0",
                  "status": "affected",
                  "version": "0",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Aurelien Thirion"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Stephen O"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eAIL did not restrict repeated failed attempts to verify a two-factor authentication (OTP) code. An attacker who had reached the 2FA verification step, such as after successfully completing the password-authentication stage, could submit an unlimited number of OTP guesses. This could enable brute-force guessing of a valid code and bypass the intended second authentication factor, resulting in unauthorized account access.\u003c/p\u003e\n\u003cp\u003eThe patch introduces per-user failed-OTP tracking, blocks verification after 30 failed attempts for one hour, clears the counter after a successful OTP verification, and provides administrator recovery actions to purge affected lockouts.\u003c/p\u003e\u003cbr\u003e"
                }
              ],
              "value": "AIL did not restrict repeated failed attempts to verify a two-factor authentication (OTP) code. An attacker who had reached the 2FA verification step, such as after successfully completing the password-authentication stage, could submit an unlimited number of OTP guesses. This could enable brute-force guessing of a valid code and bypass the intended second authentication factor, resulting in unauthorized account access.\n\n\nThe patch introduces per-user failed-OTP tracking, blocks verification after 30 failed attempts for one hour, clears the counter after a successful OTP verification, and provides administrator recovery actions to purge affected lockouts."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-112",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-112 Brute Force"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 5.1,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "ACTIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "LOW",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-307",
                  "description": "CWE-307 Improper Restriction of Excessive Authentication Attempts",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "orgId": "00000000-0000-4000-9000-000000000000"
          },
          "references": [
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/d3a394fe68fd5aeee86f3a3c91d4a0350f91e974"
            }
          ],
          "source": {
            "discovery": "UNKNOWN"
          },
          "title": "AIL Framework - Missing Rate Limiting Enables Brute-Force Attacks Against Two-Factor Authentication Codes",
          "x_gcve": [
            {
              "recordType": "advisory",
              "vulnId": "gcve-1-2026-20131"
            }
          ],
          "x_generator": {
            "engine": "Vulnogram 0.2.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "00000000-0000-4000-9000-000000000000",
        "cveId": "CVE-2026-56450",
        "datePublished": "2026-06-22T13:02:18.669480Z",
        "dateReserved": "2026-06-22T13:02:27.234Z",
        "dateUpdated": "2026-06-22T13:02:27.300718Z",
        "requesterUserId": "00000000-0000-4000-9000-000000000000",
        "serial": 1,
        "state": "PUBLISHED",
        "vulnId": "gcve-1-2026-20131"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.1"
    }

    GCVE-1-2026-20088 (CVE-2026-56448)

    Vulnerability from gna-1 – Published: 2026-06-22 12:53 – Updated: 2026-06-22 12:54
    VLAI
    Title
    Authenticated Path Traversal in AIL Framework Investigation Downloads Allows Arbitrary File Read
    Summary
    A path traversal vulnerability exists in AIL Framework before the release containing commit 0041456af25da0cdea1c1c4624e46baff2731d8f. An authenticated AIL user can supply crafted object identifiers through the investigation workflow to cause file paths to resolve outside the intended image, favicon, or screenshot storage directories. This may allow the attacker to download and read arbitrary files that are accessible to the AIL process. The issue occurs because user-controlled path components were joined with application storage paths without verifying that the resolved path remained within the expected directory. The affected download functionality could then include the contents of such files in a generated archive.
    CWE
    • CWE-22 - Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')
    Assigner
    References
    Impacted products
    Vendor Product Version
    ail project ail framework Affected: 0 , ≤ 6.8.0 (semver)
    Create a notification for this product.

    {
      "containers": {
        "cna": {
          "affected": [
            {
              "defaultStatus": "unaffected",
              "product": "ail framework",
              "repo": "https://github.com/ail-project/ail-framework",
              "vendor": "ail project",
              "versions": [
                {
                  "lessThanOrEqual": "6.8.0",
                  "status": "affected",
                  "version": "0",
                  "versionType": "semver"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Aurelien Thirion"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Stephen O"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Tom\u00e1s Illuminati"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eA path traversal vulnerability exists in AIL Framework before the release containing commit \u003ccode\u003e0041456af25da0cdea1c1c4624e46baff2731d8f\u003c/code\u003e. An authenticated AIL user can supply crafted object identifiers through the investigation workflow to cause file paths to resolve outside the intended image, favicon, or screenshot storage directories. This may allow the attacker to download and read arbitrary files that are accessible to the AIL process.\u003c/p\u003e\u003cp\u003eThe issue occurs because user-controlled path components were joined with application storage paths without verifying that the resolved path remained within the expected directory. The affected download functionality could then include the contents of such files in a generated archive.\u003c/p\u003e\u003cbr\u003e"
                }
              ],
              "value": "A path traversal vulnerability exists in AIL Framework before the release containing commit 0041456af25da0cdea1c1c4624e46baff2731d8f. An authenticated AIL user can supply crafted object identifiers through the investigation workflow to cause file paths to resolve outside the intended image, favicon, or screenshot storage directories. This may allow the attacker to download and read arbitrary files that are accessible to the AIL process.\n\nThe issue occurs because user-controlled path components were joined with application storage paths without verifying that the resolved path remained within the expected directory. The affected download functionality could then include the contents of such files in a generated archive."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-126",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-126 Path Traversal"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "PRESENT",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 8.3,
                "baseSeverity": "HIGH",
                "privilegesRequired": "LOW",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "HIGH",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N/S:P",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "HIGH",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-22",
                  "description": "CWE-22 Improper Limitation of a Pathname to a Restricted Directory (\u0027Path Traversal\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "orgId": "00000000-0000-4000-9000-000000000000"
          },
          "references": [
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ail-project/ail-framework/commit/0041456af25da0cdea1c1c4624e46baff2731d8f"
            }
          ],
          "source": {
            "discovery": "UNKNOWN"
          },
          "title": "Authenticated Path Traversal in AIL Framework Investigation Downloads Allows Arbitrary File Read",
          "x_gcve": [
            {
              "recordType": "advisory",
              "vulnId": "gcve-1-2026-20088"
            }
          ],
          "x_generator": {
            "engine": "Vulnogram 0.2.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "00000000-0000-4000-9000-000000000000",
        "cveId": "CVE-2026-56448",
        "datePublished": "2026-06-22T12:53:47.032329Z",
        "dateReserved": "2026-06-22T12:54:39.454Z",
        "dateUpdated": "2026-06-22T12:54:39.580842Z",
        "requesterUserId": "00000000-0000-4000-9000-000000000000",
        "serial": 1,
        "state": "PUBLISHED",
        "vulnId": "gcve-1-2026-20088"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.1"
    }