<?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/" xmlns:webfeeds="http://webfeeds.org/rss/1.0"><channel><title>Ardatan - CraftedSignal Threat Feed</title><link>https://feed.craftedsignal.io/vendors/ardatan/</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>Mon, 26 Oct 2026 16:13:58 +0000</lastBuildDate><atom:link href="https://feed.craftedsignal.io/vendors/ardatan/feed.xml" rel="self" type="application/rss+xml"/><image><url>https://feed.craftedsignal.io/favicon-32x32.png</url><title>CraftedSignal Threat Feed</title><link>https://feed.craftedsignal.io/</link><width>32</width><height>32</height></image><webfeeds:icon>https://feed.craftedsignal.io/favicon.svg</webfeeds:icon><item><title>@graphql-tools/utils: Prototype pollution in mergeIncrementalResult</title><link>https://feed.craftedsignal.io/briefs/2026-10-graphql-tools-prototype-pollution-9385e300/</link><pubDate>Mon, 26 Oct 2026 16:13:58 +0000</pubDate><author>hello@craftedsignal.io</author><guid isPermaLink="true">https://feed.craftedsignal.io/briefs/2026-10-graphql-tools-prototype-pollution-9385e300/</guid><description>A prototype pollution vulnerability in @graphql-tools/utils allows an attacker to inject arbitrary properties into Object.prototype via unvalidated path segments in incremental GraphQL responses.</description><content:encoded><![CDATA[<p>The <code>@graphql-tools/utils</code> package (versions 10.10.1 through 12.0.1) contains a prototype pollution vulnerability in the <code>mergeIncrementalResult</code> function. The function incorrectly validates path segments by using strict equality checks (<code>===</code>) against forbidden keys like <code>'__proto__'</code>, <code>'constructor'</code>, and <code>'prototype'</code>. Because the function does not verify that these path segments are primitive types (strings or numbers), an attacker can supply an object, such as an array <code>[&quot;__proto__&quot;]</code>. In JavaScript, this is coerced into the string <code>&quot;__proto__&quot;</code> during property access, successfully bypassing the protection check and allowing the attacker to write values onto <code>Object.prototype</code>. This can lead to authorization bypass, configuration manipulation, or unexpected application behavior in any consuming Node.js process.</p>
<h2 id="attack-chain">Attack Chain</h2>
<ol>
<li>An attacker gains control over, or performs a MITM attack on, an upstream GraphQL subgraph or transport layer.</li>
<li>The attacker crafts a malicious incremental GraphQL response (such as an <code>@defer</code> or <code>@stream</code> patch).</li>
<li>The attacker sets the <code>path</code> field in the response to include a non-primitive, array-based segment: <code>[[&quot;__proto__&quot;], &quot;maliciousKey&quot;]</code>.</li>
<li>The consuming application receives the malicious response and passes it to the public <code>mergeIncrementalResult</code> helper.</li>
<li><code>mergeIncrementalResult</code> calls <code>setObjectKeyPath</code>, which checks the array <code>[&quot;__proto__&quot;]</code> against the forbidden strings; the check fails (returning false) because the types do not match, allowing the segment to proceed.</li>
<li>During assignment, <code>current[key]</code> triggers <code>ToPropertyKey</code> coercion, converting the array to the string <code>&quot;__proto__&quot;</code>.</li>
<li>The function resolves <code>Object.prototype</code> and assigns the attacker's value to the chosen key.</li>
<li>Unrelated objects created subsequently in the Node.js process inherit the polluted property, altering application logic.</li>
</ol>
<h2 id="impact">Impact</h2>
<p>An attacker can overwrite properties on <code>Object.prototype</code>, potentially impacting global application security controls (e.g., overriding <code>isAdmin</code> flags or configuration objects). This effect persists for the lifetime of the Node.js process and applies to all objects instantiated after the pollution event, escaping the scope of the original GraphQL response.</p>
<h2 id="recommendation">Recommendation</h2>
<ul>
<li>Upgrade <code>@graphql-tools/utils</code> to a patched version once available, or implement a wrapper to validate that all path segments are strictly primitive strings or numbers before calling <code>mergeIncrementalResult</code>.</li>
<li>Use <code>Object.freeze(Object.prototype)</code> in the consuming Node.js application to mitigate the impact of prototype pollution attempts.</li>
<li>Implement runtime input validation on all upstream data sources that provide incremental GraphQL responses.</li>
</ul>
]]></content:encoded><category domain="severity">high</category><category domain="type">advisory</category><category>prototype-pollution</category><category>supply-chain</category><category>graphql</category></item></channel></rss>