ステータス: 分析完了 + 検証済み PoC。プリミティブの武器化を進行中。
今回は2026年のバグに基づく WasmBlazeFox スタイルのチェーン: CVE-2026-2764、 JavaScript Engine: JIT コンポーネントにおける IonMonkey/baseline の「JIT 誤コンパイル + use-after-free」。 Firefox 148 で修正済み (MFSA 2026-13、CVSS 未定)。 CVE-2024-29943-but-with-wasm と 同じ結末: プリミティブをシェルコード定数で埋め尽くされた WASM JIT ページに送り込む。
Bugzilla の bug 2012608 は公開制限付きだが、修正は公開されている:
hg 1b58f51668d3 — "Bug 2012608: Call CreateThis directly from PBL":
PortableBaselineInterpret.cpp は、スクリプト化されたコンストラクタの
this 生成を CreateThisFromIC(IC 状態を再読み取りする)経由で行うのをやめ、
適切にルート化された値を使って js::CreateThis を直接呼び出すようになった。hg 3adad00d0042 — BaselineCacheIRCompiler.cpp の
createThis 契約に関するフォーマット/ドキュメント修正(argc にスプレッド引数を含める必要がある)。hg 57885d520e85 — 回帰テスト(当社の PoC)。障害モード: new Ctor(...arr) / Reflect.construct で newTarget が Proxy の場合、
プロキシの get トラップは、エンジンが引数のスプレッドと this の生成の間にあるときに
実行される。そのコールバックは、エンジンがスプレッドしているまさにその配列を
変更または解放でき、エンジンは古い前提を保持したまま続行する:
arr[0] がスプレッドスナップショット後に int から object へすり替えられる
(poc-typeconfusion.js)arr.length = 0; gc() がスプレッド途中で要素ストアを解放する
(poc-uaf.js)2026-02-09 の mozilla-central nightly jsshell(JavaScript-C149.0a1、
linux x86-64、修正前)に対して、x86_64 Docker コンテナ内で実施:
./js poc-typeconfusion.js -> Error: Assertion failed: got "oops", expected 1
./js poc-uaf.js -> Segmentation fault
両方の PoC は Mozilla 自身の回帰テストをそのまま使用している。
poc-typeconfusion.js (制御可能な引数値の混乱、クラッシュなし)
-> スプレッド引数に対して焼き込み型前提を行うコンストラクタを Ion 最適化する。
int32 が証明された箇所にオブジェクトをすり替える
-> addrof / fakeobj
-> TypedArray の length を破壊 -> 任意 R/W
-> WASM JIT シェルコードステージ (CVE-2024-29943-but-with-wasm と同じ:
f64.const 即値、FuncExport エントリオフセットの上書き)
WASM ステージとオフセット探索コードは、FF149 世代ビルドに対して再導出する
オフセット以外はそのまま移植される(レシピは
CVE-2024-29943-but-with-wasm/test.gdb を参照)。
1b58f51668d3, 3adad00d0042, tests 57885d520e85