
Firefox の content-to-parent IPDL 特権昇格 (N-day、bug 2054416): RemoteTypeOverride を伴う偽造 PDocumentChannel -> privilegedabout プロセスへの配置。侵害されたコンテンツプロセスからの mojo-port の send-path インジェクションを介して実行。
Firefox 149.0a1 nightly(2fbc0748c4、修正前)におけるサンドボックスエスケープの概念実証です。侵害されたコンテンツプロセスが IPDL メッセージを偽装し、親プロセスに特権(privilegedabout)プロセスへページをロードさせます。
これはステージ 2 のサンドボックスエスケープであり、コンテンツプロセス RCE(例: CVE-2026-2796)の後に連鎖させることを意図しています。
親プロセスは、コンテンツ→親 IPDL メッセージから nsDocShellLoadState をデシリアライズします。脆弱なビルドは、コンテンツが設定した RemoteTypeOverride フィールドを拒否しないため、コンテンツはナビゲーションがどのプロセスタイプに配置されるかを選択できます。
修正(コミット 3ec5c71b41bb、"Validate RemoteTypeOverride")により、nsDocShellLoadState コンストラクタはコンテンツトリガーのロードに対するオーバーライドをすべて拒否します。
オーバーライドが尊重されると — about:blank のドキュメントロード、トップレベルコンテキスト — IsolationOptionsForNavigation はロードのリモートタイプをオーバーライド値に設定し、ページは特権プロセスに配置されます。サンドボックス境界が侵害されます。
オーバーライドは PNecko::PDocumentChannel に乗ります。これはすべてのコンテンツプロセスが各ドキュメントロード時に送信するメッセージです(DocumentChannelCreationArgs.loadState は nsDocShellLoadState です)。
配信が興味深い部分です: IPC ソケットへの生の書き込みは静かにドロップされます。なぜなら IPDL メッセージは現在 mojo ポート 上で運ばれるからです。その代わりに、PoC は CVE-2026-2796 の funcref プリミティブを使用したネイティブ呼び出しを介して JavaScript から実際の送信パスを駆動します:
operator new — IPC::Message 用のヒープブロックを割り当てIPC::Message::Message(routing, type, capacity, flags) — 配置コンストラクタPickle::WriteBytes — 偽造ペイロードを追加MessageChannel::Send — mojo フレーミング、ポートルーティング、シーケンス番号はすべてネイティブで処理ペイロード(forge.py によって構築)は、RemoteTypeOverride = "privilegedabout"、URI about:blank、null プリンシパル、およびランタイムリークされた値(BrowsingContext id、TriggeringRemoteType)を運びます。
./irun
親側のログ(MOZ_LOG=ProcessIsolation:5,DocumentChannel:5)は、特権プロセスへのプロセス切り替えを示します:
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 ページ。侵害されたコンテンツプロセス内で実行 |
forge.py / forge.json | 偽造 IPDL メッセージを構築(自己検証付き) |
wasm-bytes.js | ステージ 1 プリミティブ: 任意読み書き、funcref 呼び出し |
mdrive.py / mdrive2.py | Nightly を起動・駆動する Marionette ハーネス |
irun | インストルメント実行: lldb を親にアタッチ + MOZ_LOG 証跡 |
profile.user.js | Firefox プロファイル設定(fission 有効、ダンプ有効) |
parse_dc.py | キャプチャした DocumentChannel メッセージのバイト完全一致パーサー |
scan_sentinels.py / extract_fields.py | キャプチャ用フィールドマップスキャナー |