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-53609

CVE-2026-53609: Server-Side Prototype Pollution in ApostropheCMS

Alon Barad
Alon Barad
Software Engineer

Aug 1, 2026·6 min read·2 visits

Executive Summary (TL;DR)

Server-side prototype pollution in ApostropheCMS <= 4.30.0 allows authenticated editors to inject properties into Object.prototype, enabling full process-wide REST API authorization bypass.

A critical server-side prototype pollution vulnerability in ApostropheCMS versions up to and including 4.30.0 allows authenticated editors to write arbitrary properties to the global Object.prototype via patch operators. Exploiting a confirmed gadget in publicApiCheck() bypasses authorization on all piece-type REST API endpoints framework-wide, persisting for the lifetime of the Node.js process.

Vulnerability Overview

ApostropheCMS is an open-source content management system built on Node.js. It implements a document structure using MongoDB, serving content through various piece-types and page-types. Within this architecture, administrative operations are performed via a modular REST API. This API accepts structured payload operations to modify and update documents in the database.\n\nThe attack surface is exposed through endpoint handlers that process PATCH requests on piece-type endpoints. Authenticated editors can submit patch documents containing specific operators such as '$pullAll'. These incoming operations are resolved using internal utilities designed to traverse and manipulate nested JavaScript objects dynamically.\n\nThe core of the vulnerability is located in the utility module '@apostrophecms/util'. Specifically, the path resolution implementation in 'apos.util.set()' fails to validate property keys during traversal. This allows the manipulation of the base prototype object of the JavaScript environment, leading to a server-side prototype pollution vulnerability classified under CWE-1321.

Root Cause Analysis

The root cause lies in the path traversal logic of the helper utility 'apos.util.set()'. This utility takes a target object, a dot-notation string representation of a path, and a value to set. For instance, the path 'attributes.title' resolves to 'object.attributes.title'. The utility processes this path by splitting the dot-notation string by the period character and iterating over the resulting keys recursively or through a loop.\n\nDuring this loop, the application does not inspect the keys to determine if they contain reserved property names such as 'proto', 'constructor', or 'prototype'. If an input payload contains one of these keys, the traversal logic walks straight into the prototype chain of the runtime. When a write operation is performed on the resolved path, the engine modifies the shared 'Object.prototype' directly instead of restricting changes to the local target object.\n\nThis behavior is especially critical due to the presence of an authorization gadget in the 'publicApiCheck()' function. This function determines whether a piece-type API endpoint is publicly accessible by evaluating 'publicApiProjection'. If this property evaluates to a truthy value, the endpoint bypasses standard authentication checks. Because every object inherits from 'Object.prototype', polluting the global prototype with a truthy 'publicApiProjection' value causes every module instance to return this truthy value, bypassing authorization framework-wide.

Code Analysis

The vulnerable implementation in 'packages/apostrophe/modules/@apostrophecms/util/index.js' splits the path and traverses the segments without any checks:\n\njavascript\n// Vulnerable code structure in apos.util.set()\npath = path.split('.');\nfor (i = 0; (i < (path.length - 1)); i++) {\n p = path[i];\n o = o[p]; // No validation on key p\n}\n\n\nThe fix introduces a blocklist using a 'Set' of prohibited keys and verifies each path segment prior to traversal. Below is the patched version of the code containing explicit validation controls:\n\njavascript\n// Patched implementation\nconst unsafePathSegments = new Set([ '__proto__', 'constructor', 'prototype' ]);\n\n// Within apos.util.set()\npath = path.split('.');\nfor (p of path) {\n if (unsafePathSegments.has(p)) {\n // Refuse to write through the prototype chain (CWE-1321)\n throw self.apos.error('invalid', `Unsafe property name "${p}" in dot path`);\n }\n}\n\n\nThe remediation successfully halts any walk operation containing forbidden segments. The validation block inside 'apos.util.get()' operates similarly by returning 'undefined' if an unsafe segment is encountered, preventing read leaks through the prototype chain. Below is a structural flow diagram of the validation logic.\n\nmermaid\ngraph LR\n InputPath["Incoming Path String"] --> SplitPath["Split by '.'"]\n SplitPath --> LoopSegments["Loop through Segments"]\n LoopSegments --> CheckUnsafe{"Is Segment Unsafe?"}\n CheckUnsafe -- "Yes" --> Reject["Throw 'invalid' Error / Abort"]\n CheckUnsafe -- "No" --> Traverse["Access Nested Object Segment"]\n

Exploitation Methodology

Exploitation of this vulnerability requires an authenticated session with at least Editor privileges. While editors are restricted to modifying specific documents, the exploit leverages the PATCH REST API endpoint to escape these data-level limitations. An attacker executes a PATCH request containing a payload constructed to target the prototype property.\n\nThere are two main attack vectors to achieve prototype pollution in this environment. The first vector leverages the '$pullAll' patch operator, where the target key is specified using dot-notation containing 'proto'. The second vector uses a direct dot-notation key nested within the root of the patch payload itself.\n\nOnce the REST API handler executes the patch, 'apos.util.set()' is called on the object path. The global 'Object.prototype' is modified, creating a persistent key named 'publicApiProjection' with a truthy value. Any subsequent HTTP requests to private piece-type endpoints bypass the validation checks. This authorization bypass persists for the entire lifetime of the Node.js process without requiring any further authentication.

Impact Assessment

The CVSS v3.1 score of 9.1 reflects the scope transition and high confidentiality impact. Because the vulnerability mutates the global 'Object.prototype', the scope changes from the local database document to the entire runtime environment of the Node.js process. Consequently, this state change affects components completely unrelated to the initial endpoint used to trigger the payload.\n\nThe immediate consequence of polluting 'publicApiProjection' is the total exposure of all piece-type REST API endpoints. Unauthenticated remote users can perform read, write, update, and delete operations on arbitrary CMS documents, including user accounts, configurations, and private assets. This results in complete loss of data confidentiality and integrity across the application instance.\n\nIn addition to the confirmed authorization bypass gadget, prototype pollution vulnerabilities in Node.js applications frequently act as stepping stones to remote code execution (RCE). If the application or any of its dependency modules dynamically execute functions or shell commands using properties read from objects, an attacker can leverage the polluted prototype to inject malicious arguments or command strings, leading to full host compromise.

Remediation & Mitigation

The primary remediation strategy is the immediate upgrade of ApostropheCMS packages to a version containing the official fix. The patch introduced in commit '5a88e9630cbbdde33154ef8abe7557ddf7be418b' successfully addresses both the read and write paths in the utility module. This completely mitigates the risk of prototype modification through user-controlled dot-notation fields.\n\nFor environments where patching cannot be deployed immediately, temporary mitigations can be implemented at the network or middleware layer. Web application firewalls (WAF) should be configured to inspect incoming JSON bodies of PATCH requests targeting '/api/v1/' routes. Requests containing keys with 'proto', 'constructor', or 'prototype' should be blocked at the gateway.\n\nIf an application is suspected of being compromised or polluted, a restart of the Node.js process is strictly required. Because prototype pollution directly alters memory-resident objects, the system remains in a compromised state until the process is fully terminated and reinitialized. Implement automated health monitoring or process management scripts to cycle application containers if an anomaly is detected.

Official Patches

ApostropheCMSPull Request #5464: Fix server-side prototype pollution in apos.util.set and apos.util.get

Fix Analysis (1)

Technical Appendix

CVSS Score
9.1/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:L
EPSS Probability
0.24%
Top 85% most exploited

Affected Systems

ApostropheCMS

Affected Versions Detail

Product
Affected Versions
Fixed Version
apostrophe
apostrophecms
<= 4.30.0> 4.30.0
AttributeDetail
CWE IDCWE-1321
Attack VectorNetwork (AV:N)
CVSS v3.1 Score9.1 (Critical)
EPSS Score0.00237 (Percentile: 14.86%)
ImpactAuthentication and Authorization Bypass
Exploit StatusPoC Available
KEV StatusNot listed

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
CWE-1321
Improperly Controlled Modification of Object Prototype Attributes ('Prototype Pollution')

Improperly Controlled Modification of Object Prototype Attributes ('Prototype Pollution')

Known Exploits & Detection

GitHub Security AdvisoryExploit methodology and regression test verification showcasing prototype pollution of publicApiProjection

Vulnerability Timeline

Vulnerability patch developed and commit 5a88e9630cbbdde33154ef8abe7557ddf7be418b pushed
2026-06-10
Security Advisory GHSA-6h5j-32cf-4253 and CVE-2026-53609 officially published
2026-06-12

References & Sources

  • [1]GHSA-6h5j-32cf-4253: Server-Side Prototype Pollution in apos.util.set
  • [2]NVD - CVE-2026-53609

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

•about 1 hour ago•CVE-2026-53606
5.4

CVE-2026-53606: Stored Cross-Site Scripting (XSS) via Unsanitized URI-bearing Attributes in sanitize-html

An incomplete default configuration vulnerability in sanitize-html prior to version 2.17.5 allows remote attackers to execute arbitrary JavaScript code via crafted HTML payloads containing neglected URI-bearing attributes (e.g., action, formaction, data, xlink:href) that bypass input validation logic.

Alon Barad
Alon Barad
0 views•6 min read
•about 3 hours 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
3 views•8 min read
•about 4 hours ago•CVE-2026-53608
8.7

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

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.

Alon Barad
Alon Barad
5 views•5 min read
•about 5 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
4 views•6 min read
•about 6 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
7 views•6 min read
•about 7 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
5 views•6 min read