FirefoxのWebAssembly実装に深刻な脆弱性(CVE-2025-13016)

セキュリティニュース

投稿日時: 更新日時:

FirefoxのWebAssembly実装に深刻な脆弱性(CVE-2025-13016)

FirefoxのWebAssembly(Wasm)エンジンに、任意コード実行につながる深刻なメモリ破壊 脆弱性 CVE-2025-13016 が見つかり、修正版が公開されています。
影響を受けるのは、Firefox 143〜145初期の通常版および Firefox ESR 140.4 以前で、推定 1億8,000万以上の月間アクティブユーザー が影響を受けていた可能性があります。

この脆弱性はCVSS 3.1で 7.5(High) と評価されており、悪意あるWebサイトを閲覧しただけで、条件が揃えば攻撃者にブラウザプロセス内で任意コードを実行されるリスクがありました。現在は Firefox 145 / ESR 140.5 以降で修正済みです。

脆弱性の対象バージョン

  • Firefox 通常版:143〜145(修正前ビルド)

  • Firefox ESR:140.0〜140.4

Wasm GCを搭載している主要プラットフォーム(Windows / macOS / Linux / Android)がすべて対象であり、企業環境のLinux端末・VDI・モバイル端末も含めて広い範囲で影響し得ます。

対策バージョン

  • 修正済みの Firefox 145 以降

  • 修正済みの Firefox ESR 140.5 以降

脆弱性の正体:1行のポインタ演算ミスから生じたスタックバッファオーバーフロー

問題のコードは、FirefoxのWasm GC(ガーベジコレクション)実装の一部である StableWasmArrayObjectElements テンプレートクラスに存在していました。これは、WebAssembly配列のデータを一時的に「安定した領域」にコピーするためのヘルパークラスです。

簡単に言うと、次の2つの不具合が重なって、スタック上のバッファを越えて書き込んでしまう 状態になっていました。

  1. ポインタ型を誤ったまま std::copy を使っていた

    • 元のコードでは、inlineStorage() が返す uint8_t* を起点に、numElements_ * sizeof(T) という「バイト数」で終端を計算していました。

    • しかしテンプレート引数 Tuint16_t のとき、std::copy は「要素数」としてこの値を解釈してしまい、本来の2倍のデータ をコピーしようとします。

    • その結果、スタック上に確保したベクタの領域をオーバーランし、メモリ破壊が発生します。

  2. コピー元のポインタ自体も誤っていた

    • inlineStorage() は、実際の配列データの前にあるヘッダ(メタデータ)を含む領域の先頭を指していました。

    • 正しくは、データヘッダをスキップした位置を返す addressOfInlineData() 相当のポインタを使うべきところを誤っており、配列の中身ではなくメタデータを含む領域からコピー していたことも判明しました。

この2点により、GC中にWasm配列をコピーする処理でスタックバッファオーバーフローが発生し得る状態となっていました。

参照

A High-Severity WebAssembly Boundary Condition Vulnerability in Firefox: CVE-2025-13016