Уязвимостта BatBadBut, засягаща стандартните библиотеки на различни програмни езици

Приложения, които стартират скриптове в формат bat и cmd на платформата Windows с помощта на стандартни функции за стартиране на процеси, са податливи на уязвимост, която позволява изпълнението на собствен код при предаване на аргументи без отделно екрановане на специални символи. Уязвимостта получи кодово име BatBadBut и се проявява в приложения, използващи стандартни библиотеки на езици като Rust, PHP, Node.js, Python, Ruby, Go, Erlang и Haskell.

Проблемът е обозначен като уязвимост, тъй като засяга функции на библиотеката, като Command::arg и Command::args в Rust, предназначени за директно предаване на аргументи на процеса, без обработка от командния интерпретатор. Предполага се, че разработчикът на приложението може да не проверява аргументите, тъй като те се предават директно на стартирания процес. Ако в Unix-системите аргументите се предават на процеса поотделно в масив, то в Windows при използване на API CreateProcess аргументите се формулират в една строка, разборът на която пада на плещите на стартирания процес.

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

Например, в програма, която извиква скрипт ‘.\/test.bat’ с аргумент, базиран на предоставените от потребителя данни, атакуващият може да предаде стойността ‘»&calc.exe’, която при стартиране на скрипта ще се разгради в строката ‘C:\Windows\System32\cmd.exe \/c .\test.bat «»&calc.exe»‘ и ще доведе до стартиране на процеса calc.exe. Методът работи и при неявно стартиране на скриптове, когато се стартира изпълним файл с име «test» без указване на разширение, а в една от директориите, споменати в променливата на средата PATH, присъства файл «test.bat».

В момента е издадено поправка (CVE-2024-24576) за стандартната библиотека на езика Rust, която е включена в актуализацията Rust 1.77.2. В процес на подготовка са актуализации за премахване на уязвимостта за Node.js и PHP (тегла 8.2.18 и 8.3.5 вече са публикувани, но релизите все още не са обявени). Проектите Python, Ruby, Go, Erlang и Haskell засега само добавят предупреждения в документацията за проявлението на уязвимостта при липса на адекватно екрантиране на специални символи.

В Rust 1.77.2 в стандартната библиотека е добавена допълнителна проверка, която връща грешка, ако аргументът на изпълнявания скрипт съдържа специални символи, които не могат да бъдат безопасно екрантирани. За разработчиците, които сами реализират логиката на екрантиране, е предоставен методът CommandExt::raw_arg, който напълно деактивира екрантирането в библиотечните извиквания.

Допълнението на защитата е затруднено от факта, че просто екрантиране на двойни кавички не е достатъчно, тъй като командният интерпретатор обработва и разкрива променливи като «%PATH%». Например, кавичка може да се вмъкне чрез манипулация с променливата на средата «%CMDCMDLINE%», указвайки вместо ‘»&calc.exe’ — ‘%CMDCMDLINE:~-1%&calc.exe’.

Източник: opennet.ru

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster