
Firefox content-to-parent IPDL विशेषाधिकार वृद्धि (N-day, bug 2054416): RemoteTypeOverride के साथ जाली PDocumentChannel -> privilegedabout प्रोसेस प्लेसमेंट, एक समझौता-किए गए कंटेंट प्रोसेस से mojo-port send-path इंजेक्शन के माध्यम से
Firefox 149.0a1 nightly (2fbc0748c4, प्री-फिक्स) में सैंडबॉक्स एस्केप के लिए प्रूफ ऑफ कॉन्सेप्ट। एक समझौता किया गया content process एक IPDL message गढ़ता है जो parent को एक विशेषाधिकार प्राप्त (privilegedabout) process में पेज लोड करने के लिए बाध्य करता है।
यह stage-2 सैंडबॉक्स एस्केप है, जिसे content-process RCE (जैसे CVE-2026-2796) के बाद श्रृंखला में जोड़ने के लिए डिज़ाइन किया गया है।
Parent process content→parent IPDL messages से एक nsDocShellLoadState deserialize करता है। कमजोर build, content द्वारा सेट किए गए RemoteTypeOverride फ़ील्ड को अस्वीकार नहीं करता, इसलिए content चुन सकता है कि नेविगेशन किस process type में जाए।
फिक्स (commit 3ec5c71b41bb, "Validate RemoteTypeOverride") nsDocShellLoadState ctor को content-ट्रिगर किए गए लोड पर किसी भी override को अस्वीकार करने के लिए बाध्य करता है।
जब override को मान्य किया जाता है — about:blank का document load, top-level context — IsolationOptionsForNavigation लोड के remote type को override value पर सेट करता है, और पेज को privileged process में रखा जाता है। सैंडबॉक्स सीमा का उल्लंघन हुआ।
Override, PNecko::PDocumentChannel पर सवार होता है — यह एक message है जिसे हर content process प्रत्येक document load के लिए भेजता है (DocumentChannelCreationArgs.loadState एक nsDocShellLoadState है)।
डिलीवरी दिलचस्प हिस्सा है: IPC socket पर raw writes चुपचाप ड्रॉप कर दिए जाते हैं, क्योंकि IPDL messages अब mojo ports पर सवार होते हैं। इसके बजाय, PoC JavaScript से native calls के माध्यम से वास्तविक send path चलाता है (CVE-2026-2796 funcref primitive का उपयोग करके):
operator new — IPC::Message के लिए heap block आवंटित करेंIPC::Message::Message(routing, type, capacity, flags) — placement ctorPickle::WriteBytes — गढ़े गए payload को जोड़ेंMessageChannel::Send PContent channel पर — mojo framing, port routing, और sequence numbers सभी native रूप से संभाले जाते हैंPayload (forge.py द्वारा निर्मित) में RemoteTypeOverride = "privilegedabout", URI about:blank, एक null principal, और runtime-लीक किए गए मान (BrowsingContext id, TriggeringRemoteType) होते हैं।
./irun
Parent-side लॉग्स (MOZ_LOG=ProcessIsolation:5,DocumentChannel:5) privileged process में प्रक्रिया स्विच दिखाते हैं:
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 | PoC पेज, समझौता किए गए content process के अंदर चलाया जाने वाला |
forge.py / forge.json | गढ़े गए IPDL message का निर्माण (स्व-सत्यापन) |
wasm-bytes.js | stage-1 प्रिमिटिव्स: arb R/W, funcref calls |
mdrive.py / mdrive2.py | Nightly को लॉन्च और चलाने के लिए marionette harness |
irun | instrumented रन: parent से lldb attach + MOZ_LOG साक्ष्य |
profile.user.js | Firefox profile प्राथमिकताएँ (fission on, dump enabled) |
parse_dc.py | कैप्चर किए गए DocumentChannel messages के लिए byte-exact पार्सर |
scan_sentinels.py / extract_fields.py | कैप्चर के लिए field-map स्कैनर्स |