ステータス: 検証済みクラッシュPoC、制御フローハイジャックを実証済み
(クラッシュ時の pc = 解放済みセルのポイズン 0xcdcdcdcdcdcdcdcd、デバッグ
シェル環境下 — エンジンは解放済みICScriptから読み出したポインタへジャンプする)。
残作業: 再利用されたバイト列を制御すること。詳細は
research/README.md を参照。
2026年のバグに対するWasmBlazeFoxファミリーのチェーン: CVE-2026-2766、 「JavaScript Engine: JITコンポーネントにおけるJIT誤コンパイル / use-after-free」、 Firefox 148で修正済み (MFSA 2026-13)。最終目標は CVE-2024-29943-but-with-wasm と同じである: プリミティブをコードポインタの制御に変換し、シェルコード定数で 埋め尽くされたWASM JITページへと向ける。
Mozilla自身のリグレッションテストのコメント (bug 2013583、テストは
hg 457b68097f81 でランド済み) および js/src/jit/JitScript.h 内の
ICScript Lifetimes SMDOCより:
removeInlinedChild を呼び出す → 子の ICScript は
から削除されるが、依然として の
ベクタから参照されている — そして致命的なことに、
呼び出し元のICチェーンに残ったままの古い
スタブからも参照されている。inlinedChildren_InliningRootinlinedScripts_CallInlinedFunctiongczeal(14, 1)、すなわち毎回のアロケーションで
ZealCompactValue) が孤立したICScriptを移動/退避させる一方、古いスタブ
チェーンは古いアドレスを保持し続ける。0xe5 でポイズンされ、非常に読みやすいクラッシュとなる。脆弱なビルド: mozilla-central rev b3663be61a1a (2026-01-15のナイトリー;
修正は2026-01-15から2026-02-09の間にランドされた — 2月9日のナイトリーは
生き残る)。シェル: そのrevのTaskcluster linux64-fuzzing-asan-opt jsshell
(gczeal のために必要; release-optシェルにはこれが無い)。
./js --ion-warmup-threshold=100000 poc.js
== ERROR: AddressSanitizer: SEGV on unknown address 0xe5e5e5e5e5e5e5e5
The signal is caused by a READ memory access.
#0-#3 <unknown module> <- baseline JIT code
#4 EnterJit / MaybeEnterJit <- js/src/jit/Jit.cpp
#10 js::jit::DoCallFallback <- BaselineIC.cpp (the stale IC chain)
rdi = 0xe5e5e5e5e5e5e5e5 <- the freed ICScript
デリファレンスは古いスタブチェーンを辿るbaseline JITコード内で発生する: 再利用されたセルの制御 = baselineが信頼するICEntry/スタブフィールドの制御、 そこにはジャンプ先のスタブコードポインタも含まれる。
orphaned ICScript (this PoC)
-> compacting GC moves it; stale chain keeps old address
-> reclaim the old cell with controlled bytes (size-class spray)
-> baseline reads fake ICEntry -> fake ICStub -> fake code_ pointer
-> jump into the WASM JIT page shellcode (f64.const immediates,
FuncExport entry-offset overwrite — see the 2024-29943 repo)
完全な武器化ログは research/README.md を参照。
現状のまとめ:
TrailingArray) ICScriptに対するuse-after-move
である — 原理的にはサイズクラス別バッファによるスプレー再利用が可能。new Ctor(flag) 呼び出しの内部でマイクロ秒しか
離れておらず、その間にJSコールバックポイントは存在しない; 素朴なスプレーは
ウィンドウを逃すか (reclaim1/2)、zeal GCストームでIC状態をかき乱して
しまう (reclaim3)。古いチェーンは単一の通常の gc() は生き延びる
(purge_check)。WASMステージ自体は既に構築され、 CVE-2024-29943-but-with-wasm で実証済みである; このFF149時代のビルド向けにオブジェクトモデルの オフセットを再導出するだけでよい。
poc.js — Mozillaのリグレッションテスト (bug 2013583)、上記のとおり
2026-01-15のASAN jsshellをクラッシュさせることが検証済み。457b68097f81