BatBadBut haavatavus, mis mÔjutab erinevate programmeerimiskeelte standardraamatukogusid

Windowsi platvormil bat- ja cmd-formaadis skripte kÀivitavad rakendused, mis kasutavad protsesside kÀivitamise standardfunktsioone, on haavatavad haavatavuse tÔttu, mis vÔimaldab koodi tÀitmist, kui kÀivitamisel edastatakse argumente ilma eraldi eraldamiseta erimÀrkidest. See haavatavus on saanud koodinimeks BatBadBut ja see ilmneb rakendustes, mis kasutavad standardseid raamatukogusid sellistes keeltes nagu Rust, PHP, Node.js, Python, Ruby, Go, Erlang ja Haskell.

Probleem on klassifitseeritud haavatavuseks, kuna see mĂ”jutab selliste raamatukogude funktsioone nagu Command::arg ja Command::args keeles Rust, mis on mĂ”eldud argumentide edastamiseks protsessile ilma nende töötlemiseta kĂ€surida tĂ”lgendaja kaudu. 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 kutsuvad API CreateProcess argumendid esile ĂŒheainsa stringina, mille parsimine jÀÀb kĂ€ivitava protsessi kanda.

Windowsi platvormil bat- ja cmd-skripte kĂ€ivitades tĂ”mbab funktsioon CreateProcess() ebamugavalt sisse tĂ€itmisfaili cmd.exe, isegi kui rakendus ei tĂ€psusta seda kutse tegemisel. Programm cmd.exe sisaldab enda keerulist argumentide eraldamise loogikat, et eraldada oma argumendid, kĂ€ivitatava skripti argumendid ja selle skripti argumendid. Windowsi platvormil argumentide asendamise vĂ€ltimiseks rakendatakse programmeerimiskeelte standardsetes raamatukogudes eraldi eraldusmehhanisme, mida saab ĂŒletada kahekohaliste jutumĂ€rgid manipuleerimise teel.

NĂ€iteks rakenduses, mis kutsub vĂ€lja skripti ‘./test.bat’ kasutaja sisendandmete pĂ”hjal saadud argumendiga, vĂ”ib rĂŒndaja edastada vÀÀrtuse ‘»&calc.exe’, mis kĂ€ivitamisel avab skripti stringiks ‘C:\Windows\System32\cmd.exe /c .\test.bat «»&calc.exe»’ ning kĂ€ivitab protsessi calc.exe. Meetod kehtib ka kaudsetel skriptide kĂ€ivitamisel, kus kĂ€ivitatakse tĂ€itmisfail, mille nimi on „test“, ilma laiendust tĂ€psustamata, ja ĂŒhe PATH keskkonna muutuja mainitud katalooge jĂ€tab faili „test.bat“.

Hetkel on vÀlja antud parandamine (CVE-2024-24576) Rusti standardraamatukogu jaoks, mis on osa Rusti uuendusest 1.77.2. Protsessis on tegemisel vÀrskendused Node.js ja PHP jaoks, mis tegelevad haavatava koha kÔrvaldamisega (sildid 8.2.18 ja 8.3.5 on juba vÀlja mÀÀratud, kuid vÀljalaskmisi pole veel kuulutatud). Python, Ruby, Go, Erlang ja Haskell projektid on seni piirdunud dokumentatsioonis hoiatuse lisamisega haavatavuse ilmnemise kohta ilma nÔuetekohase eraldamiseta.

Rust 1.77.2 on standardraamatukokku lisatud tĂ€iendav kontroll, mis tagastab vea, kui kĂ€ivitatava skripti argumendis on erimĂ€rke, mida ei saa kindlalt ohutult eraldada. Arendajatele, kes rakendavad ise eraldusloogikat, on kergesti kĂ€tte saadav meetod CommandExt::raw_arg, mis tĂ€iesti keelab eraldamise raamatukogu kutsete kĂŒljest.

Kaitse lisamise takistuseks on, et kahekohaliste jutumĂ€rkide lihtne eraldamine ei ole piisav, kuna kĂ€surea tĂ”lgendaja töötleb ja avab muutujaid, nagu „%PATH%“. NĂ€iteks saab jutumĂ€rgi asendada keskkonnamuutuja „%CMDCMDLINE%“ manipuleerimise kaudu, asendades ‘»&calc.exe’ muutuja ‘%CMDCMDLINE:~-1%&calc.exe’.

Allikas: opennet.ru

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster