凝った再現ではありません。ベースラインには多少の調整が必要でした。
Mozillaはこの問題をWebAssemblyのuse-after-freeと説明しています。公開された修正
9823b5c86ffaは、トラップを発生させるwasm::CodeをJitActivation内で確実に生存させ続けます。
このテストは、不正なシグネチャを持つクロスインスタンス末尾呼び出しを実行します。Debuggerのアンワインドフックがテーブルの最後のターゲット参照をクリアし、エンジンがトラップを処理している間に縮小GCを強制します。末尾呼び出しに入る前に、Wasmはマーカーを出力する通常のJavaScriptインポートを呼び出します。
9b564f641a42: ステータス139(SIGSEGV)。9823b5c86ffa: PASS: trap handled after target releaseを出力し、終了コード0で終了します。poc-controlled.jsは、ターゲットの共有スタブ割り当てを144個のインポートで拡張します。その古いthrow継続は、4つの実行可能ページのうちの1つに着地します。事前に作成された遅延ティアキャリアは、4ページの最適化コードセグメントに6,000個の一意なSIMD定数を埋め込みます。例外アンワインド中に、GCがターゲットを解放し、同期ティアリングがその穴を再利用します。64バイトごとのsyscallランウェイがを出力し、を呼び出します。
UAF NACHOSexit_group(0)実行:
js --wasm-compiler=baseline+ion \
--setpref=wasm_lazy_tiering_level=9 \
--setpref=wasm_lazy_tiering_synchronous=true \
--more-compartments poc-controlled.js
ソースからビルドしたLinux x86-64修正前シェルでの観測された信頼性: 3/3回の実行でマーカーが出力され、終了コード0で終了しました。対応する修正済みシェルは通常のRuntimeError: indirect call signature mismatchを発生させ、マーカーは出力されません。
制御されたPoCは、シェル専用のDebuggerおよびGC関数を使用して、レースを決定的にします。これはjsshell内でネイティブな制御を確立するものであり、Webページからの配信やFirefoxコンテンツサンドボックスからのエスケープではありません。
同等のデバッグシェルで実行:
js --wasm-compiler=baseline --more-compartments poc.js
これはライフタイム回帰の証拠であり、メモリプリミティブやエクスプロイトではありません。マーカーは両方のビルドで出現し、UAFに起因するものではありません。