Aplikacije koje pokreću skripte u bat i cmd formatu na Windows platformi koristeći ugrađene funkcije za pokretanje procesa, izložene su ranjivosti koja omogućava izvršavanje vlastitog koda prilikom prosljeđivanja argumenata bez posebno ekringoanih većih simbola. Ranjivost nosi kodno ime BatBadBut i pojavljuje se u aplikacijama koje koriste standardne biblioteke jezika poput Rust, PHP, Node.js, Python, Ruby, Go, Erlang i Haskell.
Problem je označen kao ranjivost jer se tiče funkcija biblioteke kao što su Command::arg i Command::args u Rustu, koje su dizajnirane za izravno prosljeđivanje argumenata procesu bez obrade od strane komandnog interpreter. Podrazumijeva se da programer aplikacije može ne provjeravati argumenata, jer se oni izravno prosljeđuju pokretanom procesu. Dok se u Unix sustavima argumenti prosljeđuju procesu kao odvojeni elementi u nizu, u Windowsu, koristeći API CreateProcess, argumenti se predstavljaju kao jedan niz, a njihovo razbijanje pada na teret pokretanog procesa.
Prilikom pokretanja bat i cmd skripti na Windows platformi, funkcija CreateProcess() neizravno poziva izvršni datotek cmd.exe, čak i ako aplikacija to ne navodi prilikom pozivanja. Program cmd.exe ima svoju složenu logiku razdvajanja argumenata kako bi odvojio vlastite argumente od argumenata pokretane skripte. Za zaštitu od zamjene argumenata na Windows platformi, standardne biblioteke programskih jezika koriste posebne obrade za ekringoanje, koje su se, kako se pokazalo, mogle zaobići manipulacijom s dvostrukim navodnicima.
Na primjer, u programu koji poziva skriptu ‘./test.bat’ s argumentom koji se temelji na korisničkim podacima, napadač može proslijediti vrijednost ‘»&calc.exe’, koja će, prilikom pokretanja skripte, biti proširena u niz ‘C:\Windows\System32\cmd.exe /c .\test.bat «»&calc.exe’ i dovesti do pokretanja procesa calc.exe. Ova metoda djeluje i prilikom neizravnog pokretanja skripti, kada se izvršna datoteka s imenom ‘test’ pokreće bez ekstenzije, a u jednom od direktorija navedenih u varijabli okruženja PATH postoji datoteka ‘test.bat’.
Trenutno je ispravka već objavljena (CVE-2024-24576) za standardnu biblioteku jezika Rust i uključena je u ažuriranje Rust 1.77.2. U pripremi su ažuriranja za ispravljanje ranjivosti za Node.js i PHP (označeni su tagovi 8.2.18 i 8.3.5, ali izdavanja još nisu objavljena). Projekti Python, Ruby, Go, Erlang i Haskell za sada su se ograničili na dodavanje upozorenja u dokumentaciji o manifestaciji ranjivosti u nedostatku pravilnog isključivanja posebnih simbola.
U Rust 1.77.2 dodatna je provjera dodana u standardnu biblioteku koja vraća grešku prilikom postojanja posebnih simbola u argumentu pokretanja skripte, koje se ne može sigurno isključiti. Za programere koji sami implementiraju logiku isključivanja, dostupan je metod CommandExt::raw_arg, koji potpuno onemogućuje isključivanje na strani poziva biblioteka.
Dodavanju zaštite protivi se to što jednostavno isključivanje dvostrukih navodnika nije dovoljno, jer komandni interpreter obrađuje i otkriva varijable, kao što su «%PATH%». Na primjer, navodnik se može uvesti manipuliranjem sa varijablom okruženja «%CMDCMDLINE%», tako što se umjesto ‘»&calc.exe’ navede ‘%CMDCMDLINE:~-1%&calc.exe’.
Izvor: opennet.ru
