В стандартной библиотеке языка программирования Rust обнаружена уязвимость, позволяющая выполнять вредоносный код в Windows.
CVE-2024-24576(оценка CVSS: 10) связана с ошибкой механизма передачи команд и аргументов ОС, что позволяет аутентифицированному злоумышленнику удаленно выполнять вредоносный код без взаимодействия с пользователем. Атака обладает низкой сложностью исполнения.
Группа по реагированию на угрозы безопасности Rust была уведомлена о том, стандартная библиотека Rust не может должным образом экранировать аргументы при вызове пакетных файлов (с расширениями bat и cmd) в Windows с помощью Command API.
Киберпреступник, контролирующий аргументы запущенного процесса, может выполнять произвольные команды в оболочке, обходя экранирование. Критическое значение уязвимости отмечается при вызове файлов пакетной обработки на Windows с ненадежными аргументами. Другие платформы или случаи использования не подвержены риску.
Проблема затрагивает все версии Rust до 1.77.2 на Windows, если код программы или одна из ее зависимостей вызывает и выполняет файлы пакетной обработки с ненадежными аргументами.
Команда безопасности Rust столкнулась с проблемой сложности cmd.exe и не смогла найти решение, корректно экранирующее аргументы во всех случаях. В результате была улучшена надежность кода экранирования и изменен Command API. Если Command API не может безопасно экранировать аргумент при создании процесса, возвращается ошибка InvalidInput.
Инженер из Flatt Security, Рётак, который обнаружил уязвимость и назвал ее BatBadBut, отмечает, что она также затрагивает и другие языки программирования. Однако не для всех из них выпущены исправления.
- Erlang (обновление документации);
- Go (обновление документации);
- Haskell (доступно исправление);
- Java (не исправлено);
- Node.js (исправление скоро будет доступно);
- PHP (исправление скоро будет доступно);
- Python (обновление документации);
- Ruby (обновление документации).
Рётак рекомендует для предотвращения непредвиденного выполнения пакетных файлов переместить их в каталог, который не включен в переменную среды PATH. Это поможет избежать их выполнения без указания полного пути.