
تصعيد امتيازات IPDL من المحتوى إلى الأب في فايرفوكس (N-day، الخطأ 2054416): PDocumentChannel مزوّر مع RemoteTypeOverride -> وضع عملية about مُميَّزة، عبر حقن مسار إرسال mojo-port من عملية محتوى مخترَقة
إثبات مفهوم لتهريب من صندوق الحماية في نسخة فايرفوكس الليلية 149.0a1 (2fbc0748c4، قبل الإصلاح). تزوّر عملية محتوى مخترقة رسالة IPDL تجعل العملية الأم تحمّل صفحة في عملية ذات امتيازات (privilegedabout).
هذا هو تهريب صندوق الحماية من المرحلة الثانية، وهو مصمّم ليأتي في سلسلة بعد تنفيذ تعليمات برمجية عن بُعد (RCE) في عملية المحتوى (مثل CVE-2026-2796).
تقوم العملية الأم بإلغاء تسلسل كائن nsDocShellLoadState من رسائل IPDL الواردة من المحتوى إلى العملية الأم. لا ترفض النسخة الهشّة حقل RemoteTypeOverride المُعيّن من المحتوى، لذا يمكن للمحتوى اختيار نوع العملية التي ستُحمَّل فيها عملية التنقّل.
يجعل الإصلاح (الالتزام 3ec5c71b41bb، "Validate RemoteTypeOverride") مُنشئ الكائن nsDocShellLoadState يرفض أي تجاوز عند تحميل ناتج عن المحتوى.
عندما يُقبل التجاوز — تحميل مستند لـ about:blank في سياق المستوى الأعلى — يقوم IsolationOptionsForNavigation بتعيين النوع البعيد للتحميل إلى قيمة التجاوز، وتوضع الصفحة في عملية ذات امتيازات. وبذلك تُنتهك حدود صندوق الحماية.
يركب التجاوز على رسالة PNecko::PDocumentChannel، وهي رسالة ترسلها كل عملية محتوى عند كل تحميل مستند (DocumentChannelCreationArgs.loadState هو كائن nsDocShellLoadState).
الجزء المثير للاهتمام هو آلية التسليم: فالكتابات الخام إلى مقبس IPC تُسقَط بصمت، لأن رسائل IPDL أصبحت تركب الآن منافذ mojo. بدلاً من ذلك، يقود إثبات المفهوم مسار الإرسال الحقيقي من جافاسكربت عبر استدعاءات أصلية (باستخدام بدائية funcref الخاصة بـ CVE-2026-2796):
operator new — تخصيص كتلة من الكومة لرسالة IPC::MessageIPC::Message::Message(routing, type, capacity, flags) — مُنشئ التموضع (placement ctor)Pickle::WriteBytes — إلحاق الحمولة المزوّرةMessageChannel::Send على قناة PContent — يتم التعامل مع تأطير mojo وتوجيه المنافذ وأرقام التسلسل جميعها بشكل أصليتحمل الحمولة (التي يبنيها forge.py) القيمة RemoteTypeOverride = "privilegedabout"، وعنوان URI about:blank، ومبدأً فارغًا (null principal)، وقيمًا مُسرَّبة من وقت التشغيل (معرّف BrowsingContext، TriggeringRemoteType).
./irun
تُظهر سجلات جانب العملية الأم (MOZ_LOG=ProcessIsolation:5,DocumentChannel:5) تبديل العملية إلى العملية ذات الامتيازات:
V/ProcessIsolation using remote type override (privilegedabout) for load
I/ProcessIsolation Process Switch: Changing Remoteness from 'webIsolated=http://127.0.0.1' to 'privilegedabout'
3ec5c71b41bb "Validate RemoteTypeOverride"| الملف | الغرض |
|---|
privesc.html | صفحة إثبات المفهوم، تُشغَّل داخل عملية المحتوى المخترقة |
forge.py / forge.json | بناء رسالة IPDL المزوّرة (تتحقق ذاتيًا) |
wasm-bytes.js | أوليات المرحلة الأولى: قراءة/كتابة اعتباطية (arb R/W)، استدعاءات funcref |
mdrive.py / mdrive2.py | أداة ربط Marionette لإطلاق نسخة Nightly والتحكم فيها |
irun | تشغيل مُجهَّز بالأدوات: إرفاق lldb بالعملية الأم + أدلة MOZ_LOG |
profile.user.js | تفضيلات ملف تعريف فايرفوكس (تشغيل fission، تفعيل التفريغ dump) |
parse_dc.py | محلّل متطابق بايتًا ببايت لرسائل DocumentChannel الملتقطة |
scan_sentinels.py / extract_fields.py | ماسحات خرائط الحقول للقطات الملتقطة |