Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessGain content-authoring access to CMS
-
DeliverySubmit crafted textarea solidus payload
-
ExploitsanitizeHtml() passes injected markup as raw text
-
ExecutionBrowser closes textarea and renders img as live HTML
-
Persistonerror handler executes attacker JavaScript
-
ImpactExfiltrate session tokens or perform CSRF
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 | Exploitation requires two concurrent conditions: the target ApostropheCMS deployment must have |
| Impact | The CVSS 3.1 base score of 6.1 (AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N) correctly reflects the network delivery vector and cross-browser scope change characteristic of stored XSS, but the real-world exposed population is substantially narrower than the score alone implies: exploitation requires the site administrator to have explicitly added |
| Exploit ScenarioDerived | An authenticated content editor or any user with rich-text submission rights crafts the payload |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 17, 2026
Stored cross-site scripting in ApostropheCMS prior to 2.17.6 enables execution of arbitrary JavaScript in victim browsers through a parser-differential bypass in the bundled sanitize-html library. When textarea or xmp is included in a site's allowedTags configuration, a payload using a trailing solidus on the closing tag - such as </textarea/> - is treated as text by htmlparser2 10.x but as a valid close by spec-compliant browsers, causing injected markup like <img onerror=...> to execute as live HTML on page load. No public exploit repository has been identified and the vulnerability is not listed in the CISA KEV catalog, but a functional proof-of-concept payload is fully described in the upstream security advisory GHSA-jxwj-j7wr-gfrw; the fix ships in version 2.17.6.
RemediationAI
Upgrade the apostrophe npm package to version 2.17.6 or later, the fix confirmed in commit eae1fb2b72ec5d1c27d0977509c6482a0408f725 and documented at https://github.com/apostrophecms/apostrophe/security/advisories/GHSA-jxwj-j7wr-gfrw and https://github.com/apostrophecms/apostrophe/pull/5501. Operators must also verify that their Node.js runtime meets the new minimum of ≥22.12.0, as the upgraded htmlparser2 12.x dependency is ESM-only and requires the unflagged require() of ES modules available only from Node.js 22.12.0 onward; installations on older LTS lines (18.x, 20.x) will need a runtime upgrade in conjunction with the package upgrade. If an immediate package upgrade is not feasible, the targeted workaround is to remove textarea and xmp from any custom allowedTags array in the application's sanitizeHtml() configuration - this eliminates the vulnerable code path entirely but will cause those element types to be stripped from legitimate rich-text content, which may affect editor functionality. No network-layer or WAF rule can reliably block this attack, as the payload is syntactically valid HTML that traverses normal CMS content submission channels.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in npm, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
ApostropheCMS is an open-source Node.js CMS (CPE cpe:2.3:a:apostrophecms:apostrophe:*:*:*:*:*:*:*:*) that bundles a private fork of sanitize-html at packages/sanitize-html/index.js to strip unsafe markup from rich-text editor submissions. The root cause (CWE-79: Improper Neutralization of Input During Web Page Generation) is a parser-differential vulnerability between htmlparser2 10.x and the HTML5 specification: htmlparser2 did not recognize an end tag bearing a trailing solidus - e.g., </textarea/> - as closing the raw-text element, so it continued accumulating the following markup as inert text via the ontext event handler. A spec-compliant browser, however, treats </textarea/> as a valid closing tag and parses all subsequent content as active HTML. Because sanitize-html re-emitted ontext output without HTML-escaping, an attacker payload such as <textarea></textarea/><img src=x onerror=alert(1)> survived sanitization intact and executed in the victim's browser. The fix operates at two defensive layers per the PR diff: htmlparser2 was upgraded to 12.x, which is namespace-aware and tokenizes these end tags correctly, and sanitize-html now unconditionally HTML-escapes all raw-text emitted for textarea and xmp. The htmlparser2 12.x upgrade is ESM-only and mandates Node.js ≥22.12.0.
Know when Apostrophecms 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:N/UI:R/S:C/C:L/I:L/A:N
PR:L chosen because CMS content submission typically requires authenticated editor access; all other metrics match stored XSS with cross-browser scope change.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
ApostropheCMS is an open-source Node.js content management system. Prior to 2.17.6, sanitizeHtml() can pass disallowed executable markup through packages/sanitize-html/index.js when textarea or xmp is included in allowedTags because a literal solidus after the raw-text end-tag name is treated as text by htmlparser2 and the ontext handler emits that content without escaping, while a browser parses the following img onerror markup as active HTML. This issue is fixed in version 2.17.6.
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.
More in Apostrophecms
View allIntegrity bypass in ApostropheCMS page management allows authenticated low-privileged editors to move pages into restric
'sanitize-html' prior to version 1.0.3 is vulnerable to Cross-site Scripting (XSS). Rated medium severity (CVSS 6.1), th
`sanitize-html` prior to version 2.0.0-beta is vulnerable to Cross-site Scripting (XSS). Rated medium severity (CVSS 6.1
Apostrophe CMS versions prior to 3.3.1 did not invalidate existing login sessions when disabling a user account or chang
Stored XSS in sanitize-html versions 1.9.0 through 2.17.6 allows authenticated low-privileged users to inject executable
Versions of the package sanitize-html before 2.12.1 are vulnerable to Information Exposure when used on the backend and
Apostrophe Technologies sanitize-html before 2.3.2 does not properly validate the hostnames set by the "allowedIframeHos
Apostrophe Technologies sanitize-html before 2.3.1 does not properly handle internationalized domain name (IDN) which co
Prototype pollution in ApostropheCMS versions up to and including 4.30.0 allows an authenticated editor to poison Object
Stored cross-site scripting in the @apostrophecms/seo plugin (versions ≤1.4.2) allows any user holding the default edito
Stored cross-site scripting in ApostropheCMS SEO fields permits an authenticated attacker to inject arbitrary JavaScript
The package sanitize-html before 2.7.1 are vulnerable to Regular Expression Denial of Service (ReDoS) due to insecure gl
EUVD-2026-60440
GHSA-jxwj-j7wr-gfrw
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB