Wasmtime、サンドボックス脱出の恐れ 修正版あり
WebAssembly 実行基盤の Wasmtime で、コンパイラ部分(Cranelift)が大きな Wasm 関数を処理する際に内部の番号があふれ、誤ったコードが生成されて、サンドボックスの外に影響が及ぶおそれがあります。外部から受け取った Wasm を実行・コンパイルしているサービスは特に影響を受けやすい状況です。36.0.19 または 43.0.0 への更新を、利用状況の確認と合わせて進めてください。
急ぎ度: 早めに
CVSS 9.9 の重大な脆弱性で修正版も出ていますが、悪用が確認されたという情報は現時点で示されておらず、第三者の Wasm を実行する環境かどうかで優先度が大きく変わります。
関係があるか
Wasmtime を自社サービスやプラグイン基盤に組み込み、利用者や外部から受け取った Wasm モジュールを実行している組織が主な対象です。社内で作った信頼できる Wasm しか動かさない環境でも対象版であれば修正の対象ですが、緊急度は下がります。
| 製品 | 影響を受ける版 | 直った版 |
|---|---|---|
| wasmtime(Bytecode Alliance) | 36.0.19 より前の版、および 43.0.0 より前の版。デフォルトの Cranelift バックエンドを使う構成が対象で、アーキテクチャは問いません。 | 36.0.19、43.0.0 |
確かめ方
- 1Wasmtime のコマンドラインツールを使っている場合は、
wasmtime --versionで版を確認します。 - 2Rust プロジェクトに組み込んでいる場合は、
Cargo.lockのwasmtimeの版を確認します。cargo tree -i wasmtimeで、依存関係の中に含まれていないかも調べられます。 - 3Python、Go、.NET などの言語向けパッケージや、Wasm 実行機能を持つ製品の内部に Wasmtime が含まれていることがあります。利用中の製品のベンダー告知や依存関係の一覧で、Wasmtime が使われていないか確認してください。
- 4Wasm モジュールの出どころを確認します。利用者のアップロードや外部の配布物を実行しているなら、優先して対応する対象です。
何が起きたか
Wasmtime は WebAssembly(Wasm)を実行するためのランタイムです。Wasm は、隔離された安全な環境(サンドボックス)の中でプログラムを動かすことを前提とした仕組みです。今回の問題は、Wasmtime が Wasm をネイティブのコードに変換する部分で見つかりました。変換の途中で扱う内部の番号が、条件次第で桁あふれを起こし、別のものを指してしまいます。ロッカーの番号が桁あふれして、隣の人のロッカーを開けてしまう状況に近いと言えます。
技術的には、コンパイラバックエンドの Cranelift が SSA 値(中間表現上の値)の添字をビット詰めで保持しており、値の数が非常に多い大きな Wasm 関数、または細工された Wasm 関数では、リリースビルドでエラーにならずに桁あふれします。その結果、Cranelift が誤った IR の値を参照し、任意のミスコンパイル(誤った機械語の生成)や型の取り違えが起こります。分類は CWE-197(数値の切り捨て誤り)と CWE-843(型の取り違え)です。
このため、攻撃者が意図した動作が生じ、Wasm のサンドボックスを抜け出す可能性があるとされています。Cranelift がデフォルトで使われる構成であれば、CPU のアーキテクチャに関係なく影響を受けます。修正版は 36.0.19 と 43.0.0 です。
攻撃の流れ
-
1
細工した Wasm
非常に多くの値を持つ大きな Wasm 関数を含むモジュールが、Wasmtime に渡されます。
-
2
コンパイル
Cranelift が関数をコンパイルする際、内部の番号がリリースビルドで黙って桁あふれします。
-
3
誤った参照
Cranelift が本来とは別の IR の値を参照し、誤った機械語が生成されます。
-
4
動作の乱れ
型の取り違えなどにより、攻撃者の意図した動作が生じます。
-
5
境界を越える
結果として Wasm のサンドボックスを越えて、ホスト側に影響が及ぶおそれがあります。
どう悪用されるか
CVSS のベクターでは、ネットワーク経由(AV:N)、攻撃の難しさは低い(AC:L)、必要な権限は低い(PR:L)、利用者の操作は不要(UI:N)とされています。たとえば、Wasm モジュールのアップロード機能を持つサービスで一般利用者のアカウントを持っていれば、条件を満たす可能性があります。ただし、細工したモジュールをどの経路で Wasmtime に渡せるかは、各環境の作りで変わります。
悪用された場合、Wasm のサンドボックスが破られ、機密性・完全性・可用性のすべてに高い影響が出うると評価されています(スコープ変更あり、S:C)。同じホスト上の他の利用者のデータやプロセスへ影響が及ぶ可能性があるため、複数の利用者の Wasm を同じ基盤で動かすサービスでは、被害が広がりやすい構成です。
実際の攻撃で悪用されたという情報や、悪用される見込みを示す指標の値は、現時点で示されていません。
今すぐやること
-
1
Wasmtime の利用箇所を洗い出す
自社のサービス、社内ツール、依存ライブラリ、利用中の製品のうち、Wasmtime を直接または間接に使っているものを一覧にします。版も併せて記録します。
wasmtime --version -
2
外部の Wasm を実行している環境を優先する
利用者のアップロードや外部の配布物を実行・コンパイルしている環境は、最優先で更新します。社内の信頼できる Wasm だけを動かす環境は、その次の順番にします。
-
3
修正版へ更新して再ビルドする
36 系を使っている場合は 36.0.19 以降、それ以外は 43.0.0 以降へ更新します。Rust で組み込んでいる場合は依存関係を更新し、再ビルドして再デプロイします。37〜42 系を使っている場合の対応版は、公式アドバイザリで確認してください。
cargo tree -i wasmtime -
4
組み込み製品のベンダー告知を確認する
Wasmtime を内部に含む製品やパッケージを使っている場合は、ベンダーや配布元が修正版を出しているかを確認し、案内に従って更新します。
-
5
更新後に動作を確認する
更新後に、Wasm モジュールが従来どおりコンパイル・実行できることを確認します。変更の詳細は公式のリリースノートと修正の pull request で確認できます。
すぐ更新できないとき
公式な回避策は、現時点で示されていません。すぐに更新できない場合の暫定的なリスク低減策として、信頼できない Wasm モジュールの受け入れを止めるか、受け入れる相手を限定します。あわせて、Wasmtime を動かすプロセスを、コンテナや仮想マシンなどの別の隔離層で権限を絞って動かし、万一サンドボックスが破られても被害が広がりにくいようにします。これらは被害を抑える措置であり、脆弱性そのものを解消するものではありません。
背景
Wasmtime は Bytecode Alliance が開発する WebAssembly ランタイムです。サーバー側のプラグイン機構、エッジでのコード実行、複数の利用者のコードを同じ基盤で動かすサービスなどに組み込まれます。こうした用途では、Wasm のサンドボックスが、利用者のコードとホストを分ける境界の役目を担っています。Cranelift は、Wasm を実行時にネイティブコードへ変換するコード生成部分です。
JIT コンパイラなどコードを生成する部分の誤りは、生成された命令が意図とずれることで、メモリ安全性や型の前提を崩し、実行環境の隔離を破る原因になりえます。そのため、これまでもブラウザや各種ランタイムで繰り返し問題になってきました。今回も、コンパイラ内部の数値処理の誤りが、隔離の境界に影響しうる点が重要です。
よくある質問
Q.Wasm を使っていなければ関係ありませんか。
Q.自社が作った Wasm しか動かしていません。急ぐ必要はありますか。
Q.すでに悪用されていますか。
まだ分かっていないこと
- 37〜42 系の版が影響を受けるか、また修正版が出るかは、公表内容からは読み取れません。公式アドバイザリで確認が必要です。
- 実際の攻撃での悪用の有無や、悪用される見込みを示す数値は、現時点で明らかになっていません。
- Wasmtime を内部に含む他の製品での影響範囲は、公表されていません。各ベンダーの告知を確認してください。
この記事は、取得元の公開情報をもとに生成 AI で作成しています。誤りを含むことがあります。対応を決める前に、下の原文と参照先を確認してください。
影響パッケージ
| 種類 | パッケージ | 影響を受ける版 | 直った版 |
|---|---|---|---|
| bytecodealliance | wasmtime | — | — |
| rust | wasmtime |
43.0.0 未満 |
43.0.0 |
| crates.io | wasmtime |
0.0.0-0 以上 36.0.19 未満 37.0.0 以上 43.0.0 未満 |
36.0.19 43.0.0 |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
This is an entry in the RustSec database for the Wasmtime security advisory
located at
https://github.com/bytecodealliance/wasmtime/security/advisories/GHSA-897f-g5gm-fmxm
For more information see the GitHub-hosted security advisory.
出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory
参照URL
- advisory rustsec.org
- package github.com
- package crates.io
- 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 github.com