
CVE-2024-29943، ولكن مع wasm
سلسلة استغلال متكاملة لـ CVE-2024-29943 تحقق تنفيذ تعليمات برمجية أصلية
عشوائية عبر تهريب shellcode إلى صفحة تعليمات WebAssembly JIT الخاصة بـ
SpiderMonkey كقيم فورية f64.const — بدون ROP، بدون VirtualProtect، بدون
سلسلة أدوات خارجية.
تم التحقق من عملها مقابل shell الخاص بـ SpiderMonkey من إصدار
2024-03-20 mozilla-central nightly (JavaScript-C126.0a1، linux x86-64،
قبل الإصلاح): تكتمل السلسلة حتى النهاية وتُنفَّذ الحمولة
(write(1, "PWNED by wasm!\n"); exit(0)).
CVE-2024-29943 هي ثغرة حرجة أمنياً في تحليل النطاق (range-analysis) في IonMonkey استُخدمت في Pwn2Own 2024 من قبل Manfred Paul، وتؤثر على Firefox < 124.0.1 (Bugzilla 1886849، CVSS 9.8).
أعادت MObjectKeysLength::computeRange نطاقاً صحيحياً غير صحيح لـ
Object.keys(x).length بعد جعل Object.keys قابلاً للحذف (تراجعت بسبب
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
تفصيلان كلّفانا segfault لكل واحد منهما لنتعلمهما، لذا هما مدوّنان:
eagerInterpEntryOffset_ في
FuncExport الموجود في الـ heap بدلاً من ذلك — يحسب المفسّر
codeBase + offset ويقفز إلى هناك.تقنية shellcode في صفحة WASM-JIT مأخوذة من WasmBlazeFox؛ يوضّح هذا المستودع أن التقنية تتكامل مع ثغرة حديثة في متصفح مُصدَّر فعلياً بدلاً من ثغرة التدريب الأصلية من 2018.
poc.js — مُشغِّل أدنى لثغرة تحليل النطاق.exploit.js — السلسلة الكاملة: البدائيات + مرحلة shellcode في WASM JIT.gen_wasm.py — يجمّع وحدة WASM التي تُضمّن shellcode ويتحقق من
الذهاب والإياب للثابت. 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، قبل 124.0.1)،
Linux x86-64 — أو احصل على jsshell nightly قبل الإصلاح، مثل
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، إلخ) اشتُقّت من ترويسات الالتزام القابل للاستغلال
وأُكِّدت مقابل jsshell nightly بتاريخ 2024-03-20؛ أعد اشتقاقها بـ
test.gdb لعمليات بناء أخرى.