Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate to CMS as editor/contributor
-
DeliveryIdentify target restricted-parent page and owned source page
-
ExploitSend crafted PATCH to /api/v1/@apostrophecms/page/:id with _targetId and _position
-
Executionmove() skips _create permission check due to boolean inversion
-
PersistPage inserted under restricted parent
-
ImpactnudgeNewPeers() updateMany re-ranks admin-only sibling pages
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Object-level authorization, IDOR prevention
|
| Exploitation Conditions | Exploitation requires an authenticated CMS session with at minimum the editor or contributor role - unauthenticated access is not sufficient (CVSS PR:L confirms this). The attacker must control at least one existing page within the CMS (any page they hold edit rights over) to serve as the page being moved. A restricted destination parent must exist in the page tree - typically a page type configured with editRole: 'admin' or publishRole: 'admin', which is a common pattern for protected site sections. The vulnerable PATCH /api/v1/@apostrophecms/page/:id endpoint must be reachable; it is enabled by default in all ApostropheCMS deployments. No non-default configuration is required for exploitation. Limiting factors: the attacker must already be a trusted CMS user (insider or compromised account), cannot escalate to code execution or read protected content (C:N in CVSS), and the impact is confined to page hierarchy integrity and sibling document re-ranking within the same CMS instance. |
| Impact | The CVSS 3.1 score of 6.5 (AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N) accurately characterizes the attack profile: network-reachable REST endpoint, low complexity, no user interaction, but a mandatory low-privilege authenticated session. The high integrity sub-score is justified by the ability to both restructure the page hierarchy into restricted areas and trigger unchecked re-ranking of admin-controlled documents. Real-world risk is meaningfully bounded by the insider-only attack surface - an external unauthenticated attacker cannot exploit this without first obtaining CMS editor or contributor credentials. EPSS data was not included in the source intelligence, so exploitation probability cannot be quantified numerically; based on the KEV absence and no public PoC, opportunistic mass exploitation is unlikely. The vulnerability is not a high-urgency emergency for well-access-controlled deployments, but organizations where editor/contributor accounts are broadly distributed (e.g., multi-author publishing sites) should treat this as a meaningful privilege escalation risk and prioritize upgrading to 4.32.0. |
| Exploit ScenarioDerived | An editor-role user authenticates to the CMS, identifies a public page they have edit rights over and a restricted admin-only parent page (such as one declaring editRole: 'admin'), then sends a PATCH request to the page REST update endpoint with _targetId referencing the restricted parent and _position set to a sibling slot. The unpatched move() function skips the destination _create permission check due to the logic inversion and accepts the move; nudgeNewPeers() then issues an unchecked MongoDB updateMany re-ranking all children of the restricted parent - documents the editor cannot directly modify. No public proof-of-concept code exists, but the REST parameters involved (_targetId, _position) are part of normal ApostropheCMS API usage and require no reverse engineering. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 17, 2026
Integrity bypass in ApostropheCMS page management allows authenticated low-privileged editors to move pages into restricted subtrees they have no create rights over, and indirectly re-rank admin-only sibling pages via an unchecked database updateMany call. All deployments running ApostropheCMS prior to 4.32.0 are affected; the flaw exists in the REST page update endpoint and requires no special configuration to reach. No public exploit code exists and the vulnerability is not listed in CISA KEV, but the attack path through documented REST parameters is straightforward for any CMS insider.
RemediationAI
Upgrade ApostropheCMS to version 4.32.0 or later, which restores destination-parent authorization enforcement in the page move() operation. The fix is confirmed in commit d50c6ad61b9c1788958752358f1fca714cc8368c (https://github.com/apostrophecms/apostrophe/commit/d50c6ad61b9c1788958752358f1fca714cc8368c) and documented in the security advisory at https://github.com/apostrophecms/apostrophe/security/advisories/GHSA-wr5r-wqp2-x4fh. If immediate upgrade is not feasible, the most targeted compensating control is to audit and minimize editor/contributor role assignments - removing accounts that do not require page-move capabilities - since the vulnerability requires an authenticated session at that privilege level. As a secondary measure, blocking PATCH requests to /api/v1/@apostrophecms/page/:id at the reverse proxy or WAF layer for non-admin sessions will prevent exploitation but will also disable legitimate page-reordering functionality for editors, which is a significant operational trade-off. Neither workaround substitutes for patching.
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 CMS (CPE: cpe:2.3:a:apostrophecms:apostrophe:*:*:*:*:*:*:*:*). The root cause is CWE-639 (Authorization Bypass Through User-Controlled Key): a boolean logic regression in the move() authorization guard inside packages/apostrophe/modules/@apostrophecms/page/index.js. The original intent was to require _create permission on the destination parent for all normal cross-parent moves, with a narrow exception only for restoring pages out of the archive. The regression inverted this guard - the condition (oldParent.type = '@apostrophecms/archive-page' && !parent._edit) meant the check only fired when the source was in the archive, silently removing the check for every ordinary move. The fix negates the condition to !(oldParent.type = '@apostrophecms/archive-page' && parent._edit), restoring the check for all non-archive destinations. A secondary effect is that the nudgeNewPeers() function, called unconditionally after a successful move, performs a MongoDB updateMany to re-rank sibling pages under the new parent - documents the attacker has no direct write permission over - amplifying the integrity impact beyond the moved page itself.
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:N/S:U/C:N/I:H/A:N
REST API reachable over network with no special conditions; PR:L reflects mandatory editor/contributor authentication; I:H because attacker restructures restricted page hierarchy and triggers unchecked re-ranking of admin-only documents.
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.32.0, the page module's move() operation fails to enforce the destination parent's _create permission because its oldParent archive condition disables the check for ordinary moves, allowing an authenticated editor or contributor to use _targetId and _position through the page REST update endpoint to move a controlled page into a restricted subtree and make nudgeNewPeers() updateMany re-rank protected sibling pages. This issue is fixed in version 4.32.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
Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.
More in Apostrophecms
View allStored 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
The package sanitize-html before 2.7.1 are vulnerable to Regular Expression Denial of Service (ReDoS) due to insecure gl
EUVD-2026-60438
GHSA-wr5r-wqp2-x4fh
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB