Любим на хакерите език е опасно уязвим

Уязвимост засяга стандартните библиотеки на някои езици за програмиране
(снимка: CC0 Public Domain)

Откриха зейнала дупка в сигурността на любимия език за програмиране на хакерите – Rust. Критичната уязвимост позволява на атакуващите да изпълнят произволен код, когато програма, написана на Rust, изпълнява скрипт на Windows, ако аргументите са предадени без избягване на специални знаци.

Всъщност, критичната уязвимост е открита в стандартните библиотеки на редица популярни езици за програмиране, включително Rust, и застрашава компютри под управление на операционна система Windows, съобщи Bleeping Computer.

В случая с Rust, уязвимостта, наречена BatBadBut, е идентифицирана като CVE-2024-24576, а GitHub ѝ е присвоил критично ниво на опасност – 10 от 10 точки по скалата на CVSS. Проблемът е открит от изследовател по сигурността с псевдоним RyotaK от японската компания Flatt Security.

Пропуск в стандартната библиотека позволява, при определени условия, на атакуващия да инжектира команда за изпълнение на собствен код на машина с уязвимо приложение, без взаимодействие с потребителя, включително дистанционно. Това може да бъде или клиентска програма, или бекенд уеб-приложение, работещо от страната на сървъра.

Както посочва RyotaK, повечето съществуващи приложения не са засегнати от тази уязвимост, тъй като за успешна атака трябва да бъдат изпълнени редица специфични условия. За нападателя е важно програмният код да съдържа извикване на някаква команда на операционната система с дефинирани от потребителя аргументи – за предпочитане Windows скрипт с разширение bat или cmd. В противен случай опасността да станете жертва на тази уязвимост е почти нулева.

Корените на проблема

Предпоставка за уязвимостта е неочевидното поведение на системна функция на Windows, наречена CreateProcess, която се използва за създаване на нов процес въз основа на програма, съхранявана на диска. Тази функция използва интерпретатора на команди на Windows за изпълнение на пакетни (bat или cmd) файлове, тъй като операционната система на Microsoft не може да изпълнява по друг начин такива скриптове.

Само по себе си това поведение на функцията не представлява проблем, но стандартните библиотеки на много езици за програмиране често съдържат “обвиваща” функция над CreateProcess с вграден механизъм за екраниране на специални символи, който се прилага всеки път, когато се изпълнява функцията.

Стандартната библиотека на Rust е представена от функциите Command::arg и Command::args, които според документацията са предназначени да предават аргументи на процес, без да бъдат обработвани от командния интерпретатор. Предполага се, че в този случай е безопасно да се валидира въведения от потребителя аргумент.

В Windows внедряването на такъв механизъм е по-сложно, отколкото в случая с други софтуерни платформи, тъй като операционната система Microsoft, когато създава нов процес с помощта на CreateProcess, предава всички придружаващи аргументи към него на един ред – това означава, че задачата за неговото раздробяване на съставни компоненти пада върху плещите на този процес.

Повечето програми за тези цели използват подход, подобен на този, предписан в езиковия стандарт C – всички аргументи при стартиране на приложение се поставят в argv масив, всеки елемент от който съдържа аргумент от командния ред, предаван на процеса от операционната система.

В изпълнимия файл cmd, който е необходим за изпълнение на пакетни файлове, се използва специална логика за разделяне на реда от аргументи, поради което разработчиците на стандартни библиотеки са принудени да прилагат специални манипулатори за екраниране, предавани от bat и cmd файлове, за защита срещу заместване на аргументи. Именно тези алгоритми в случая на Rust се оказаха несъвършени и до актуализация 1.77.2 можеха да пропускат някои специални знаци – по време на определени манипулации с двойни кавички – и по този начин да позволят изпълнението на произволен код.

Кои други езици са изложени на риск?

В допълнение към Rust, проблемът се наблюдава в стандартните библиотеки на Erlang, Go, Java, Python,Ruby, Haskell, Node.js и PHP. Разработчиците на последните три езика са подготвили пачове, които подобряват механизма за екраниране, за да се предпазят от заместване на аргументи.

Други проекти, с изключение на Java, са допълнили документацията с информация за последствията от липсата на екраниране на специални знаци. Разработчиците на Java не планират да коригират уязвимостта, тъй като вероятно по подразбиране възлагат отговорността за екранирането на програмистите.

Любимият език на хакерите

По-рано американските власти призоваха разработчиците на софтуер да спрат да използват опасни C и C++ езици възможно най-скоро. Python се предлага като алтернатива, както и Rust, който е много популярен сред хакерите.

Rust често е предпочитаният инструмент за авторите на злонамерен софтуер и напоследък езикът набира все повече фенове сред легалните разработчици на софтуер с различна степен на умения. Това се доказва от резултатите от проучване, проведено от общността на Rust Foundation.

Но в класацията на популярността на езиците за програмиране на TIOBE в края на януари 2024 г. Rust заема едва 19-то място след Python, C, C++, Java, C#, JavaScript, PHP и дори Fortran.

Коментар