Wasmtime aarch64でサンドボックス脱出、修正版あり
WebAssembly 実行環境 Wasmtime の aarch64 版で、細工された Wasm モジュールがサンドボックスを抜け出せる可能性がある脆弱性が公表されました。外部から受け取った Wasm を aarch64 上で実行している組織が対象で、36.0.19、48.0.7、49.0.4 のいずれかへの更新が必要です。実際の攻撃での悪用が確認されたという情報は、現時点では見当たりません。
急ぎ度: 早めに
CVSS 9.9 の重大な弱点ですが、悪用の確認は公表されておらず、対象も aarch64 で Wasm を実行する環境に限られるため、該当する環境では早期の更新が必要です。
関係があるか
aarch64(Arm 64 ビット)上で、標準の Cranelift バックエンドを使って Wasmtime を動かし、第三者が作った Wasm モジュールを実行している環境が対象です。プラグイン基盤やエッジ、サーバーレスのように、利用者が持ち込んだコードを実行する基盤は特に注意が必要です。
| 製品 | 影響を受ける版 | 直った版 |
|---|---|---|
| Wasmtime 36.x 系列 | 36.0.19 より前 | 36.0.19 |
| Wasmtime 48.x 系列 | 48.0.7 より前 | 48.0.7 |
| Wasmtime 49.x 系列 | 49.0.4 より前 | 49.0.4 |
確かめ方
- 1Wasmtime を直接使っているかを確認します。CLI の版は
wasmtime --versionで分かります。 - 2Rust のプロジェクトでは、
cargo tree -i wasmtimeやCargo.lockで、依存関係の中に wasmtime が含まれていないかを確認します。 - 3実行環境が aarch64 かどうかを
uname -mで確認します。aarch64またはarm64と表示されれば対象のアーキテクチャです。AWS Graviton や Arm 系のコンテナ基盤、Apple シリコン上のサーバー用途なども含まれます。 - 4Wasmtime を組み込んだ製品やライブラリを使っている場合は、内部の Wasmtime の版を提供元に問い合わせるか、提供元の告知を確認します。
何が起きたか
Wasmtime は、WebAssembly(Wasm)という形式のプログラムを安全に動かすための実行環境です。Wasm は「閉じた箱」の中で動き、箱の外のメモリやファイルには勝手に触れない仕組みになっています。今回の弱点は、aarch64 版でこの箱を破れる可能性があるというものです。細工された Wasm モジュールを実行すると、本来入れないはずの場所のコードを実行される恐れがあります。
Wasmtime は、Wasm をそのまま解釈するのではなく、実行前に CPU 向けの機械語へ変換(コンパイル)します。この変換を担う標準の部品が Cranelift です。aarch64 向けの Cranelift には、Wasm の br_table 命令(多数の行き先から 1 つを選んで分岐する命令)の行き先がおよそ 256,000 件を超えると、条件分岐の飛び先を誤って生成する不具合がありました。
飛び先がずれると、実行中のコードが、モジュール作成者が調整できる位置にある別のコードへ分岐してしまいます。これによりサンドボックスの外へ出られるおそれがあります。弱点の分類は CWE-691(制御フローの管理の不備)です。修正は 36.0.19、48.0.7、49.0.4 で提供されています。
攻撃の流れ
-
1
細工した Wasm
攻撃者が、極めて多くの分岐先を持つ `br_table` を含む Wasm モジュールを用意します。
-
2
実行基盤に投入
そのモジュールが、aarch64 上の Wasmtime で実行される経路(アップロードやプラグイン登録など)に入ります。
-
3
誤った分岐を生成
Cranelift が機械語への変換時に、条件分岐の飛び先を誤って作ります。
-
4
別コードへ移動
実行時に、意図しない別のコードへ制御が移ります。
-
5
箱の外へ脱出
サンドボックスの制限を越え、ホスト側のプロセスの権限で動作する可能性があります。
どう悪用されるか
悪用には、Wasm モジュールを対象の Wasmtime に実行させる必要があります。CVSS のベクトルは、ネットワーク経由(AV:N)、低い権限(PR:L)、利用者の操作は不要(UI:N)、影響範囲が変化する(S:C)です。つまり、モジュールを投入できる程度の権限があれば、誰かにクリックや操作をさせる必要はありません。また、対象は aarch64 で標準の Cranelift バックエンドを使うエンジンです。
成功した場合、Wasm の箱の外にあるホスト側の情報の読み取りや改ざん、サービスの停止につながるおそれがあります。複数の利用者が同じホストを共有する基盤では、他の利用者のデータやホスト全体にまで影響が及ぶ可能性があります。
KEV(実際の攻撃での悪用が確認された脆弱性の一覧)への掲載や、EPSS(悪用される見込みの指標)は、現時点で確認できていません。実際の攻撃での悪用が確認されたという情報も公表されていません。
今すぐやること
-
1
Wasmtime の利用箇所を洗い出す
CLI、アプリへの組み込み、他の製品やライブラリ経由の利用を含めて棚卸しします。あわせて、動作するサーバーやコンテナのアーキテクチャが aarch64 かを確認します。
wasmtime --version -
2
修正版へ更新する
使っている系列に応じて、36.0.19、48.0.7、49.0.4 のいずれかへ上げます。Rust で組み込んでいる場合は依存の版を更新して再ビルドし、再デプロイまで行います。更新しただけで再ビルドしていないと、古いコードが動き続けます。
cargo tree -i wasmtime -
3
第三者の Wasm を受け入れる経路を優先する
利用者のアップロードやプラグインとして外部の Wasm を実行している基盤から先に更新します。社内で作った信頼できるモジュールだけを動かす環境は、その次で構いません。
-
4
組み込み製品は提供元の告知を確認する
Wasmtime を内部に含む製品やサービスを使っている場合は、提供元の対応状況や修正版の提供時期を確認します。
-
5
異常な Wasm の受け付けや実行を見直す
更新後も、受け付けるモジュールの出所の確認、実行時の権限の最小化、ホスト側プロセスの分離を見直します。サンドボックスが破られた場合でも被害を小さくできます。
すぐ更新できないとき
公式の回避策は公表されていません。更新までの暫定措置としては、aarch64 上で第三者の Wasm モジュールを受け入れる経路を一時的に止める、または信頼できる提供元のモジュールだけに限定する方法が考えられます。これは根本的な対策ではないため、修正版への更新を優先してください。
背景
Wasmtime は Bytecode Alliance が開発する WebAssembly の実行環境で、アプリへの組み込み用途や、プラグイン機構、エッジやサーバーレスの基盤などで使われています。外部の人が書いたコードを、安全な箱の中で動かす役割を担うため、箱の強度がそのまま基盤全体の安全性につながります。
Wasm を実行前に機械語へ変換する方式は、速く動かせる一方で、変換器(コンパイラ)の不具合が箱の突破に直結しやすい性質があります。JIT コンパイラを持つ言語処理系やブラウザでも、変換の誤りが実行時の脆弱性につながった例は広く知られています。今回の問題も、コード生成の誤りが原因という点でその系統にあたります。
よくある質問
Q.x86_64 のサーバーで Wasmtime を使っていますが、更新は必要ですか。
Q.自社で作った Wasm しか動かしていない場合も危険ですか。
Q.すでに攻撃は起きていますか。
まだ分かっていないこと
- 実際の攻撃での悪用や、具体的な被害の有無は公表されていません。
- 修正版が提供されている 36.x、48.x、49.x 以外の系列の扱いは、ここでは明らかになっていません。使っている系列がこれらに当てはまらない場合は、公式の告知で対応状況を確認してください。
- Wasmtime を組み込んだ各社製品が影響を受けるかどうかは、それぞれの提供元の発表待ちです。
この記事は、取得元の公開情報をもとに生成 AI で作成しています。誤りを含むことがあります。対応を決める前に、下の原文と参照先を確認してください。
影響パッケージ
| 種類 | パッケージ | 影響を受ける版 | 直った版 |
|---|---|---|---|
| bytecodealliance | wasmtime | — | — |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
Wasmtime is a runtime for WebAssembly. Prior to 36.0.19, 48.0.7, and 49.0.4, the Cranelift compiler backend on aarch64 can compile a Wasm br_table instruction with more than approximately 256,000 targets so that it has an incorrect conditional branch target. The branch can then jump to arbitrary other code at a user-controlled offset, allowing a user-controlled Wasm module to escape the sandbox on aarch64 engines using the default Cranelift backend. This issue is fixed in versions 36.0.19, 48.0.7, and 49.0.4.
出典: CVE.org (CVE Program・cvelistV5) NVD
参照URL
- web security-advisories@github.com
- web security-advisories@github.com
- web security-advisories@github.com
- web security-advisories@github.com
- web security-advisories@github.com
- web security-advisories@github.com
- web security-advisories@github.com
- web security-advisories@github.com
- web security-advisories@github.com
- web security-advisories@github.com
- web security-advisories@github.com
- web security-advisories@github.com