Windows platvormil bat- ja cmd-formaadis skripte kĂ€ivitavad rakendused, mis kasutavad protsesside kĂ€ivitamise tavalisi funktsioone, on haavatavad viga, mis vĂ”imaldab rĂŒndajal oma koodi kĂ€ivitada, kui kĂ€ivitamisel edastatakse argumente ilma spetsiaalsete mĂ€rkide eraldamiseta. See haavatavus sai koodinimeks BatBadBut ja ilmneb rakendustes, mis kasutavad standardraamatukogusid sellistes keeltes nagu Rust, PHP, Node.js, Python, Ruby, Go, Erlang ja Haskell.
Probleem on mĂ€rgitud haavatavusena, kuna see puudutab raamatukogu funktsioone, nagu Command::arg ja Command::args Rustis, mis on mĂ”eldud argumentide edastamiseks protsessile ilma nende töötlemise command interpreteriga. Eeldatakse, et rakenduse arendaja ei pruugi argumente kontrollida, kuna need edastatakse otse kĂ€ivitatavale protsessile. Kui Unix-sĂŒsteemides edastatakse argumendid protsessile eraldi massiivis, siis Windowsis, kui kasutatakse API CreateProcess, edastatakse argumendid ĂŒhe stringina, mille analĂŒĂŒs lasub kĂ€ivitataval protsessil.
Windows platvormil bat- ja cmd-skripte kÀivitades kutsub CreateProcess() vaikimisi esile executabler cmd.exe, isegi kui rakendus ei mÀÀranud seda kutse ajal. Programm cmd.exe sisaldab oma keerukat argumentide eraldamise loogikat, et eristada oma argumente, kÀivitatavat skripti ja selle skripti argumente. Windows platvormi standardraamatukogudes kasutatakse argumentide asendamise kaitseks eraldi eraldamisprotseduuride, mille vÔib osutuda vÔimalikuks kÔrvale juhtida topeltkoodide manipuleerimise kaudu.
NĂ€iteks rakenduses, mis kutsub skripti â./test.batâ argumentiga, mis pĂ”hineb kasutajalt saadud andmetel, vĂ”ib rĂŒndaja saata vÀÀrtuse â»&calc.exeâ, mis kĂ€ivitamisel lahti muudetakse stringiks âC:\Windows\System32\cmd.exe /c .\test.bat «»&calc.exe»â ja kĂ€ivitab protsessi calc.exe. Meetod kehtib ka kaudse kĂ€ivitamise korral, kui kĂ€ivitatakse kĂ€ideldav fail nimega «test» ilma laiendita ja ĂŒhes PATH keskkonnamuutuja mainitud kataloogis on fail «test.bat».
Praegu on vÀlja antud turvaparandus (CVE-2024-24576) Rusti keele standardraamatukogu jaoks ja see on osa Rust 1.77.2 uuendusest. Node.js ja PHP jaoks on vÀlja töötamisel turvaparandused (versioonid 8.2.18 ja 8.3.5 on juba sildistatud, kuid vÀljalasked pole veel kuulutatud). Python, Ruby, Go, Erlang ja Haskell projektid on seni dokumentatsioonis lisanud hoiatuse, et haavatavust vÔib esineda, kui erimÀrke ei ole nÔuetekohaselt kontrollitud.
Rust 1.77.2-sse on lisatud tÀiendav kontroll standardraamatukogus, mis tagastab vea, kui skripti kÀivitamise argumendis on erimÀrke, mida ei saa turvaliselt kontrollida. Arendajatele, kes rakendavad oma otsustuskÀigu logikat, on antud meetod CommandExt::raw_arg, mis keelab tÀielikult kontrollimise raamatukogu kÔnede poole.
Kaitse lisamise takistuseks on see, et lihtne topeltlainete mÀrkide kontrollimine ei ole piisav, kuna kÀsurea interpreteerija töötleb ja avab muutujaid, nagu '%PATH%'. NÀiteks on vÔimalik mÀrk sisestada keskkonnamuutuja '%CMDCMDLINE%' manipuleerimise kaudu, nimelt, mÀÀrates '"&calc.exe' asemel '%CMDCMDLINE:~-1%&calc.exe'.
Allikas: opennet.ru
