
beeboys - stock.adobe.com
L’écosystème NPM au centre d’une attaque sur la chaîne logistique du logiciel
Le très populaire package @ctrl/tinycolor figure parmi un lot de près de 200 packages compromis. Le code malveillant embarque un mécanisme d’autopropagation et de vol de secrets d’authentification.
Les équipes de Socket et de StepSecurity détaillent un incident de sécurité initialement découvert par l’utilisateur de GitHub @franky47 : le paquet pour NPM @ctrl/tinycolor a été compromis.
Ce n’est pas un paquet anodin : il est en moyenne téléchargé plus de 2 millions de fois par semaine. Et surtout, il n’est pas le seul.
Dans un billet de blog, les équipes de StepSecurity résument : « l’attaque se déroule à travers une chaîne sophistiquée en plusieurs étapes qui exploite process.env de Node.js pour accéder de manière opportuniste aux identifiants et utilise des modules regroupés dans Webpack pour plus de modularité. Au cœur de cette attaque se trouve un fichier bundle.js minifié d’environ 3,6 Mo, qui s’exécute de manière asynchrone pendant l’installation de npm. Cette exécution est probablement déclenchée par un script postinstall détourné intégré dans le fichier package.json compromis ».
Ce n’est pas tout : « le logiciel malveillant embarque un mécanisme d’autopropagation via la fonction NpmModule.updatePackage. Cette fonction interroge l’API du registre NPM pour récupérer jusqu’à 20 paquets appartenant au responsable, puis publie de force des correctifs pour ces paquets. Cela crée un effet de compromission en cascade, injectant de manière récursive le bundle malveillant dans les écosystèmes dépendants du registre NPM ».
De leur côté, les équipes de Socket avaient déjà identifié une quarantaine de paquets additionnels ainsi compromis en cascade. Et d’expliquer que « le script combine un scan local et une analyse spécifique au service. Il recherche des variables d’environnement telles que GITHUB_TOKEN, NPM_TOKEN, AWS_ACCESS_KEY_ID et AWS_SECRET_ACCESS_KEY. Il valide les jetons npm avec le point de terminaison whoami et interagit avec les API GitHub lorsqu’un jeton est disponible. Il tente également de découvrir les métadonnées cloud susceptibles de divulguer des informations d’identification à courte durée de vie au sein des agents de build cloud ».
Qui plus est, ce workflow « qu’il écrit dans les référentiels persiste au-delà de l’hôte initial. Une fois validé, tout futur cycle d’intégration continue peut déclencher l’étape d’exfiltration à partir du pipeline où les secrets et artefacts sensibles sont disponibles par conception ».
StepSecurity précise que « l’entière conception de l’attaque suppose des environnements d’exécution Linux ou macOS ». Les données exfiltrées sont envoyées à un repository GitHub public nommé Shai-Hulud.
Selon Aikido, le nombre de paquets NPM compromis connus est aujourd’hui de près de 200. Parmi eux, des paquets appartenant à CrowdStrike, notamment. L’éditeur semble avoir déjà réagi et être revenu à des paquets sains.
Mais cette attaque visant la chaîne logistique du logiciel dans l’écosystème NPM est loin d’être la première. Il y a une semaine, le développeur maintenant des paquets NPM totalisant plus de 2,6 milliards de téléchargements par semaine, Josh Junon (quix), avait vu son compte GitHub compromis à l’occasion d’une attaque par hameçonnage avec contournement de l’authentification à facteurs multiples (MFA).
L’attaque semble avoir été motivée pécuniairement, avec le vol de cryptodevises. Mais l’assaillant semble n’avoir guère gagné que quelques centaines de dollars, selon les constatations de JFrog, notamment.
Une autre attaque avait déjà visé l’écosystème NPM quelques mois plus tôt, en juillet. Elle avait également commencé par une opération de phishing.