
Google Chrome CVE-2026-6307 PoC
V8 JS-to-Wasm デオプティマイゼーション型混同のローカル再現と武器化。Nebula による説明。Chrome for Testing 146.0.7680.165 のレンダラーから xcalc をポップ (バグは 147.0.7727.101 で修正済み)。
すべてのペイロードは無害 (電卓 / exit(0x42) / jmp $)。
すべて、ローカルラボ内の意図的に古いブラウザに対して実行します。
他の人に向けないでください。
https://github.com/user-attachments/assets/d450f064-ba52-4f39-a88b-367f31217143
JSToWasmFrameStateFunctionInfo の等価演算子が Wasm シグネチャ比較を省略しているため、CSE/GVN はシグネチャのみ異なるフレーム状態をマージします。遅延デオプトは Wasm i64 をタグ付き externref としてマテリアライズし (逆も同様)、完全な 64 ビットの addrof/fakeobj を与えます。そのポインタはケージ圧縮されていません (Wasm 参照はタグ付きレジスタ表現を使用し、kReturnRegister0 経由で返されます)。
以下はすべて 146.0.7680.165 でライブ検証 済み。読み込みごとの数値は、繰り返し実行でのヒット率を測定したものです (混乱は GC に敏感で、各ページはダーティビルド上で再起動します)。偽陽性は一度も発生しませんでした。
--allow-natives-syntax なしほとんどの V8 バグ PoC は %OptimizeFunctionOnNextCall (テスト専用の組み込み関数で、実際の被害者が有効にすることはない --allow-natives-syntax の背後にゲートされている) で最適化を強制します。これらは フラグを一切使わずに、ウォームアップフィードバックを整形してデオプト混乱が自然に発火するようにすることでバグを駆動します。すべてのアドレスは実行時に漏洩 — ハードコードはありません。フラグなしでヘッドレス実行できます。
rce-no-aslr/ はコード実行に至ります: 最適化された JS 関数 g が JIT ダブルリテラル (movabs 定数、各々が eb rel8 で終わり次の定数へ連結) として execve シェルコードをステージングし、混乱したストアが g のコードに nop; jmp をパッチし、g() を呼び出すと RIP がシェルコードにスライドします。
このビルドは --allow-natives-syntax (%Optimize で g の JIT ペイロードを固定し、デオプト-GC がフラッシュできないようにする) と --no-memory-protection-keys (混乱ストアが JIT ページをパッチできるように — そうしないと V8 の PKU が読み取り専用にする) を使用します。ASLR はオフ (randomize_va_space=0) なのでアドレスは決定論的です (A_MAP = 0x5555bbc0128a)。レンダラーは --disable-seccomp-filter-sandbox --no-zygote も必要です。seccomp がシェルコードの execve をブロックするためです。
ネイティブ x86_64 Linux、ASLR オフ、PATH 上の Chrome 146、:0 上の X ディスプレイ (Xvfb または実 X)。rce-no-aslr/run.sh がすべてのフラグを設定し、http で提供します。
cd rce-no-aslr
./run.sh calc # http://127.0.0.1:8080、:0 で実際の xcalc をポップ
./run.sh exit # strace でレンダラーの exit(66) を確認
./run.sh jmp # gdb で注入されたシェルコード内の RIP を確認
./demo.sh calc # クリーンスレート + 自動リトライ、フルサイズのヘッドフルブラウザ (録画用)
./demo.sh msgbox # 同上、ただしポップはブランド化された "0xSha :: pwned" ボックス
pocmode.sh calc|msgbox は RCE の execve("/usr/bin/xcalc") が起動するものを切り替えます (実際の電卓 vs ブランド化ボックス)。フラグ不要のプリミティブはブラウザのみ必要です:
chrome --headless=new --no-sandbox http://127.0.0.1:8080/flag-free/01-primitives-flagfree.html
flag-free/ フラグ不要のコントリビューション (--allow-natives-syntax なし)
00-reachability トリガー + パッチ差分 (脆弱 146 vs パッチ済み 147)
01-primitives addrof / fakeobj
02-store ケージ外ストア
03-arw ケージ内 read64 / write64
rce-no-aslr/ 可視 RCE (決定論的、ASLR なしのラボビルド)
exploit-calc.html / exploit-exit.html
run.sh, demo.sh, pocmode.sh, xcalc-msgbox.sh
バグと根本原因の解説: Nebula Security (上記リンク)。このリポジトリ内のフラグ不要トリガー、プリミティブ、および可視動作は、ローカルラボで検証された再現/拡張です。
| ファイル | 証明内容 | 検証結果 |
|---|
flag-free/00-reachability-flagfree.html | 混乱状態をトリガー; 脆弱な 146 で発火、パッチ済み 147 ではしない | 読み込み 6/15 |
flag-free/01-primitives-flagfree.html | addrof / fakeobj (fakeobj(addrof(o))===o) | 8/12 |
flag-free/02-store-flagfree.html | ケージ外ストアが選択された値を選択されたオブジェクトに書き込む | 12/12 |
flag-free/03-arw-flagfree.html | ケージ内 read64 / write64 (偽の PACKED_DOUBLE 配列) | 2/12 (不安定、再試行) |
| ファイル | 証明内容 | 検証結果 |
|---|
rce-no-aslr/exploit-calc.html | レンダラーから execve 経由で実際の xcalc ウィンドウをポップ | クリーンスレートで約1秒でポップ |
rce-no-aslr/exploit-exit.html | レンダラーが注入されたシェルコードを実行して exit(66); #jmp はその中で RIP をスピン | exit(66) 8/8 (strace) |