<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>ApostropheCMS (&lt;= 4.30.0) - CraftedSignal Threat Feed</title><link>https://feed.craftedsignal.io/products/apostrophecms--4.30.0/</link><description>Trending threats, MITRE ATT&amp;CK coverage, and detection metadata. Fed continuously.</description><generator>Hugo</generator><language>en</language><managingEditor>hello@craftedsignal.io</managingEditor><webMaster>hello@craftedsignal.io</webMaster><lastBuildDate>Sat, 01 Aug 2026 01:47:31 +0000</lastBuildDate><atom:link href="https://feed.craftedsignal.io/products/apostrophecms--4.30.0/feed.xml" rel="self" type="application/rss+xml"/><item><title>ApostropheCMS Server-Side Prototype Pollution via apos.util.set</title><link>https://feed.craftedsignal.io/briefs/2026-08-apostrophe-prototype-pollution/</link><pubDate>Sat, 01 Aug 2026 01:47:31 +0000</pubDate><author>hello@craftedsignal.io</author><guid isPermaLink="true">https://feed.craftedsignal.io/briefs/2026-08-apostrophe-prototype-pollution/</guid><description>A server-side prototype pollution vulnerability in ApostropheCMS allows an authenticated editor to bypass authorization for all subsequent API requests by polluting Object.prototype via the $pullAll patch operator.</description><content:encoded><![CDATA[<p>ApostropheCMS versions up to and including 4.30.0 contain a critical server-side prototype pollution vulnerability within the <code>apos.util.set()</code> function. The flaw occurs because the function fails to sanitize properties such as <code>__proto__</code>, <code>constructor</code>, or <code>prototype</code> during path traversal. An authenticated user with editor-level privileges can exploit this by sending a crafted PATCH request utilizing the <code>$pullAll</code> operator to inject malicious properties into the global <code>Object.prototype</code>.</p>
<p>This pollution creates a persistent state within the Node.js process. Specifically, the gadget <code>publicApiCheck()</code> fails to correctly enforce authorization once <code>Object.prototype.publicApiProjection</code> is set, leading to a process-wide bypass for all REST API piece-type endpoints. This allows unauthenticated users to access sensitive data endpoints that would otherwise be restricted, with the effect persisting until the Node.js process is restarted.</p>
<h2 id="attack-chain">Attack Chain</h2>
<ol>
<li>Attacker obtains valid credentials for an editor-level account on the target ApostropheCMS instance.</li>
<li>Attacker authenticates to the application to obtain a valid session token via the login API.</li>
<li>Attacker crafts a PATCH request targeting a document, embedding the <code>$pullAll</code> operator in the request body.</li>
<li>The payload uses dot-notation <code>__proto__.publicApiProjection</code> to trigger the unsafe <code>apos.util.set()</code> path traversal.</li>
<li>The application backend processes the request and mutates the global <code>Object.prototype</code>, injecting <code>publicApiProjection: []</code>.</li>
<li>Future requests from any user, including unauthenticated users, hit the application endpoints.</li>
<li>The <code>publicApiCheck()</code> logic evaluates the inherited (polluted) <code>publicApiProjection</code> property, causing the authorization check to skip.</li>
<li>Unauthenticated users retrieve sensitive data from protected REST API endpoints.</li>
</ol>
<h2 id="impact">Impact</h2>
<p>Successful exploitation results in a complete, persistent authorization bypass for all REST API endpoints across the entire Node.js process. This affects multiple sensitive endpoints, including <code>@apostrophecms/user</code> and <code>@apostrophecms/global</code>. Because the pollution resides in the global prototype object, it remains effective for the lifetime of the process, impacting every visitor until a server restart occurs. This vulnerability is applicable in any multi-user deployment where editor-level accounts exist.</p>
<h2 id="recommendation">Recommendation</h2>
<ol>
<li>Upgrade ApostropheCMS immediately to a patched version that implements input validation in <code>apos.util.set()</code> and <code>implementPatchOperators()</code>.</li>
<li>Deploy web server or WAF rules to inspect PATCH requests for <code>__proto__</code>, <code>constructor</code>, or <code>prototype</code> strings within the request body.</li>
<li>Restrict access to API endpoints to known safe IP ranges where possible to mitigate the impact of the bypass.</li>
<li>Monitor application logs for anomalous PATCH requests containing prototype traversal patterns.</li>
</ol>
]]></content:encoded><category domain="severity">critical</category><category domain="type">advisory</category></item></channel></rss>