Vulnerabilitatea BatBadBut, care afectează bibliotecile standard ale diferitelor limbaje de programare

Aplicațiile care rulează scripturi în format bat și cmd pe platforma Windows utilizând funcțiile standard de lansare a proceselor sunt vulnerabile, permițând executarea codului propriu în cazul în care argumentele sunt transmise la lansare fără o escapare separată a caracterelor speciale. Vulnerabilitatea a primit numele de cod BatBadBut și se manifestă în aplicațiile care utilizează biblioteci standard ale unor limbaje, precum Rust, PHP, Node.js, Python, Ruby, Go, Erlang și Haskell.

Problema a fost marcată ca vulnerabilitate deoarece afectează funcții ale bibliotecii, cum ar fi Command::arg și Command::args în Rust, care sunt concepute pentru a transmite argumente direct procesului, fără a fi procesate de interpretul de comenzi. Se presupune că dezvoltatorul aplicației poate să nu verifice argumentele, deoarece acestea sunt transmise direct procesului lansat. În sistemele Unix, argumentele sunt transmise procesului separat într-un array, în timp ce în Windows, atunci când se utilizează API-ul CreateProcess, argumentele sunt prezentate sub formă de un singur șir, analiza revenind procesului lansat.

Când se lansează scripturi bat și cmd pe platforma Windows, funcția CreateProcess() implică implicit fișierul executabil cmd.exe, chiar dacă aplicația nu îl specifică la apel. Programul cmd.exe are o logică complexă proprie pentru delimitarea argumentelor, separând argumentele proprii, ale scriptului lansat, și argumentele acelui script. Pentru a proteja împotriva substituției argumentelor pe platforma Windows, bibliotecile standard ale limbajelor de programare aplică gestionatori separați de escapare, care, s-a constatat, pot fi ocoliți prin manipularea cu ghilimelele duble.

De exemplu, într-o aplicație care apelează scriptul ‘.\/test.bat’ cu un argument bazat pe datele primite de la utilizator, un atacator poate transmite valoarea ‘»&calc.exe’, care, la lansarea scriptului, va fi extinsă în șirul ‘C:\Windows\System32\cmd.exe \/c .\test.bat «»&calc.exe»‘ și va duce la lansarea procesului calc.exe. Metoda funcționează și în cazul lansării implicite a scripturilor, când se lansează un fișier executabil numit «test» fără a specifica extensia, iar într-unul dintre directoarele menționate în variabila de mediu PATH există un fișier «test.bat».

În prezent, a fost lansată o corecție (CVE-2024-24576) pentru biblioteca standard a limbajului Rust și a fost inclusă în actualizarea Rust 1.77.2. Actualizările pentru Node.js și PHP sunt în curs de pregătire (etichetele 8.2.18 și 8.3.5 au fost deja create, dar lansările nu au fost încă anunțate). Proiectele Python, Ruby, Go, Erlang și Haskell s-au limitat până acum la a adăuga în documentație un avertisment cu privire la manifestarea vulnerabilității în absența unei corecte escapări a caracterelor speciale.

În Rust 1.77.2, biblioteca standard a fost adăugată cu o verificare suplimentară care returnează o eroare dacă argumentul scriptului executabil conține caractere speciale care nu pot fi garantate că sunt procesate în siguranță. Pentru dezvoltatorii care implementează singuri logica de escapare, a fost furnizată metoda CommandExt::raw_arg, care dezactivează complet escaparea în apelurile bibliotecilor.

Adăugarea protecției este îngreunată de faptul că o simplă escapare a ghilimelelor nu este suficientă, deoarece interpretul de comenzi prelucrează și expune variabile precum „%PATH%”. De exemplu, ghilimeaua poate fi introdusă prin manipularea variabilei de mediu „%CMDCMDLINE%”, specificând în loc de '"&calc.exe' — '%CMDCMDLINE:~-1%&calc.exe'.

Sursa: opennet.ro

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster