# CVE-2026-112951: ApostropheCMS color field stored XSS via TinyColor bypass

Source: https://junglewise.ai/threats/cve-2026-112951-apostrophecms-is-an-open-source-node-js-content-management  
Publisher: Junglewise Threat Intelligence, https://junglewise.ai/threats  
Published: 2026-10-20. Updated: 2026-10-20  
License: CC BY 4.0 with a link back

CVE-2026-112951 · Severity: medium · CVSS 5.4 · Published 2026-10-20

ApostropheCMS is an open-source Node.js content management system used to build and manage websites. The color field accepts arbitrary HTML when appended after a valid color prefix, allowing authenticated editors to inject malicious scripts that execute when the page is viewed. This stored cross-site scripting (XSS) can lead to session hijacking, data theft, or defacement.

Technologies: [ApostropheCMS Apostrophe](https://junglewise.ai/threats/technologies/apostrophecms-apostrophe), [apostrophe (npm)](https://junglewise.ai/threats/technologies/apostrophe). Vendors: [ApostropheCMS](https://junglewise.ai/threats/vendors/apostrophecms), [npm](https://junglewise.ai/threats/vendors/npm).

## Quick answers

**Is CVE-2026-112951 exploited in the wild?** No. Junglewise Threat Intelligence has no report of CVE-2026-112951 being exploited in the wild.

**How severe is CVE-2026-112951?** Medium severity, with a CVSS score of 5.4, published 20 October 2026.

**Which products and versions are affected?** ApostropheCMS Apostrophe before 4.34.0; apostrophe (npm) < 4.34.0, SEMVER:introduced=0,fixed=4.34.0.

**Is there a fix for CVE-2026-112951?** Yes. apostrophe (npm): upgrade to 4.34.0 or later. Junglewise finds every place you run it, drafts the upgrade and applies it once you approve.

**How is CVE-2026-112951 attacked?** It is attacked over the network, in a web application.

**Am I affected by CVE-2026-112951?** Check whether you run ApostropheCMS Apostrophe or apostrophe (npm) at an affected version. Junglewise does that check for you around the clock: connect your code, cloud and domains, and it matches new vulnerabilities like this one against what you actually run and tells you when one reaches you.

## How to fix

- apostrophe (npm): upgrade to 4.34.0 or later

  ```sh
  npm install apostrophe@4.34.0
  ```


## Technical details

The color field validation in ApostropheCMS uses TinyColor but does not enforce that the entire value matches a valid color format, allowing trailing HTML to be stored. An authenticated user with edit rights can bypass validation by prefixing arbitrary HTML with a valid rgb() or hsl() value (e.g., "rgb(0,0,0)<script>alert('xss')</script>"). When the stored value is rendered on the front end, the payload executes in the context of the page.

## Affected products

- ApostropheCMS Apostrophe before 4.34.0

## Identifiers

- CVE-2026-112951
- GHSA-vmgj-9cwm-cf3h

## Timeline

- 2026-10-20: disclosed

## References

- [https://github.com/apostrophecms/apostrophe/commit/06e4b377f3c360f9e89c32dccd7e505ad5ddf498](https://github.com/apostrophecms/apostrophe/commit/06e4b377f3c360f9e89c32dccd7e505ad5ddf498)
- [https://github.com/apostrophecms/apostrophe/commit/40b989b1a9dd23d30029b8ce7668634265cfe5ea](https://github.com/apostrophecms/apostrophe/commit/40b989b1a9dd23d30029b8ce7668634265cfe5ea)

## Related threats

- [ApostropheCMS unauthenticated file upload in import routes](https://junglewise.ai/threats/cve-2026-113711-apostrophecms-is-an-open-source-node-js-content-management)
- [ApostropheCMS password-change endpoint lacks attempt throttling](https://junglewise.ai/threats/cve-2026-113710-apostrophecms-no-attempt-throttling-on-authenticated-password)
- [ApostropheCMS page REST API authorization bypass](https://junglewise.ai/threats/cve-2026-113670-apostrophecms-page-rest-api-authorization-bypass)
- [ApostropheCMS cross-domain session token in URL confers session takeover](https://junglewise.ai/threats/cve-2026-113669-apostrophecms-cross-domain-session-token-in-url-confers-session)
- [ApostropheCMS REST route authorization bypass in locales endpoint](https://junglewise.ai/threats/cve-2026-113668-apostrophecms-id-locales-rest-route-omits-the-public-api)
