CVE-2024-24576
Rustのstd::process::Commandは、Windows上でバッチファイルの引数を適切にエスケープしていませんでした
- 公開済み
- 2024/04/09
- 更新済み
- 2025/11/04
- CNA の割り当て
- GitHub_M
- 観察された証拠
- 2026/08/08
プライマリ CVSS
nvd · CVSS 3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H中 · 今後 30 日間
- パーセンタイル
- 97.4%
- モデルの日付
- 2026/09/21
EPSS は統計的な推定値であり、確実性や影響の尺度ではありません。 CVSS、KEV ステータス、暴露、環境と組み合わせます。
概要
Rustはプログラミング言語です。Rust Security Response WGは、バージョン1.77.2より前のRust標準ライブラリが、Windows上で `Command` を使用してバッチファイル(`bat` および `cmd` 拡張子)を起動する際に、引数を適切にエスケープしていなかったことを通知されました。起動されたプロセスに渡される引数を制御できる攻撃者は、エスケープを迂回して任意のシェルコマンドを実行できました。この脆弱性の重大度は、Windowsで信頼できない引数を使ってバッチファイルを起動するユーザーにとって重大です。他のプラットフォームや用途には影響しません。`Command::arg` および `Command::args` APIは、そのドキュメントで、引数はその内容に関係なく起動されたプロセスにそのまま渡され、シェルによって評価されることはないと述べています。つまり、信頼できない入力を引数として渡しても安全であるはずです。Windowsでは、Windows APIが起動されたプロセスにすべての引数を含む単一の文字列しか提供せず、それらの分割は起動されたプロセス次第であるため、この実装は他のプラットフォームより複雑です。ほとんどのプログラムは標準Cランタイムのargvを使用しており、実際には引数の分割方法はほぼ一貫しています。ただし、例外の1つは `cmd.exe`(バッチファイルの実行などに使用される)で、独自の引数分割ロジックを持っています。そのため、標準ライブラリはバッチファイルに渡される引数に対して独自のエスケープを実装する必要があります。残念ながら、私たちのエスケープロジックは十分に徹底されておらず、任意のシェル実行につながる悪意のある引数を渡すことが可能であると報告されました。`cmd.exe` の複雑さのため、すべてのケースで引数を正しくエスケープする解決策は見つかりませんでした。APIの保証を維持するため、私たちはエスケープコードの堅牢性を改善し、引数を安全にエスケープできない場合に `InvalidInput` エラーを返すように `Command` APIを変更しました。このエラーはプロセスの起動時に発生します。修正はRust 1.77.2に含まれています。バッチファイル用の新しいエスケープロジックは安全側に倒れており、有効な引数を拒否する可能性があることに注意してください。自分でエスケープを実装する場合や、Windowsで信頼できる入力のみを扱う場合は、`CommandExt::raw_arg` メソッドを使用して標準ライブラリのエスケープロジックをバイパスすることもできます。
ソース
7Windows上のRustにおけるCVE-2024-24576コマンドインジェクション脆弱性の概念実証。Juliaで実装。
CVE-2024-24576 概念実証
責任ある使用
脆弱性情報は、自分が所有しているシステム、またはテストを許可されているシステムでのみ使用してください。 Kitploit は公開研究メタデータにリンクしており、エクスプロイト コードや悪意のあるペイロードは保存しません。