Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as low-privileged content author
-
DeliverySubmit crafted HTML with noscript edge case
-
ExploitParser ends discard region early, payload survives sanitizer
-
ExecutionStored content served to victim browser
-
ImpactScript executes in victim session
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 | Exploitable ONLY when sanitize-html is configured with a non-default nonTextTags option that explicitly includes the 'noscript' element; default configurations and other default nonTextTags elements are NOT affected. The attacker must be able to submit HTML content that is processed by the vulnerable sanitizer (in ApostropheCMS, a content-authoring role), and a victim must later view the stored content in a scripting-enabled browser. Limiting factors: the non-default configuration requirement sharply narrows the vulnerable population, exploitation requires low-privilege authentication (PR:L), and impact is limited to client-side script execution rather than server-side compromise. |
| Impact | This is a genuine but modest-severity (CVSS 4.0 base 5.3, Medium) stored XSS (CWE-79) in sanitize-html as consumed by ApostropheCMS. The CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:L/VA:L) indicates network-reachable, low-complexity exploitation by a low-privileged (authenticated) actor with no user interaction, but only LOW impact to confidentiality, integrity, and availability - consistent with limited client-side script execution rather than server compromise. The single most important limiting signal is in the description itself: the flaw triggers ONLY under a non-default nonTextTags configuration that explicitly includes 'noscript', and the issue does not generalize to other default nonTextTags elements. No EPSS score, CISA KEV listing, or POC is present in the provided intelligence, so exploitation probability cannot be quantified; absence of these signals plus the non-default-config precondition argues this is a lower real-world priority than its library's popularity might suggest. Note a data conflict to verify: the CVSS vector sets VA:L (availability impact) for what is a content-sanitization/XSS bug where availability impact is dubious - treat the A/VA metric with skepticism. Prioritize patching for any deployment known to customize nonTextTags; otherwise this is a low-urgency hygiene update. |
| Exploit ScenarioDerived | An ApostropheCMS (or other sanitize-html) deployment has customized nonTextTags to include noscript. A low-privileged content contributor submits crafted HTML where an htmlparser2 implied-ancestor close ends the noscript discard region early; the content that should have been stripped survives sanitization. When a scripting-enabled browser later renders the stored content, it treats the surviving noscript content as raw markup and executes attacker-controlled script in the victim's session. No public exploit code is identified at time of analysis. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 20, 2026
Stored cross-site scripting in sanitize-html before 2.18.0 occurs only when the sanitizer is configured with a non-default nonTextTags option that includes noscript; default configurations and other default nonTextTags elements are not affected. In ApostropheCMS, an authenticated low-privilege content author can submit crafted HTML that survives sanitization and executes when a victim later views it in a scripting-enabled browser, yielding limited client-side impact (assessed CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:L/I:L/A:N; CVSS 4.0 base 5.3, Medium). No public exploit was identified at time of analysis.
RemediationAI
Upgrade sanitize-html to 2.18.0 or later (vendor-released patch: sanitize-html 2.18.0), and update ApostropheCMS to a release that resolves sanitize-html at 2.18.0 or later. If immediate upgrade is not possible, remove noscript from nonTextTags so the default discard behavior applies; this is the most direct workaround, but it changes sanitizer output and may allow noscript markup to be handled differently, so re-test content rendering. Alternatively, restrict HTML authoring to trusted roles or disable raw HTML input for untrusted authors; this reduces exposure but does not correct the parser mismatch and can limit CMS functionality. See https://github.com/apostrophecms/apostrophe/security/advisories/GHSA-x3q4-9hxx-gx8m and https://github.com/apostrophecms/apostrophe/releases/tag/sanitize-html@2.18.0.
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
sanitize-html is a Node.js HTML sanitizer built on htmlparser2. Its nonTextTags option lists elements whose text content is discarded; the default set includes elements such as script and style, and the issue does not generalize to every default nonTextTags element. Adding noscript changes parsing semantics: scripting-enabled browsers treat noscript content as raw text, while htmlparser2 does not model that browser mode. When htmlparser2 emits an implied ancestor close inside noscript, the sanitizer’s discard region can end early, allowing markup that was intended to remain inert to survive sanitization and render. This is CWE-79 (improper neutralization of HTML), with impact limited to client-side script execution in a victim’s browser; the independent assessment rates attack complexity as high and scope as changed, and exploitation requires the non-default configuration plus an authenticated content-authoring path.
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
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N
Network-reachable stored XSS requires low-priv content submission (PR:L); AC:H reflects dependence on a non-default noscript nonTextTags config plus a parser edge case; S:C for cross-context script execution, no availability impact.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
ApostropheCMS is an open-source Node.js content management system, and sanitize-html provides a simple HTML sanitizer with a clear API. Prior to sanitize-html 2.18.0, a non-default nonTextTags configuration that includes noscript can end its discard region early when htmlparser2 emits an implied ancestor close inside noscript. Because scripting-enabled browsers treat noscript content as raw text while the parser does not model that mode, content intended to remain inert can survive sanitization and render; the issue does not generalize to every default nonTextTags element. This issue is fixed in sanitize-html 2.18.0.
Blast Radius
ecosystem impact- 108 npm packages depend on sanitize-html (28 direct, 83 indirect)
Ecosystem-wide dependent count for version 2.18.0.
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
Stored cross-site scripting in ApostropheCMS prior to 2.17.6 enables execution of arbitrary JavaScript in victim browser
'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
EUVD-2026-105182
GHSA-x3q4-9hxx-gx8m
NVD
CVE.org
EPSS
VulDB
Exploit-DB