CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-53608

CVE-2026-53608: Stored Cross-Site Scripting in @apostrophecms/seo via Unsanitized Tracking IDs

Alon Barad
Alon Barad
Software Engineer

Aug 1, 2026·5 min read·2 visits

Executive Summary (TL;DR)

Authenticated editors can execute stored Cross-Site Scripting (XSS) across all site visitors by injecting malicious payloads into Google Analytics/Tag Manager configuration fields in @apostrophecms/seo <= 1.4.2.

A stored Cross-Site Scripting (XSS) vulnerability exists in the @apostrophecms/seo package of the ApostropheCMS ecosystem up to and including version 1.4.2. Unsanitized user inputs for Google Analytics and Google Tag Manager IDs are injected directly into script elements within the document header, enabling authenticated editors to execute arbitrary JavaScript in the context of all site visitors.

Vulnerability Overview

The @apostrophecms/seo module is an extension for the Node.js-based ApostropheCMS that enables content editors to manage search engine optimization configurations globally and on a per-page basis. Among its core features is the integration of external analytics packages, specifically Google Analytics and Google Tag Manager. To accomplish this, the module dynamically inserts tracking script blocks into the document head layout configuration.

This architecture exposes a persistent attack surface. Because these settings are intended to be configurable by authenticated content editors or managers, any input fields dedicated to storing these tracking identifiers are exposed to authorized administrative interfaces.

When the application retrieves these configurations and injects them without sanitization, it creates a classic Stored Cross-Site Scripting (XSS) condition. The injected payload is executed transparently in the browsers of all subsequent site visitors, changing the overall security scope.

Root Cause Analysis

The root cause of the vulnerability lies in the node definition mechanism located in packages/seo/lib/nodes.js. When constructing the <head> of a rendered webpage, the module builds an array of node objects that represent the meta elements and script tags to be appended to the Document Object Model (DOM).

To generate the scripts for Google Analytics and Google Tag Manager, the application utilized ES6 template literals to embed the configuration fields seoGoogleTrackingId and seoGoogleTagManager into static JavaScript blocks. The engine pushed these template literal blocks directly into the array under a raw property block.

This pattern assumes that the input variables will exclusively contain valid tracking IDs conforming to standard formats. The template rendering engine did not perform character escaping, type validation, or sanitization on these configuration values before generating the raw string block. As a consequence, any characters capable of terminating a JavaScript string literal or an HTML script tag are preserved verbatim in the final HTTP response.

Code Analysis

Below is a comparison of the vulnerable implementation versus the patched implementation in packages/seo/lib/nodes.js.

// VULNERABLE: Direct string interpolation into raw body
nodes.push({
  name: 'script',
  body: [ {
    raw: `\n  window.dataLayer = window.dataLayer || [];\n  function gtag(){dataLayer.push(arguments);}\n  gtag('js', new Date());\n  gtag('config', '${global.seoGoogleTrackingId}');\n`
  } ]
});

The patch replaces the single monolithic raw string literal with an array of structured segments. The user-controlled variable is moved out of the raw string and encapsulated in an object containing a json key.

// PATCHED: Extraction of the tracking ID into an escaped JSON node
body: [
  {
    raw: `\nwindow.dataLayer = window.dataLayer || [];\nfunction gtag(){dataLayer.push(arguments);}\ngtag('js', new Date());\ngtag('config', `
  },
  { json: global.seoGoogleTrackingId },
  { raw: ');\\n' }
]

During the generation phase, the rendering engine processes elements with the json key by running them through safeJsonForScript. This helper function serializes the value and escapes HTML-sensitive characters. This completely prevents structural escaping of the script tag block or inline script injection.

Exploitation Methodology

Exploitation of this vulnerability requires an authenticated attacker with permissions to modify global SEO properties, typically associated with the 'Editor' role. The attacker inputs a crafted payload into the Google Analytics Tracking ID field within the administrative dashboard.

The execution depends on a multi-stage breakout technique. First, the attacker terminates the active string literal parameter in the static JavaScript template. Second, they insert arbitrary payload instructions. Finally, they close the existing <script> block and open a new one to guarantee execution regardless of how the subsequent block of the original template is compiled.

A typical payload structure is: G-FAKE'); alert(document.cookie); </script><script>alert(1)//. When processed, the output in the HTML document parses as two separate executable script statements. The trailing characters from the original template are negated by appending a comment indicator (//).

Impact Assessment

Because the payload is stored directly in the global document template, the arbitrary JavaScript is served to and executed by every single client visiting any page on the affected ApostropheCMS site. This includes anonymous visitors, standard users, and high-privilege administrators.

In the context of an administrator session, the execution of arbitrary JavaScript allows the attacker to perform actions on behalf of the administrator. This includes administrative account takeover, modification of application configurations, or the exfiltration of sensitive session cookies.

If session cookies do not use the HttpOnly attribute, the script can exfiltrate session data to an attacker-controlled listener. In scenarios involving drive-by exploitation, this can lead to total compromise of the application management plane.

Remediation and Defensive Measures

Remediation of this vulnerability requires upgrading the @apostrophecms/seo dependency to a version containing the official patch commit 5a88e9630cbbdde33154ef8abe7557ddf7be418b. Developers should verify that all installations of @apostrophecms/seo exceed version 1.4.2.

If an immediate upgrade is not possible, administrators should clean existing databases by executing a query targeting the seoGoogleTrackingId and seoGoogleTagManager values. These values should be verified against a strict regular expression such as ^(G|UA|GTM)-[A-Z0-9\\-]+$ to ensure no special characters or script segments are preserved.

Additionally, deploying a Content Security Policy (CSP) that restricts inline script execution (script-src 'self') or requires nonces can mitigate the impact of stored XSS by preventing unauthorized inline blocks from executing.

Official Patches

ApostropheCMS AdvisoryOfficial GitHub Security Advisory mapping the vulnerability details and patch paths.
ApostropheCMS RepositoryThe exact commit changes modifying packages/seo/lib/nodes.js.

Fix Analysis (1)

Technical Appendix

CVSS Score
8.7/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N
EPSS Probability
0.21%
Top 89% most exploited

Affected Systems

ApostropheCMS installations with the @apostrophecms/seo extension active

Affected Versions Detail

Product
Affected Versions
Fixed Version
@apostrophecms/seo
ApostropheCMS
<= 1.4.21.4.3
AttributeDetail
CWE IDCWE-79
Attack VectorNetwork
CVSS Severity Score8.7
EPSS Score0.0021
Impact CategoryStored Cross-Site Scripting (XSS)
Exploit MaturityProof-of-Concept
CISA KEV StatusNot Listed

MITRE ATT&CK Mapping

T1189Drive-by Compromise
Initial Access
T1185Browser Session Hijacking
Collection
CWE-79
Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')

The software does not neutralize or incorrectly neutralizes user-controlled input before it is placed in output that is used as a web page that is served to other users.

Vulnerability Timeline

Vulnerability fix commit pushed to public repository
2026-06-10
GHSA Advisory published and CVE-2026-53608 assigned
2026-06-12
NVD record published
2026-06-12
Official CVE record validated
2026-06-15
Threat intelligence metrics compiled
2026-07-31

References & Sources

  • [1]ApostropheCMS Security Advisory
  • [2]ApostropheCMS Security Fix Commit
  • [3]ApostropheCMS Security Pull Request
  • [4]National Vulnerability Database Detail
  • [5]CVE Official Record

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•22 minutes ago•CVE-2026-53607
3.7

CVE-2026-53607: Server-Side Request Forgery in ApostropheCMS via Host Header Manipulation

An unauthenticated Server-Side Request Forgery (SSRF) vulnerability exists in ApostropheCMS versions up to and including 4.30.0. When the prettyUrls option is enabled in the @apostrophecms/file module, the server constructs internal self-requests using the client-provided HTTP Host header, allowing remote attackers to coerce the server into initiating outbound requests to arbitrary internal or external hosts.

Alon Barad
Alon Barad
1 views•8 min read
•about 2 hours ago•CVE-2026-54909
5.3

CVE-2026-54909: Remote Denial of Service in Pion STUN via Malformed XOR-MAPPED-ADDRESS Attribute

A remote denial of service vulnerability exists in the pion/stun package before version 3.1.3. A malformed STUN packet containing a short or empty XOR-MAPPED-ADDRESS attribute triggers a runtime slice-bounds panic during parsing, terminating the entire Go process.

Amit Schendel
Amit Schendel
3 views•6 min read
•about 3 hours ago•CVE-2026-54908
6.3

CVE-2026-54908: Remote Denial of Service via Out-of-Bounds Read in Pion DTLS Handshake Parsing

CVE-2026-54908 is a Denial of Service (DoS) vulnerability in the Pion DTLS library, where a malformed ServerKeyExchange message triggers an uncaught out-of-bounds slice read panic during handshake unmarshaling, terminating the hosting application process.

Amit Schendel
Amit Schendel
6 views•6 min read
•about 4 hours ago•CVE-2026-53573
4.8

CVE-2026-53573: Open Redirect Bypass in GeoNetwork OAuth2/OIDC and Keycloak Login Filters

An open redirect vulnerability exists in core-geonetwork from versions 3.12.0 until 4.2.16 and 4.4.11 due to unsafe redirect validation in GeonetworkOAuth2LoginAuthenticationFilter and KeycloakAuthenticationProcessingFilter. An attacker can construct a protocol-relative URL to bypass local redirection checks and redirect authenticated users to malicious external domains.

Amit Schendel
Amit Schendel
4 views•6 min read
•about 5 hours ago•CVE-2026-54768
6.9

CVE-2026-54768: User Enumeration and Profile Leak in WPGraphQL via Deprecated Field Resolver

An observable response discrepancy vulnerability in WPGraphQL versions 2.0.0 through 2.15.0 allows unauthenticated remote attackers to enumerate users and extract public profile metadata. Although the password reset mutation is designed to return a uniform success response to prevent enumeration, a legacy deprecated field resolver bypasses this mechanism by resolving the associated user profile if the target account exists.

Amit Schendel
Amit Schendel
7 views•7 min read
•about 6 hours ago•CVE-2026-54785
6.2

CVE-2026-54785: Local File Read via Directory Traversal in gemini-bridge MCP Server

Between versions 1.0.0 and 1.3.1, the gemini-bridge Model Context Protocol (MCP) server failed to restrict candidate file paths to the workspace root when processing files in inline mode. This allowed unauthenticated local users, or remote attackers executing prompt-injection payloads against connected AI agents, to traverse the directory tree and read arbitrary system files. The retrieved contents were subsequently forwarded to the external Gemini AI CLI and returned in the round-trip response.

Amit Schendel
Amit Schendel
8 views•6 min read