概念実証:侵害されたコンテンツプロセスが、nsDocShellLoadState に任意の URI とともに SrcdocData を保持する PDocumentChannel ロードを偽造します。脆弱なビルドでは、攻撃者のHTMLが被害者のオリジンでドキュメントとして配信されます — 同一オリジン読み取り+外部送信(UXSS)。
対象:Firefox 149.0a1 nightly @ 2fbc0748c4(脆弱、修正前)、macOS arm64。
Firefox 152で修正 — bug 2040160、コミット 54dc16d08771「非about:srcdoc URIロードでのsrcdocデータを拒否」。
親プロセスは、content→parent IPDLメッセージから nsDocShellLoadState をデシリアライズします。脆弱なコンストラクタは、コンテンツトリガーのロードに対して javascript: のみを拒否していました。SrcdocData は検証されていませんでした。ロード状態が ではないURIとともにsrcdocデータを保持する場合、docshellはsrcdoc HTMLを配信する入力ストリームチャネルを構築し、結果のドキュメントはそのURIのオリジンを取得します。
about:srcdoc修正では、!mSrcdocData.IsVoid() && !mURI->SchemeIs("view-source") && !NS_IsAboutSrcdoc(mURI) の場合に nsDocShellLoadState IPDLコンストラクタで FatalError を追加し、nsDocShell と Document::StartDocumentLoad に強化アサートを追加します。
関連バグ:CVE-2026-74939(RemoteTypeOverride)— 同じコンストラクタ、同じ搬送メッセージ、同じ配信機構(../poc-cve-2026-74939 を参照)。このPoCは、別のフィールドを反転させてその偽造を再利用します。RemoteTypeOverride は不要です。
srcdoc.html が http://127.0.0.1:8778(オリジンA、wasm-bytes.js のステージ1 wasmプリミティブを介して侵害済み)。PNecko::PDocumentChannel コンストラクタを偽造:URI = http://localhost:8778/nav.html(オリジンB)、SrcdocData = <攻撃者HTML>、同一プロセスの about:blank ポップアップのトップレベル BrowsingContext — 実際のmojo送信パス(operator new → IPC::Message コンストラクタ → 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プリミティブ:任意読み書き、funcref呼び出し(CVE-2026-2796) |
mdrive2.py | Nightlyを起動・駆動するmarionetteハーネス |
irun | 計装実行:親へのlldbアタッチ+MOZ_LOG/srv.log証拠 |
profile.user.js | Firefoxプロファイル設定(fission有効、ダンプ有効) |
parse_dc.py | キャプチャしたDocumentChannelメッセージのバイト完全パーサー |
captured-messages/dc_1.bin | 実際にキャプチャしたメッセージ、偽造テンプレートとして使用 |
nav.html、secret.txt | デモ用の被害者ページフィクスチャ+シークレット |
前提条件:/Users/sid/gecko-2766/obj-browser の脆弱なNightlyビルド、psutilを含む .venv、およびこのディレクトリを配信する 0.0.0.0:8778 のWebサーバー(例:python3 /tmp/srv.py、/tmp/srv.log にログ記録)。
python3 forge.py # forge.bin/forge.jsonを構築(自己検証)
./irun # 起動+注入+証拠収集
注:送信後、コンテンツプロセスはティアダウン時にSIGSEGVする可能性があります(偽オブジェクト上のGC)。すべての証拠はその前に出力されます。
54dc16d08771(MFSA 2026-57、Firefox 152)RemoteTypeOverride)