
CVE-2026-78938の根本原因分析と動作するエクスプロイト。V8 TurboFanの型混同により、圧縮ヒープ内での任意の読み書きが可能になります。クラッシュPoCとランタイムアドレス指定プリミティブを含みます。
CVE-2026-78938の根本原因分析とエクスプロイト。V8のTurboFanロード除去における型混同で、Chrome 152.0.7977.64(V8 15.2.124.18)で修正されました。このバグは実環境で悪用されたと報告されています。
このエクスプロイトは、バグを範囲外のFloat64Arrayに変え、そこからaddrof/fakeobjおよびV8圧縮ヒープ上の任意読み書きを実現します。最初の書き込み以降はすべて実行時に特定されます。R/Wステージにはハードコードされたヒープオフセットはありません。
50597b0bb48a — 「[compiler] インスタンス移行を伴うCheckMapsで追跡フィールドを無効化」macOS arm64上で、両バージョンのローカルビルドd8に対してテスト済みです。
| ファイル | 説明 |
|---|
pocs/crash.js | 最小トリガー。脆弱なビルドではSIGBUS、パッチ適用済みビルドでは正常終了。 |
pocs/rw_final.js | 完全なエクスプロイト、ステージ1: トリガー + OOB配列。固定済み — 下記「再現方法」を参照。 |
pocs/logic_final.js | 完全なエクスプロイト、ステージ2: addrof/fakeobj/任意R\W。ステージ1によって実行時にロードされます。 |
WRITEUP.md | 完全な根本原因分析とエクスプロイトのメモ。 |
2つのd8バージョンをビルドし(正確なコミットとGN引数はWRITEUP.mdを参照)、リポジトリのルートから実行します:
# クラッシュPoC: 脆弱版ではSIGBUS、パッチ適用版では正常終了
out/vuln/d8 --allow-natives-syntax --homomorphic-ic --max-valid-polymorphic-map-count=4 pocs/crash.js
out/patched/d8 --allow-natives-syntax --homomorphic-ic --max-valid-polymorphic-map-count=4 pocs/crash.js
# 完全なR/W: 脆弱版では動作、パッチ適用版では正常に終了
out/vuln/d8 --allow-natives-syntax --homomorphic-ic --max-valid-polymorphic-map-count=4 pocs/rw_final.js
脆弱なビルドでの期待される出力:
[+] OOB Float64Array len=0x7f000004
[+] after write: victim2.z = 2.5
[+] fakeobj(hn|1) typeof=number
[+] ALL PRIMITIVES VERIFIED
重要な点が2つあります:
--homomorphic-ic --max-valid-polymorphic-map-count=4 は、最適化されたコードで移行パスが取られるように多態的マップフィードバックを整形します。これらがないと、トリガーは静かに何も行いません。pocs/rw_final.js はバイト単位で固定されています。 単一の破壊的書き込みは、victim配列が割り当てられる場所に依存するヒープ相対オフセットに着地します。これはさらにスクリプトの正確なバイトとパスに依存します。ファイルを編集(または名前変更)すると、組み込まれたオフセットが無効になります。再調整方法はWRITEUP.mdに記載されています。pocs/logic_final.jsはトリガー発火後にロードされるため、自由に編集できます。pocs/rw_final.js内の単一の書き込みオフセットのみです。このリポジトリは教育および防御的研究目的です。このバグは現在のChromeで修正されており、詳細はV8ソースツリーで公開されています。