概要
Google ChromeのWebAssemblyエンジンに影響を与えるリモートコード実行(RCE)の脆弱性に関する技術詳細と、完全に機能するエクスプロイトが公に開示されました。この脆弱性は、TyphoonPWN 2025で発見・報告されたもので、WebAssemblyにおけるインデックス付き参照型の正規化ロジックの回帰と、JavaScript Promise Integration(JSPI)を介した新たなサンドボックスバイパスが関与しています。
脆弱性の詳細
SSD Secure Disclosureの研究者たちは、nullabilityの混同バグと洗練された誕生日攻撃ベースのハッシュ衝突技術を組み合わせることで、V8サンドボックス内で任意の読み書きプリミティブを獲得し、最終的にネイティブコードを実行できることを実証しました。この発見は、Chrome RCEカテゴリで1位を獲得したSeunghyun Lee氏(0x10n)によるものです。
根本原因は、コミット44171ac(Chrome M135)で導入された回帰にあります。ここでCanonicalEqualityEqualValueType
が、インデックス付き参照型(ref t0
とref null t0
)のnullabilityを考慮しなかったため、nullabilityのみが異なる2つのWebAssembly型グループが同じ内部表現に正規化されてしまいました。これにより、攻撃者はMurmurHash64Aに対する誕生日攻撃を介してハッシュ衝突を生成することが可能になります。
衝突する2つの参照型が作成されると、再キャストプリミティブがnullチェックを効果的に削除し、メモリ内で「ケージ化された」読み書き機能につながります。
同時に、コミットd4700da(Chrome M137)で導入されたJSPIスタックスイッチングバグも悪用されます。エクスプロイトは、ネストされたセカンダリスタックチェーンを操作することで、非アクティブなフレームをスキップし、中断されたスタックの内容を上書きして、攻撃者が制御する値で中央のJSスタックの制御を取り戻します。このコンポーネントは、従来のPartitionAlloc攻撃に依存することなく、完全な任意のコード実行を可能にします。
悪用メカニズム
エクスプロイトは以下のメカニズムで動作します。
- ハッシュ衝突の生成: WebAssemblyモジュールビルダーを使用して、攻撃者はnullabilityの異なる2つの再帰型グループ(t1null、t1nonnull)を定義します。2^32回の試行による誕生日攻撃により、数秒で候補となる衝突が生成され、nullabilityの違いが隠蔽されます。
- Nullから非Nullへのキャスト: 衝突により、null参照を非null参照として再キャストすることが可能になり、暗黙のガードページ保護が解除され、制御されたオブジェクトが生のメモリを読み書きできるようになります。
- ケージ化された読み書きプリミティブ: 制御されたオブジェクトを大きなWasmArrayにマッピングすることで、エクスプロイトはサンドボックスメモリケージ内で任意のオフセット読み書きプリミティブ(addrofおよびfakeobj)を取得します。
- JSPIサンドボックスバイパス: 作成されたペイロードは、ネストされた
WebAssembly.promising
呼び出しをトリガーします。不正なスタックアンワインドステップは、中断されたフレームをスキップし、直接スタック制御を付与します。ROPチェーンをスプレーした後、エクスプロイトはVirtualProtectシェルコードスタブにピボットし、任意のネイティブコマンド(例:calc.exeの起動)を実行します。 - 配信: 完全に組み立てられた
exp.html
とWebAssemblyモジュールは、ローカルHTTPサーバーを介して提供されます。--no-sandbox
フラグ付きでChromeを起動し、ページにアクセスすると、即座にコードが実行されます。
この脆弱性は、適切なnull等価性チェックがないM135からM137までのすべてのChrome安定版ビルド、およびJSPIバイパスについてはM137以降に影響を与えます。Googleは、欠陥のある正規化ロジックを元に戻し、JSPIでより厳格なスタック状態チェックを強制する緊急パッチをリリースしました。
推奨事項
ユーザーは以下の対策を講じる必要があります。
- 即時アップデート: 2025年10月以降の最新のChromeアップデートを適用してください。これには、null等価性の修正と強化されたJSPIチェックが含まれています。
--no-sandbox
の使用を避ける: デバッグのために絶対に必要な場合を除き、--no-sandbox
フラグ付きでChromeを実行しないでください。- 多層防御: 異常なWebAssemblyの使用や予期せぬプロセス動作を監視するエンドポイント保護ソリューションを導入してください。
- WebAssemblyの使用状況を監査する: アプリケーション内のWebAssemblyモジュールで、信頼できないコード実行パスがないか確認してください。
元記事: https://gbhackers.com/technical-details-and-exploit-released-for-chrome-flaw/