Sårbarheden BatBadBut, der påvirker standardbiblioteker fra forskellige programmeringssprog

Applikationer, der kører scriptfiler i bat- og cmd-format på Windows-platformen ved hjælp af standardfunktioner til processtart, er udsat for en sårbarhed, der gør det muligt at udføre ens egen kode, hvis der sendes argumenter ved start uden korrekt escaperering af specialtegn. Sårbarheden har fået kodeordet BatBadBut og viser sig i applikationer, der bruger standardbiblioteker fra sprog som Rust, PHP, Node.js, Python, Ruby, Go, Erlang og Haskell.

Problemet er blevet identificeret som en sårbarhed, da det påvirker biblioteksfunktioner som Command::arg og Command::args i Rust, der er designet til at overføre argumenter direkte til processen uden at de behandles af kommandotolkeren. Det antages, at udvikleren af applikationen muligvis ikke kontrollerer argumenterne, da de overføres direkte til den kørte proces. I Unix-systemer sendes argumenter til processen individuelt i et array, mens argumenter i Windows ved brug af API'en CreateProcess præsenteres som en enkelt streng, hvis opdeling hviler på den kørte proces.

Når bat- og cmd-scripts kørers på Windows-platformen, tilkalder funktionen CreateProcess() implicit eksekveringsfilen cmd.exe, selv om applikationen ikke angiver dette ved kaldet. Programmet cmd.exe indeholder sin egen komplekse logik til opdeling af argumenter for at skelne mellem sine egne argumenter, de kørte scripts og argumenterne for disse scripts. For at beskytte mod argumentindsættelse på Windows anvendes separate escape-håndterere i standardbibliotekerne for programmeringssprog, som det viser sig, kan omgås ved at manipulere med dobbelte citationstegn.

For eksempel, i et program der kalder scriptet ‘./test.bat’ med et argument baseret på data indhentet fra brugeren, kan angriberen indsende værdien ‘»&calc.exe’, hvilket ved kørsel af scriptet vil blive udvidet til strengen ‘C:\Windows\System32\cmd.exe /c .\test.bat «»&calc.exe»‘ og føre til at processen calc.exe startes. Metoden virker også ved implicit kørsel af scripts, når eksekveringsfilen med navnet «test» startes uden angivelse af filtypenavn, og der i en af de mapper, der er nævnt i miljøvariablen PATH, findes en fil «test.bat».

I øjeblikket er der udgivet en rettelse (CVE-2024-24576) til sprogstandardbiblioteket Rust som en del af opdateringen Rust 1.77.2. Opdateringer til Node.js og PHP er under forberedelse (tags 8.2.18 og 8.3.5 er allerede udgivet, men udgivelserne er endnu ikke annonceret). Python, Ruby, Go, Erlang og Haskell-projekterne har indtil videre begrænset sig til at inkludere advarsler i dokumentationen om sårbarhed, hvis speciale tegn ikke er korrekt undsluppet.

I Rust 1.77.2 er der tilføjet en ekstra kontrol til standardbiblioteket, som returnerer en fejl ved tilstedeværelsen af specialtegn i argumenterne til det kørende script, som ikke kan garanteres at være sikkert undsluppet. For udviklere, der selv implementerer undslippelseslogik, er der en metode CommandExt::raw_arg, som fuldstændig deaktiverer undslippelse på biblioteksopkaldssiden.

Det er vanskeligt at tilføje beskyttelse, fordi simpel undslippelse af dobbelt anførselstegn ikke er tilstrækkelig, da kommandotolkeren behandler og afslører variable som «%PATH%». For eksempel kan man indsætte et anførselstegn ved at manipulere miljøvariablen «%CMDCMDLINE%», ved i stedet for ‘”&calc.exe’ at angive ‘%CMDCMDLINE:~-1%&calc.exe’.

Kilde: opennet.ru

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster