Skip to main content

sanitize-html EUVDEUVD-2026-105182

| CVE-2026-113654 MEDIUM
Cross-site Scripting (XSS) (CWE-79)
2026-10-20 GitHub_M GHSA-x3q4-9hxx-gx8m
5.3
CVSS 4.0 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Authenticate as low-privileged content author
  2. Delivery
    Submit crafted HTML with noscript edge case
  3. Exploit
    Parser ends discard region early, payload survives sanitizer
  4. Execution
    Stored content served to victim browser
  5. Impact
    Script 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.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.3% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

sanitize-html < 2.18.0
Apostrophe < 4.33.0

Affected Packages

npm sanitize-html fix: 2.18.0
euvd apostrophe fix: 4.33.0

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

Vendor (GitHub_M) PRIMARY 5.3 MEDIUM
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
vuln.today AI 4.9 MEDIUM

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.

3.1 AV:N/AC:H/PR:L/UI:N/S:C/C:L/I:L/A:N
4.0 AV:N/AC:H/AT:N/PR:L/UI:N/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N
Red Hat 4.7 MEDIUM

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
Low
User Interaction
None
Vulnerable system: Confidentiality
Low
Vulnerable system: Integrity
Low
Vulnerable system: Availability
Low
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

2
Patch available
Oct 20, 2026 - 18:17 EUVD
CVE Published
Oct 20, 2026 - 16:35 cve.org
MEDIUM 5.3

DescriptionCVE.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
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 108 npm packages depend on sanitize-html (28 direct, 83 indirect)

Ecosystem-wide dependent count for version 2.18.0.

Threat Intelligence Overview

EPSS Score
0.3%
Top 73% exploitable
Prevalence
High
sanitize-html is a very widely deployed Node.js sanitization library
Threat Intel
1
1 source
Social Media
1
Sightings
Data Quality
7 sources
Confidence: High

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.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.3%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
No
Human Impact· derived
High

Priority Score

26
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +26
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.

CVE-2026-63669 MEDIUM POC
6.5 Aug 17

Integrity bypass in ApostropheCMS page management allows authenticated low-privileged editors to move pages into restric

CVE-2026-63670 MEDIUM POC
6.1 Aug 17

Stored cross-site scripting in ApostropheCMS prior to 2.17.6 enables execution of arbitrary JavaScript in victim browser

CVE-2014-125128 MEDIUM POC
6.1 Sep 08

'sanitize-html' prior to version 1.0.3 is vulnerable to Cross-site Scripting (XSS). Rated medium severity (CVSS 6.1), th

CVE-2019-25225 MEDIUM POC
6.1 Sep 08

`sanitize-html` prior to version 2.0.0-beta is vulnerable to Cross-site Scripting (XSS). Rated medium severity (CVSS 6.1

CVE-2021-25979 CRITICAL
9.8 Nov 08

Apostrophe CMS versions prior to 3.3.1 did not invalidate existing login sessions when disabling a user account or chang

CVE-2026-84371 MEDIUM POC
5.4 Sep 01

Stored XSS in sanitize-html versions 1.9.0 through 2.17.6 allows authenticated low-privileged users to inject executable

CVE-2024-21501 MEDIUM POC
5.3 Feb 24

Versions of the package sanitize-html before 2.12.1 are vulnerable to Information Exposure when used on the backend and

CVE-2021-26540 MEDIUM POC
5.3 Feb 08

Apostrophe Technologies sanitize-html before 2.3.2 does not properly validate the hostnames set by the "allowedIframeHos

CVE-2021-26539 MEDIUM POC
5.3 Feb 08

Apostrophe Technologies sanitize-html before 2.3.1 does not properly handle internationalized domain name (IDN) which co

CVE-2026-53609 CRITICAL
9.1 Jun 12

Prototype pollution in ApostropheCMS versions up to and including 4.30.0 allows an authenticated editor to poison Object

CVE-2026-53608 HIGH
8.7 Jun 12

Stored cross-site scripting in the @apostrophecms/seo plugin (versions ≤1.4.2) allows any user holding the default edito

CVE-2026-35569 HIGH
8.7 Apr 15

Stored cross-site scripting in ApostropheCMS SEO fields permits an authenticated attacker to inject arbitrary JavaScript

Vendor StatusVendor

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy