
إعادة إنتاج ثغرة استخدام بعد التحرير (use-after-free) في WebAssembly داخل محرك جافاسكريبت الخاص بمؤسسة موزيلا، مع إظهار حالة سباق حتمية وتوفير إثبات مفهوم مُتحكم به.
إعادة إنتاج غير متقنة. كان الأساس يتطلب بعض التعديل هنا.
تصف Mozilla هذه المشكلة على أنها use-after-free في WebAssembly. الإصلاح العام
9823b5c86ffa يُبقي كائن wasm::Code المُسبب للـ trap بالضبط حيًا في JitActivation.
يقوم الاختبار باستدعاء ذيل عبر المثيلات بتوقيع خاطئ. خطاف unwind في Debugger يمسح آخر مرجع للهدف في الجدول ويُجبر GC على الانكماش بينما يعالج المحرك الـ trap. قبل الدخول في استدعاء الذيل، يستدعي Wasm استيراد JavaScript عادي يطبع العلامة.
9b564f641a42: الحالة 139 (SIGSEGV).9823b5c86ffa: يطبع PASS: trap handled after target release ويخرج
بالرمز 0.poc-controlled.js يوسّع تخصيص الـ shared-stub للهدف بـ 144
استيرادًا. هبوط الـ throw القديم يستقر داخل واحدة من أربع صفحات قابلة للتنفيذ.
حامل lazy-tier مُنشأ مسبقًا يضم 6,000 ثابت SIMD فريد في
قطعة كود محسّنة من أربع صفحات. أثناء unwind الاستثناء، يُطلق GC الهدف
ويعيد التقسيم المتزامن استخدام تلك الفجوة. مدرج syscall كل 64
بايت يطبع UAF NACHOS ويستدعي exit_group(0).
التشغيل:
js --wasm-compiler=baseline+ion \
--setpref=wasm_lazy_tiering_level=9 \
--setpref=wasm_lazy_tiering_synchronous=true \
--more-compartments poc-controlled.js
الموثوقية الملاحظة على قشرة Linux x86-64 المبنية من المصدر قبل الإصلاح: 3/3
مرات طبعت العلامة وخرجت بالرمز 0. القشرة المطابقة بعد الإصلاح تُثير
RuntimeError: indirect call signature mismatch المعتاد ولا تطبعه.
يستخدم الـ PoC المتحكم به دوال Debugger وGC الخاصة بالقشرة فقط لجعل السباق حتميًا. يحقق تحكمًا أصليًا في jsshell، وليس تسليمًا من صفحة ويب أو هروبًا من صندوق محتوى Firefox.
شغّل بقشرة تصحيح مكافئة:
js --wasm-compiler=baseline --more-compartments poc.js
هذا دليل على انحدار في العمر الافتراضي، وليس بدائية ذاكرة أو استغلالًا. تظهر العلامة على كلا البنائين ولا تنتج عن الـ UAF.