В стандартната библиотека на езика Rust беше открито уязвимост (CVE-2022-21658), свързана с конкуренция в функцията std::fs::remove_dir_all(). При използване на тази функция за изтриване на временни файлове в привилегировано приложение, злонамерен потребител може да предизвика изтриването на произволни системни файлове и директории, до които обикновено атакуващият няма достъп.
Уязвимостта е причинена от некоректна реализация на проверката на символични връзки преди рекурсивното изтриване на директории. Вместо да забрани следването на символични връзки, функцията remove_dir_all() първо проверява дали файлът е символична връзка. Ако е определена връзка, тя се изтрива като файл, а ако е директория — се извиква операцията за рекурсивно изтриване на съдържанието. Проблемът е, че между проверката и началото на операцията за изтриване има малко закъснение.
В момента, когато проверката вече е проведена, но операцията за обход на директориите за изтриване все още не е започнала, атакуващият може да подмени директорията с временни файлове с символична връзка. Ако попадне в точния момент, функцията remove_dir_all() ще обработи символичната връзка като директория и ще започне изтриването на съдържанието, на което сочи тази връзка. Въпреки че успехът на атаката зависи от точността на избраното време за замяна на директорията и вероятността да попадне в точния момент е малка, в хода на експериментите изследователите успяха да постигнат повторяем успешен опит след изпълнението на експлойта в рамките на няколко секунди.
Уязвимости са засегнати всички версии на Rust от 1.0.0 до 1.58.0 включително. Проблемът е бил временно решен под формата на патч (корекцията ще бъде включена в версия 1.58.1, която се очаква в следващите няколко часа). Следенето на отстраняването на уязвимостта в дистрибутивите може да се осъществи на следните страници: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch, FreeBSD. На всички потребители на програми на езика Rust, изпълнявани с повишени привилегии и използващи функцията remove_dir_all, се препоръчва спешно да актуализират Rust до версия 1.58.1. Интересно е, че публикуваният патч решава проблема не на всички системи, например, в операционната система REDOX и версиите на macOS до 10.10 (Yosemite) уязвимостта не се блокира поради липсата на флага O_NOFOLLOW, който деактивира следването на символични връзки.
Източник: opennet.ru
