
CVE-2024-29943, लेकिन wasm के साथ
CVE-2024-29943 के लिए एक एंड-टू-एंड एक्सप्लॉइट चेन जो SpiderMonkey के WebAssembly
JIT कोड पेज में f64.const इमीडिएट्स के रूप में शेलकोड तस्करी करके मनमाना
नेटिव कोड एक्ज़ीक्यूशन प्राप्त करती है — कोई ROP नहीं, कोई VirtualProtect नहीं, कोई
बाहरी टूलचेन नहीं।
2024-03-20 mozilla-central nightly (JavaScript-C126.0a1, linux x86-64,
pre-fix) के SpiderMonkey शेल के विरुद्ध सत्यापित रूप से कार्यरत: चेन पूरी तरह चलती है और पेलोड निष्पादित होता है
(write(1, "PWNED by wasm!\n"); exit(0)).
CVE-2024-29943 एक sec-critical IonMonkey रेंज-विश्लेषण बग है जिसका उपयोग Pwn2Own 2024 में Manfred Paul ने किया, जो Firefox < 124.0.1 को प्रभावित करता है (Bugzilla 1886849, CVSS 9.8)।
Object.keys के elidable बनाए जाने के बाद MObjectKeysLength::computeRange ने
Object.keys(x).length के लिए गलत इंटीजर रेंज लौटाई (bug 1845728 द्वारा रिग्रेस)। Ion रेंज
विश्लेषण ने निष्कर्ष निकाला कि एक लूप काउंटर ऋणात्मक नहीं हो सकता और उन बाउंड चेक्स को हटा दिया जो अभी भी पहुँच योग्य थे, जिससे
पर आउट-ऑफ-बाउंड रीड/राइट प्राप्त हुआ।
Uint8ArrayObject.keys range-analysis bug -> OOB r/w on Uint8Array
-> corrupt adjacent ArrayBuffer -> addrof / fakeobj / arbitrary R/W
-> instantiate hand-built WASM module (shellcode as f64.const immediates)
-> WasmInstanceObject -> wasm::Instance -> wasm::Code -> CodeTier
-> ModuleSegment.bytes_ (the JIT code page, RX)
-> scan page for marker constant
-> overwrite FuncExport.eagerInterpEntryOffset_ (plain heap)
with the shellcode's offset within the page
-> call the export through the interpreter -> payload runs
दो विवरणों को सीखने में हमें एक-एक सेगफॉल्ट का खर्च आया, इसलिए वे लिख दिए गए हैं:
FuncExport में eagerInterpEntryOffset_ को ओवरराइट करके किया जाता है
— इंटरप्रेटर codeBase + offset की गणना करता है और वहाँ जंप करता है।WASM-JIT-पेज शेलकोड तकनीक WasmBlazeFox से है; यह रेपो प्रदर्शित करता है कि यह तकनीक मूल 2018 ट्रेनिंग बग के स्थान पर एक आधुनिक, शिपिंग-ब्राउज़र बग के साथ संयोजित होती है।
poc.js — रेंज-विश्लेषण बग के लिए न्यूनतम ट्रिगर।exploit.js — पूरी चेन: प्रिमिटिव्स + WASM JIT शेलकोड स्टेज।gen_wasm.py — शेलकोड एम्बेड करने वाले WASM मॉड्यूल को असेंबल करता है और
कॉन्स्टेंट राउंड-ट्रिप को सत्यापित करता है। भिन्न पेलोड उपयोग करने के लिए python3 gen_wasm.py mysc.bin। डिफ़ॉल्ट पेलोड एक शुद्ध-सिसकॉल
write(1, "PWNED by wasm!\n"); exit(0) प्रमाण है जिसे किसी सिंबल
रिज़ॉल्यूशन की आवश्यकता नहीं (इसलिए यह बेयर jsshell में भी काम करता है)। क्लासिक
libxul-आधारित system("gnome-calculator") पेलोड के लिए, WasmBlazeFox ex6 देखें।test.gdb — किसी दिए गए बिल्ड पर ऑब्जेक्ट-मॉडल ऑफसेट प्राप्त करने के लिए ब्रेकपॉइंट्स और ptype /o हेल्पर्स।afbdf6822c9e9f9b6d44b9ea6904cb10878126b1 (Firefox ~124, pre-124.0.1),
Linux x86-64 बिल्ड करें — या एक pre-fix nightly jsshell लें, जैसे
archive.mozilla.org/pub/firefox/nightly/2024/03/2024-03-20-21-16-35-mozilla-central/jsshell-linux-x86_64.zip।LD_LIBRARY_PATH=<jsshell dir> ./js --no-threads --ion-offthread-compile=off \
--spectre-mitigations=off poc.js # trigger only (segfault)
LD_LIBRARY_PATH=<jsshell dir> ./js --no-threads --ion-offthread-compile=off \
--spectre-mitigations=off exploit.js # full chain ("PWNED by wasm!")
--spectre-mitigations=off आवश्यक है क्योंकि बाउंड-चेक एलिमिनेशन
इंडेक्स मास्किंग के अक्षम होने पर निर्भर करता है (Bugzilla कमेंट्स देखें)।
f64.const इमीडिएट्स कोड सेगमेंट में इनलाइन
एमिट होते हैं। Ion कंपाइलेशन उन्हें कॉन्स्टेंट-फोल्ड कर सकता है।WASM_INSTANCE_OFF_CODE = 0xa8, MetadataTier.funcExports + 448,
FuncExport + 8, आदि) भेद्य कमिट के हेडर्स से प्राप्त किए गए थे
और 2024-03-20 nightly jsshell के विरुद्ध पुष्ट किए गए; अन्य बिल्ड्स के लिए
test.gdb से पुनः प्राप्त करें।