Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
ReconAuthenticate as low-privilege customer_user
-
DeliverySubmit stored XSS via alert comment API
-
ExploitAnalyst/admin views alert, v-html executes script
-
InstallScript reads access and refresh tokens from storage
-
C2Exfiltrate tokens to attacker-controlled host
-
ExecuteMint fresh tokens via /auth/refresh for persistence
-
ImpactCross-tenant data access, incident modification or deletion
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Output encoding, context-aware escaping
MITRE ATT&CK
2 techniques across 2 tactics: Initial Access, Execution The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Requires an authenticated portal account at the lowest role (customer_user) to write stored markup via POST /api/incidents/db_operations/alert/comment; the create route authorizes admin, analyst, and customer_user. The payload executes because AlertComment.vue binds comment.comment to v-html after only a newline-to-<br> transform, with no HTML escaping and no DOMPurify/sanitize-html dependency in either frontend or customer-portal; the same unsanitized v-html pattern affects SocCaseNote.vue, SocCaseItem.vue, SocCaseAssetsItem.vue, SocAlertAssetsItem.vue, and HealthcheckItem.vue, so poisoned comment, case, asset, or health-check fields all trigger. Full privileged account takeover additionally requires that a privileged user (analyst or administrator) views the poisoned alert or case, and depends on the tokens being stored in JavaScript-readable storage (auth.ts) and sent as bearer headers (httpClient.ts) rather than HttpOnly cookies. Limiting factors: an attacker needs a valid portal login, a higher-privilege victim must view the content for escalation, and the issue is confined to affected snapshots preceding 0.1.70 (health-check sink) and 0.1.76 (comment and other SOC sinks). |
| Impact | This is a genuine high-priority issue, not a CVSS-inflated one. The provided CVSS 3.1 vector (AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H, 9.9) is corroborated by the vuln.today decision label of act_now and by a reporter-confirmed, reproduced proof-of-concept in the GHSA advisory. The combination is the dangerous part: a stored XSS reachable by the lowest-privilege portal role (customer_user) that fires in the browser of whoever views the poisoned alert or case, chained with tokens (both access and refresh) held in JavaScript-readable storage (CWE-922) and sent as bearer headers rather than HttpOnly cookies. That chain converts a low-privilege input flaw into cross-tenant privileged account takeover of a security product. Signals largely agree rather than conflict. Note the gaps: no EPSS score and no CISA KEV entry are present in the input, so there is no quantitative exploitation-probability signal and no evidence of observed in-the-wild exploitation - the urgency rests on the act_now label and the confirmed working PoC, not on KEV. The PR:L in the vector means exploitation is authenticated (an attacker needs a valid, even lowest-tier, portal account); full privileged takeover additionally depends on a privileged user (analyst/admin) later viewing the poisoned content. These are realistic in a multi-tenant SOC portal but are real preconditions, not a drive-by. |
| Exploit ScenarioDerived | An attacker holding a low-privilege customer_user portal account submits a comment containing an HTML/JavaScript payload through POST /api/incidents/db_operations/alert/comment; the backend stores it verbatim. When a SOC analyst or administrator opens that alert, the comment is rendered via v-html without sanitization and the script runs on the application origin, reading the viewer's access and refresh tokens from JavaScript-readable storage and exfiltrating them. A public, reporter-confirmed working proof-of-concept exists - demonstrated live against the published ghcr.io/socfortress/copilot-backend image, popping document.domain from a stored comment - and the vector is network-reachable with low attack complexity (AV:N/AC:L). |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 30, 2026
Stored cross-site scripting in SOCFortress CoPilot lets any authenticated portal user, including the lowest-privilege customer_user role, plant HTML/JavaScript through POST /api/incidents/db_operations/alert/comment that is later rendered unsanitized via v-html in AlertComment.vue, executing on the application origin whenever a viewer opens the poisoned alert. Because the customer portal persists access and refresh tokens in JavaScript-readable storage and sends them as bearer headers rather than HttpOnly cookies, an injected script can read both tokens and mint fresh ones through /auth/refresh, so an analyst or administrator who views the poisoned content hands over a persistent privileged session, enabling cross-tenant data access, incident modification or deletion, and subversion of detection and response. Snapshots preceding 0.1.70 (health-check sink) and 0.1.76 (comment and other SOC sinks) are affected, the vendor advisory includes a proof-of-concept demonstrated live against the published ghcr.io/socfortress/copilot-backend image, and priority is act_now. Per the assessed vector the attacker must be authenticated (PR:L) and the issue is scored at 9.9 with scope change.
RemediationAI
Vendor-released patch: upgrade to CoPilot 0.1.76, the provisional first release containing all observed repairs; deployments that only expose the health-check rendering path should note that fix is first contained in 0.1.70, but 0.1.76 is required to cover the comment and other SOC sinks. Refer to the advisory at https://github.com/socfortress/CoPilot/security/advisories/GHSA-8hqj-cqcc-5f6w and the associated fixes in https://github.com/socfortress/CoPilot/pull/904, https://github.com/socfortress/CoPilot/pull/938, and commits 461e8f84794aee8ada588de3bad79430dc9f4f3d and ab9078bdee5d1c737f37f481103984665a670bdd. The vendor's stated fix directions are, first, render these fields as text using {{ }} interpolation with CSS white-space: pre-wrap instead of v-html with newline-to-<br> (this preserves line breaks but removes any rich-text formatting from comments and case notes); second, where HTML is genuinely required, sanitize with DOMPurify before binding to v-html and add a restrictive Content-Security-Policy as defense in depth (a strict CSP can break inline scripts or third-party widgets and requires testing); and third, move the access and refresh tokens from JavaScript-readable storage into HttpOnly, Secure, SameSite cookies so a script on the page cannot read them, which removes the path from XSS to token theft and account takeover but requires coordinated backend changes to authenticate via cookies and to handle CSRF. Because the vendor states that tokens in JavaScript-readable storage combined with bearer headers are what turns the XSS into account takeover, updating is the complete fix and partial frontend-only changes leave the credential-theft path open.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The root cause is CWE-79: in single-file Vue components such as customer-portal/src/components/alerts/AlertDetails/AlertComment.vue, the computed property commentHtml only replaces newlines with <br> and the result is bound to v-html, which deliberately renders markup rather than text. Neither frontend nor customer-portal declares DOMPurify or sanitize-html, and no global sanitizing wrapper exists, so the backend stores comment markup verbatim and the browser interprets it. The identical pattern is present in SocCaseNote.vue, SocCaseItem.vue, SocCaseAssetsItem.vue, SocAlertAssetsItem.vue and HealthcheckItem.vue, extending the sink surface to server-stored case, asset and health-check fields. The advisory also cites CWE-922 (insecure storage of sensitive information): customer-portal/src/stores/auth.ts persists the entire user object, both access_token and refresh_token, into Pinia storage that is readable from JavaScript, and customer-portal/src/api/httpClient.ts attaches the token as an Authorization bearer header instead of relying on HttpOnly, Secure, SameSite cookies, so any script on the origin can exfiltrate credentials that survive page reload and session expiry via the refresh endpoint.
Know when Copilot gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
Authenticated lowest-role write (PR:L) over the network with no special complexity (AC:L); stored payload runs on the app origin crossing the security boundary into other tenants/privileged sessions (S:C), enabling token theft and full takeover (C:H/I:H/A:H).
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
SOCFortress CoPilot focuses on providing a single pane of glass for all your security operations needs. In affected snapshots preceding the respective 0.1.70 and 0.1.76 sink repairs, portal users, including customer_user, can submit stored markup through POST /api/incidents/db_operations/alert/comment. In customer-portal/src/components/alerts/AlertDetails/AlertComment.vue, commentHtml replaces newlines in comment.comment but passes the result to v-html without escaping or sanitizing HTML. When another user views the poisoned alert, stored script executes on the application origin; the same unsanitized rendering pattern affects server-stored SOC case, asset and health-check fields in SocCaseNote.vue, SocCaseItem.vue, SocCaseAssetsItem.vue, SocAlertAssetsItem.vue and HealthcheckItem.vue. The authentication store in customer-portal/src/stores/auth.ts persists both access and refresh tokens in JavaScript-readable storage, and customer-portal/src/api/httpClient.ts uses bearer headers rather than HttpOnly cookies. An injected script can steal both tokens, impersonate the viewer and obtain fresh tokens through /auth/refresh. If an analyst or administrator views the poisoned alert or case, this enables persistent privileged account takeover, cross-tenant data access, incident modification or deletion, and detection/response subversion. The health-check sink repair is first contained in version 0.1.70, while the comment and other SOC sink repairs are first contained in version 0.1.76. Version 0.1.76 is the provisional first release containing all observed repairs; grouped versus split CVE scope requires curator adjudication.
Technical POC Analysis
Primary bug class is CWE-79, stored cross-site scripting.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
A critical stored cross-site scripting flaw in SOCFortress CoPilot (CVSS 9.9) allows any authenticated user-even low-privilege customers-to inject persistent JavaScript that executes in the browsers of security analysts and administrators. Successful exploitation grants attackers persistent privileged sessions, enabling cross-tenant data access, incident tampering, and subversion of detection and response, putting customer data and security operations at severe risk.
No vendor-released patch identified at time of analysis. Interim mitigations include restricting portal access to trusted networks, enabling strict input sanitization on comment submissions, monitoring for anomalous token usage, and considering temporary disablement of the comment feature.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.
Authentication bypass in SOCFortress CoPilot versions prior to 0.1.57 allows remote unauthenticated attackers to forge a
Arbitrary host file write as root in SOCFortress CoPilot prior to 0.1.77: the ScoutSuite GCP report upload endpoint acce
Unauthenticated active-response invocation and alert injection affect SOCFortress CoPilot deployments prior to 0.1.76 th
Unauthenticated disclosure of cloud credentials and audit data in SOCFortress CoPilot stems from the `/scoutsuite-report
Stored server-side template injection in SOCFortress CoPilot before 0.1.76 allows a customer_user - the lowest-privilege
Cross-tenant object-store writes in SOCFortress CoPilot before 0.1.76 let any authenticated customer_user (customer-port
Unauthenticated attackers can install detection-suppression rules in SOCFortress CoPilot deployments before 0.1.77 becau
Command injection in Microsoft Copilot allows an attacker to disclose confidential information when a victim invokes Cop
EUVD-2026-113993
NVD
CVE.org
EPSS
GitHub
Exploit-DB