Vulnerabilność BatBadBut, dotycząca standardowych bibliotek różnych języków programowania

Aplikacje uruchamiające skrypty w formacie bat i cmd na platformie Windows korzystające z wbudowanych funkcji uruchamiania procesów, są podatne na lukę, która pozwala na wykonanie własnego kodu w przypadku przekazywania argumentów bez osobnego zabezpieczenia znaków specjalnych. Luka ta została oznaczona nazwą kodową BatBadBut i występuje w aplikacjach wykorzystujących standardowe biblioteki języków takich jak Rust, PHP, Node.js, Python, Ruby, Go, Erlang i Haskell.

Problem został oznaczony jako luka, ponieważ dotyczy funkcji biblioteki, takich jak Command::arg i Command::args w Rust, które są przeznaczone do bezpośredniego przekazywania argumentów do procesu, bez ich przetwarzania przez interpreter poleceń. Zakłada się, że programista aplikacji może nie sprawdzać argumentów, ponieważ są one bezpośrednio przekazywane do uruchamianego procesu. W systemach Unix argumenty są przekazywane do procesu osobno w tablicy, podczas gdy w Windows przy użyciu interfejsu API CreateProcess argumenty są przekazywane jako jeden ciąg, którego analiza spoczywa na uruchamianym procesie.

Podczas uruchamiania skryptów bat i cmd na platformie Windows funkcja CreateProcess() automatycznie uruchamia plik wykonywalny cmd.exe, nawet jeśli aplikacja go nie wskazuje przy wywołaniu. Program cmd.exe zawiera swoją własną skomplikowaną logikę rozdzielania argumentów, aby oddzielić argumenty własne, uruchamianego skryptu i argumenty tego skryptu. Aby zabezpieczyć platformę Windows przed podstawianiem argumentów, standardowe biblioteki języków programowania stosują oddzielne mechanizmy zabezpieczające, które, jak się okazało, można obejść, manipulując podwójnymi cudzysłowami.

Na przykład, w programie wywołującym skrypt ‘./test.bat’ z argumentem opartym na danych od użytkownika, atakujący może przekazać wartość ‘»&calc.exe’, która podczas uruchamiania skryptu zostanie rozwinięta do ciągu ‘C:\Windows\System32\cmd.exe /c .\test.bat «»&calc.exe»‘ i spowoduje uruchomienie procesu calc.exe. Metoda ta działa również w przypadku niejawnego uruchamiania skryptów, kiedy uruchamiany jest plik wykonywalny o nazwie „test” bez podania rozszerzenia, a w jednym z katalogów wymienionych w zmiennej środowiskowej PATH znajduje się plik „test.bat.”

Obecnie wydano poprawkę (CVE-2024-24576) dla standardowej biblioteki języka Rust, która znalazła się w aktualizacji Rust 1.77.2. W przygotowaniu są aktualizacje eliminujące lukę dla Node.js i PHP (tagi 8.2.18 i 8.3.5 już zostały wystawione, ale wydania nie zostały jeszcze ogłoszone). Projekty Python, Ruby, Go, Erlang i Haskell na razie ograniczyły się do dodania ostrzeżenia o istnieniu luki w dokumentacji, w przypadku braku odpowiedniego ekranowania znaków specjalnych.

W Rust 1.77.2 do standardowej biblioteki dodano dodatkowe sprawdzenie, które zwraca błąd w przypadku obecności znaków specjalnych w argumencie uruchamianego skryptu, których nie można gwarantować, że będą bezpiecznie ekranowane. Dla programistów, którzy samodzielnie implementują logikę ekranowania, udostępniono metodę CommandExt::raw_arg, która całkowicie wyłącza ekranowanie po stronie wywołań bibliotecznych.

Wprowadzenie ochrony utrudnia to, że proste ekranowanie cudzysłowów nie wystarcza, ponieważ interpreter poleceń przetwarza i ujawnia zmienne, takie jak „%PATH%”. Na przykład cudzysłów można wprowadzić poprzez manipulację zmienną środowiskową „%CMDCMDLINE%”, podając zamiast ‘"&calc.exe’ — ‘%CMDCMDLINE:~-1%&calc.exe’.

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster