
سلسلة استغلال لإثبات المفهوم لثغرة CVE-2026-2764 في متصفح Firefox، تربط بين سوء التحويل البرمجي في JIT وثغرة الاستخدام بعد التحرير (use-after-free) لتحقيق قراءة/كتابة عشوائية وتنفيذ شيل كود عبر WASM.
الحالة: تحليل + PoC مُتحقَّق منه. تسليح الـ primitive قيد التنفيذ.
سلسلة بأسلوب WasmBlazeFox مبنية هذه المرة على ثغرة من 2026: CVE-2026-2764، وهي "ترجمة JIT خاطئة + use-after-free" من نوع IonMonkey/baseline في مكوّن JavaScript Engine: JIT، أُصلحت في Firefox 148 (MFSA 2026-13، CVSS غير محدد بعد). الهدف النهائي هو نفسه كما في CVE-2024-29943-but-with-wasm: تغذية الـ primitive في صفحة WASM JIT مليئة بثوابت shellcode.
خطأ Bugzilla 2012608 مقيد، لكن الإصلاح نُشر في العلن:
hg 1b58f51668d3 — "الخطأ 2012608: استدعاء CreateThis مباشرة من PBL":
توقف PortableBaselineInterpret.cpp عن تمرير إنشاء this الخاص بالمنشئات
المكتوبة بسكربت عبر CreateThisFromIC (الذي كان يعيد قراءة حالة IC)، ويستدعي
الآن js::CreateThis مباشرة بقيم جذرية (rooted) صحيحة.hg 3adad00d0042 — تنسيق/توثيق لعقد createThis في BaselineCacheIRCompiler.cpp
(يجب أن يشمل argc وسائط الانتشار).hg 57885d520e85 — اختبارات الانحدار (وهي الـ PoCs الخاصة بنا).نمط الفشل: عند new Ctor(...arr) / Reflect.construct مع Proxy كـ
newTarget، يعمل مصيدة get الخاصة بالـ Proxy بينما يكون المحرك بين
نشر الوسائط وإنشاء this. يمكن لهذا الاستدعاء (callback) أن يغيّر أو
يحرّر المصفوفة نفسها التي ينشرها المحرك، ويواصل المحرك العمل بافتراضات
قديمة:
arr[0] يُستبدل من int إلى object بعد لقطة الانتشار
(poc-typeconfusion.js)arr.length = 0; gc() يحرّر مخزن العناصر في منتصف الانتشار
(poc-uaf.js)باستخدام jsshell الليلي (nightly) من mozilla-central بتاريخ 2026-02-09 (JavaScript-C149.0a1،
لينكس x86-64، قبل التصحيح)، داخل حاوية Docker على معمارية x86_64:
./js poc-typeconfusion.js -> Error: Assertion failed: got "oops", expected 1
./js poc-uaf.js -> Segmentation fault
كلا الـ PoC هما اختبارا انحدار من موزيلا نفسها، منقولان حرفيًا.
poc-typeconfusion.js (controllable argument-value confusion, no crash)
-> Ion-optimize a constructor that makes baked type assumptions on its
spread arguments; swap in an object where an int32 was proven
-> addrof / fakeobj
-> corrupt TypedArray length -> arbitrary R/W
-> WASM JIT shellcode stage (same as CVE-2024-29943-but-with-wasm:
f64.const immediates, FuncExport entry-offset overwrite)
مرحلة WASM وكود تتبع الإزاحات (offset-walk) يُنقلان دون تغيير، باستثناء الإزاحات
التي يجب إعادة اشتقاقها مقابل بناء عصر FF149 (انظر
CVE-2024-29943-but-with-wasm/test.gdb للوصفة).
1b58f51668d3، 3adad00d0042، الاختبارات 57885d520e85