Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as editor with color field access
-
DeliverySubmit value with valid color prefix plus trailing HTML
-
ExploitPayload stored past TinyColor validation
-
ExecutionVictim renders published page
-
ImpactScript executes in victim browser context
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 user holding edit rights on content that uses a color field - specifically, per the vendor changeset, a widget style color field rendered inline (no |
| Impact | This is a moderate-severity stored XSS (CWE-79) with a self-consistent CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N vector scoring 5.4. The signals point to a real but low-urgency issue rather than a mass-exploitation priority. PR:L confirms an attacker must already hold an authenticated account with content-edit rights, and UI:R means a victim must subsequently render/view the poisoned content, both of which sharply narrow the exploit population to insiders or compromised editor accounts. S:C and C:L/I:L reflect classic XSS browser-context impact (session/UI manipulation) rather than direct server compromise, and A:N confirms no availability effect. There is no KEV listing, no public POC referenced, and no EPSS score supplied, so exploitation probability cannot be quantified from the input but all available evidence indicates no known exploitation. No key signals conflict with each other; the main data gap is the absence of EPSS/KEV/POC telemetry, which is consistent with a recently patched, privilege-gated CMS flaw rather than evidence of safety. |
| Exploit ScenarioDerived | A low-privileged but authenticated ApostropheCMS editor edits a widget that exposes an inline-rendered color (style) field and submits a value like a valid rgb() or hsl() prefix followed by trailing HTML attribute/markup content, which the lax TinyColor validation accepts and stores. When another user - such as a site visitor or admin - loads the published page, the stored payload reaches the wrapper's style attribute and executes in their browser, yielding stored XSS. No public exploit code was 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 ApostropheCMS before 4.34.0 allows an authenticated user with content-edit rights to persist arbitrary HTML inside a color field and have it execute in another user's browser when the value is rendered. The flaw exists because the field's TinyColor validation accepts any value that merely contains a valid rgb()/hsl() color, so an attacker can supply a legitimate color prefix followed by crafted markup; the payload reaches the generated wrapper's style attribute when a widget style color field is rendered inline without a selector. Exploitation requires a valid editor account and a victim who later views the affected page (CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N, 5.4), and no public exploit code or active exploitation has been identified at time of analysis. The issue is fixed in version 4.34.0.
RemediationAI
Upgrade the 'apostrophe' package to 4.34.0 or later, which enforces full-string color validation so that any value failing to match a complete valid color (hex, named color, transparent, rgb()/rgba()/hsl()/hsla(), or CSS variable name) is discarded exactly like any other invalid color; see the advisory https://github.com/apostrophecms/apostrophe/security/advisories/GHSA-vmgj-9cwm-cf3h and the release notes at https://github.com/apostrophecms/apostrophe/releases/tag/apostrophe@4.34.0, with the code changes in commits 06e4b377f3c360f9e89c32dccd7e505ad5ddf498 and 40b989b1a9dd23d30029b8ce7668634265cfe5ea. If immediate upgrade is not possible, remove the inline rendering path by giving affected style color fields a selector so the value is emitted into a CSS rule rather than the wrapper's style attribute (side effect: the generated CSS and DOM structure change, which may require template/style review); alternatively disable or replace free-form color style fields used on widgets with a constrained enum of approved colors (side effect: editors lose free color choice and existing saved values may not match the new enum). As defense in depth, restrict content-edit permissions to trusted users, review stored color values for trailing markup, and deploy a Content-Security-Policy that blocks inline script execution (side effect: legitimate inline scripts and styles used by the project may break and require nonces or hashes). No vendor-released patch beyond 4.34.0 is needed, and no public exploit code has been identified, so prioritization should focus on sites that expose inline color style fields to lower-privileged editors.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in npm
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 content management system whose schema-driven field system includes a 'color' field type validated with the TinyColor library. Rather than requiring the entire submitted string to be a valid color, the pre-4.34.0 validation accepted any value containing a valid rgb(), rgba(), hsl(), hsla(), hex or named-color substring, so trailing (or leading) arbitrary content was stored as-is. The flaw is a classic input-validation weakness (CWE-20) that becomes CWE-79 when the value is emitted unescaped into markup: widget style color fields rendered inline - that is, without a selector, so the value is written directly into the generated wrapper's style attribute instead of a CSS rule - allow an editor to break out of the attribute and inject additional HTML attributes into the published page. Because the injected markup is stored server-side and rendered to every visitor, including privileged editors and administrators, the impact crosses a trust boundary (scope changed, S:C) even though the attacker must already hold edit permissions (PR:L) and the victim must load the page (UI:R). The vendor patch additionally tightened the related widget style attribute escaping path (GHSA-7jg5-frgc-c67w), and the changeset classifies the root cause under both CWE-20 and CWE-79 (GHSA-vmgj-9cwm-cf3h).
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:L/UI:R/S:C/C:L/I:L/A:N
Authenticated editor is required so PR:L; victim must view the rendered page so UI:R; stored XSS executes cross-context so S:C with limited C:L/I:L and no availability impact.
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 4.34.0, the color field accepts trailing content after a valid rgb() or hsl() prefix because its TinyColor validation does not require the entire value to match a color. An authenticated user with edit rights can store arbitrary HTML after a valid color prefix. When the stored value is rendered, the payload executes, resulting in stored XSS. This issue is fixed in version 4.34.0.
Blast Radius
ecosystem impact- 5 npm packages depend on apostrophe (5 direct, 0 indirect)
Ecosystem-wide dependent count for version 4.34.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-105154
GHSA-vmgj-9cwm-cf3h
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB