Applikationer som kör skript i bat- och cmd-format pÄ Windows plattformen genom standardprocessstartfunktioner Àr sÄrbara för attacker som tillÄter exekvering av egen kod om specialtecken i körningsargumenten skickas utan separat escapning. SÄrbarheten har kodnamnet BatBadBut och upptrÀder i applikationer som anvÀnder standardbibliotek för programmeringssprÄk sÄsom Rust, PHP, Node.js, Python, Ruby, Go, Erlang och Haskell.
Problemet har identifierats som en sÄrbarhet eftersom det rör funktioner i biblioteket, som Command::arg och Command::args i Rust, som Àr avsedda för direkt överföring av argument till processen, utan att behandlas av kommandotolken. Det antas att applikationsutvecklaren inte kontrollerar argumenten eftersom de överförs direkt till den körande processen. Medan argumenten i Unix-system överförs till processen individuellt i en array, sÄ formateras argumenten i Windows med API:n CreateProcess som en enda strÀng, och tolkningen av denna strÀng ligger pÄ den körande processen.
NÀr bat- och cmd-skript körs pÄ Windows plattformen, kallar funktionen CreateProcess() implicit den körbara filen cmd.exe, Àven om applikationen inte specificerar detta vid anropet. Programmet cmd.exe innehÄller en egen komplex logik för att separera argument, för att sÀrskilja sina egna argument, de som tillhör skriptet som körs, och argumenten för detta skript. För att skydda mot överföring av argument pÄ Windows anvÀnds separata escapningshanterare i standardbiblioteken för programmeringssprÄk, vilket visat sig kunna omgÄs genom manipulering av dubbelcitat.
Till exempel, i ett program som anropar skriptet â.\/test.batâ med ett argument baserat pĂ„ data hĂ€mtade frĂ„n anvĂ€ndaren, kan en angripare skicka vĂ€rdet â»&calc.exeâ, vilket vid körning av skriptet kommer att utvecklas till strĂ€ngen âC:\Windows\System32\cmd.exe \/c .\test.bat «»&calc.exe»â och leda till att processen calc.exe startas. Metoden fungerar ocksĂ„ vid implicit körning av skript, nĂ€r en körbar fil med namnet «test» startas utan att ange filtypen, och en fil som heter «test.bat» finns i en av katalogerna som nĂ€mns i miljövariabeln PATH.
För nÀrvarande har en ÄtgÀrd slÀppts (CVE-2024-24576) för standardbiblioteket i programsprÄket Rust och ingÄr i uppdateringen Rust 1.77.2. Det pÄgÄr förberedelser för uppdateringar som tar bort sÄrbarheten för Node.js och PHP (taggarna 8.2.18 och 8.3.5 har redan skapats, men versionerna har Ànnu inte meddelats). Projekten Python, Ruby, Go, Erlang och Haskell har hittills begrÀnsat sig till att lÀgga till en varning i dokumentationen om sÄrbarhetens förekomst vid bristande korrekt undanröjande av specialtecken.
I Rust 1.77.2 har en extra kontroll lagts till i standardbiblioteket som returnerar ett fel om argumentet för det körbara skriptet innehÄller specialtecken som inte kan garanteras att sÀkert undanröjas. För utvecklare som sjÀlva implementerar undanröjningslogik har metoden CommandExt::raw_arg tillhandahÄllits, vilket helt inaktiverar undanröjning pÄ bibliotekets funktionssida.
TillĂ€gget av skydd hindras av att enkel undanröjning av dubbla citattecken inte Ă€r tillrĂ€ckligt, eftersom kommandotolkaren behandlar och avslöjar variabler som «%PATH%». Till exempel kan ett citattecken injiceras genom manipulation av miljövariabeln «%CMDCMDLINE%», genom att ange istĂ€llet för â»&calc.exeâ â â%CMDCMDLINE:~-1%&calc.exeâ.
KĂ€lla: opennet.ru
