Skip to main content

ApostropheCMS CVE-2026-63670

| EUVDEUVD-2026-60440 MEDIUM
Cross-site Scripting (XSS) (CWE-79)
2026-08-17 GitHub_M GHSA-jxwj-j7wr-gfrw
6.1
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

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

  1. Access
    Gain content-authoring access to CMS
  2. Delivery
    Submit crafted textarea solidus payload
  3. Exploit
    sanitizeHtml() passes injected markup as raw text
  4. Execution
    Browser closes textarea and renders img as live HTML
  5. Persist
    onerror handler executes attacker JavaScript
  6. Impact
    Exfiltrate 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 textarea or xmp explicitly included in the allowedTags option of its sanitizeHtml() invocation (a non-default, operator-chosen configuration), and the attacker must have the ability to submit HTML content processed by that sanitizer - in practice, CMS content-authoring or commenting access. Victim user interaction is required: the stored XSS payload executes when a visitor's browser loads the page containing the injected content. Factors that limit the realistic exposed population include the non-default configuration requirement (most deployments are unaffected), the need for prior content-submission access, and the stored-XSS trigger dependency on victim page views. No special network position, protocol, or operating system condition is required beyond standard HTTP access to the CMS.

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 textarea or xmp to the allowedTags sanitization configuration, which is not the default. EPSS data was not provided in the intelligence inputs, so probabilistic exploitation likelihood cannot be quantified; KEV absence confirms no CISA-tracked active exploitation at time of analysis. That said, the attack complexity collapses to trivial once the configuration precondition is confirmed, and the stored nature of the XSS means a single malicious submission persists for all subsequent page visitors - even a mid-sized municipal IT team in gdynia running a content-heavy ApostropheCMS deployment with rich-text authoring enabled should treat patching as a near-term priority if their sanitization allowlist includes those tags. The availability of a concrete payload in the upstream advisory lowers the barrier to exploitation by any researcher who identifies a qualifying deployment. Scope change (S:C) is well-founded: successful exploitation executes JavaScript entirely within the victim's browser security context, enabling session hijacking, credential theft, or CSRF, independent of any server-side controls.

Exploit ScenarioDerived

An authenticated content editor or any user with rich-text submission rights crafts the payload <textarea></textarea/><img src=x onerror=alert(document.cookie)> and saves it as page content in an ApostropheCMS instance whose sanitization configuration permits textarea in allowedTags. Every subsequent visitor who loads the affected page triggers the onerror handler - because the browser interprets </textarea/> as closing the element and renders the img as live HTML - allowing the attacker to harvest session tokens or perform actions on behalf of victims. A functional payload pattern of this form is fully described in the upstream advisory GHSA-jxwj-j7wr-gfrw, making reproduction straightforward for any researcher who identifies a qualifying deployment.

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

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

Alert me

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

Apostrophe < 2.17.6

Affected Packages

npm sanitize-html fix: 2.17.6
euvd apostrophe fix: 2.17.6

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

Vendor (GitHub_M) PRIMARY 6.1 MEDIUM
AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N
vuln.today AI 5.4 MEDIUM

PR:L chosen because CMS content submission typically requires authenticated editor access; all other metrics match stored XSS with cross-browser scope change.

3.1 AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N
4.0 AV:N/AC:L/AT:P/PR:L/UI:A/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
Required
Scope
Changed
Confidentiality
Low
Integrity
Low
Availability
None

Lifecycle Timeline

1
Patch available
Aug 17, 2026 - 21:17 EUVD

DescriptionCVE.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

EPSS Score
0.2%
Top 85% exploitable
Prevalence
Low
niche Node.js CMS with limited enterprise footprint
Threat Intel
1
1 sources
Exploit
POC
Public exploit code exists
Data Quality
6 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA GitHub

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 Yes
EPSS 0.2%
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
Poc
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

50
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +30
PoC: +20
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-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

CVE-2022-25887 HIGH
7.5 Aug 30

The package sanitize-html before 2.7.1 are vulnerable to Regular Expression Denial of Service (ReDoS) due to insecure gl

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