
CVE-2026-2796 के लिए PoC एक्सप्लॉइट चेन: SpiderMonkey WebAssembly सैंडबॉक्स एस्केप (सिग्नेचर टाइप कन्फ्यूजन -> मनमाना R/W -> RCE)
CVE-2026-2796 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट चेन, जो Mozilla SpiderMonkey के WebAssembly इम्पोर्ट ऑप्टिमाइज़ेशन ("JavaScript: WebAssembly" कंपोनेंट) में JIT गलत-संकलन / टाइप-कन्फ्यूज़न है। एक क्राफ्टेड wasm मॉड्यूल संपूर्ण होस्ट प्रोसेस का मनमाना रीड/राइट और मनमाना नेटिव कोड निष्पादन प्राप्त करता है, जिससे WebAssembly सैंडबॉक्स से बच निकलता है।
e2acef67 ("Bug 2013165 - Fix import optimization")जब कोई wasm मॉड्यूल किसी JS फ़ंक्शन को इम्पोर्ट करता है, तो SpiderMonkey MaybeOptimizeFunctionCallBind (js/src/wasm/WasmInstance.cpp) में एक ऑप्टिमाइज़ेशन लागू करता है जो Function.prototype.call.bind(fn) के रूप के इम्पोर्ट को अनरैप करता है और fn को सीधे इम्पोर्ट के callable के रूप में संग्रहीत करता है। यह जाँचने में विफल रहा कि बाउंड मान स्वयं एक है या नहीं:
+ if (boundThis.toObject().is<JSFunction>() &&
+ boundThis.toObject().as<JSFunction>().isWasm()) {
+ return nullptr;
+ }
चेक अनुपस्थित होने पर, इम्पोर्ट को मूल-रूप से-wasm फ़ंक्शन मान लिया जाता है: JS रैपर — और इसके साथ सिग्नेचर चेक — को छोड़ दिया जाता है। इसलिए एक wasm फ़ंक्शन को घोषित इम्पोर्ट प्रकार के माध्यम से लागू किया जा सकता है जो उसके वास्तविक प्रकार से मेल नहीं खाता। मान रजिस्टरों में अपरिवर्तित पास होते हैं; केवल उनकी व्याख्या बदलती है (उदाहरण के लिए, एक हमलावर-नियंत्रित i64 को (ref $t) GC पॉइंटर के रूप में उपयोग किया जाता है, और इसके विपरीत)।
| फ़ाइल | चरण | परिणाम |
|---|---|---|
poc-crash.js | सिग्नेचर कन्फ्यूज़न | i64.const 0xDEADBEEF को funcref पॉइंटर के रूप में डीरेफ़रेंस किया गया → 0xdeadbf2f पर SIGSEGV |
poc-addrof.js | addrOf + fakeobj | दोनों दिशाओं में कन्फ्यूज़न (i64 ↔ (ref $t)) → नकली WasmArrayObject (numElements_ @+16, data_ @+24, इनलाइन एलिमेंट @+40) → प्रोसेस में कहीं भी मनमाना R/W |
poc-recon.js | लेआउट टोही | JSFunction नेटिव ptr @+0x20 → बाइनरी बेस लीक; WasmFuncRef typeDef ptr @+0x40 |
poc-forge.js | नियंत्रण प्रवाह | जाली funcref call_ref टाइप चेक पास करता है; कॉल टारगेट [funcref+0x38] से लोड किया गया |
poc-rce.js | कोड निष्पादन | जाली funcref → लीक किए गए system() के माध्यम से system("touch /tmp/CVE-2026-2796-PWNED") (बाइनरी बेस + GOT एंट्री @ base+0x11d47b0) |
कन्फ्यूज़न प्रिमिटिव बिल्कुल Mozilla के अपने रिग्रेशन टेस्ट (js/src/jit-test/tests/wasm/regress/bug2013165.js) की तरह प्राप्त किया जाता है: Function.prototype.call.bind(wasmExport) को दूसरे मॉड्यूल में इम्पोर्ट करें जिसकी इम्पोर्ट घोषणा में भिन्न सिग्नेचर हो, फिर ref.func + call_ref।
# Firefox सोर्स @ 2fbc0748c460b38fc95407a3f14c41d12fb12026 (2026-01-14,
# Firefox 148 नाइटली — फिक्स से पहले)। कोई भी pre-148 रिवीज़न काम करता है।
cd js/src
../../configure --enable-debug --enable-optimize --without-intl-api \
--enable-project=js # objdir जैसे js/src/_obj
cd _obj && make -j8
# बाइनरी: dist/bin/js (रिपोर्ट करता है "JavaScript-C149.0a1")
JS=/path/to/dist/bin/js
$JS poc/poc-crash.js # 0xdeadbf2f पर SIGSEGV
$JS poc/poc-addrof.js # प्रिंट करता है [+] arbitrary read OK / write OK
$JS poc/poc-recon.js # JSFunction / WasmFuncRef मेमोरी डंप करता है
$JS poc/poc-forge.js # PC = लगाया गया canary के साथ क्रैश होता है
rm -f /tmp/CVE-2026-2796-PWNED
$JS poc/poc-rce.js # system() के माध्यम से /tmp/CVE-2026-2796-PWNED बनाता है
पैच किए गए बिल्ड (Firefox ≥ 148) पर, poc-crash.js इसके बजाय TypeError: bad type फेंकता है — सिग्नेचर चेक बहाल कर दिया गया है।
ऑफसेट macOS arm64 (js शेल, इस सटीक रिवीज़न/बिल्ड फ्लैग्स) के लिए हैं:
WasmArrayObject { +16 numElements, +24 data_, +40 इनलाइन डेटा },
JSFunction नेटिव @ +0x20, WasmFuncRef { +0x40 typeDef, +0x38 कॉल
टारगेट }। इन्हें PoC के सेल्फ-टेस्ट द्वारा रनटाइम पर अनुभवजन्य रूप से मान्य किया जाता है; अन्य बिल्ड/आर्किटेक्चर को पुनः-व्युत्पत्ति की आवश्यकता होती है (recon PoC इसका अधिकांश भाग स्वचालित करता है)। arm64 (गैर-arm64e) बाइनरी पर कोई PAC नहीं; JIT क्षेत्र कॉल समय पर लिखने योग्य नहीं हैं, इसलिए चेन कोड इंजेक्ट करने के बजाय मौजूदा कॉल टारगेट को हाईजैक करती है।
स्टेज-2 विश्लेषण के लिए docs/full-escape.md देखें: CVE-2026-2768 (Bug 2014101, पैरेंट-प्रोसेस IndexedDB OOB राइट) के माध्यम से रेंडरर कोड निष्पादन से OS सैंडबॉक्स से बचना — पूर्ण Firefox समझौते का "दूसरा बग"। यहाँ उपयोग किया गया कमजोर ट्री उस फिक्स से भी पहले का है।
यह wasm इंजन सैंडबॉक्स (लीनियर-मेमोरी / GC परिरोध) से बचता है और वर्तमान प्रोसेस में नेटिव कोड निष्पादन देता है। वास्तविक ब्राउज़र हमले में यह Firefox कंटेंट प्रोसेस के अंदर समाप्त होता है; OS सैंडबॉक्स से बचना ("दूसरा बग": IPC कन्फ्यूज़न या कर्नेल एक्सप्लॉइट) एक अलग समस्या है और इस PoC का हिस्सा नहीं है।
javascript.options.wasm=false ट्रिगर वेक्टर को अवरुद्ध करता है।केवल सुरक्षा अनुसंधान, शिक्षा और रक्षात्मक परीक्षण के लिए। यह कमजोरी वर्तमान Firefox/Thunderbird रिलीज़ में पैच की गई है। उन प्रणालियों के विरुद्ध उपयोग न करें जिनके स्वामी आप नहीं हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट प्राधिकरण नहीं है।