Les attaquants utilisent la bibliothèque HTTP Axios dans le cadre d’une attaque de chaîne d’approvisionnement NPM à plus fort impact

Lucas Morel

Avec près de 175 000 projets npm répertoriant la bibliothèque comme dépendance, l’attaque a eu un énorme effet en cascade et montre à quelle vitesse un package compromis peut se propager dans l’écosystème.

Les attaquants ont compromis le compte npm du principal responsable d’Axios, une bibliothèque client HTTP JavaScript largement utilisée, et l’ont utilisé pour publier des versions malveillantes du package qui déployait un cheval de Troie d’accès à distance multiplateforme sur les machines des développeurs. L’incident représente l’attaque de chaîne d’approvisionnement NPM ayant le plus grand impact jamais enregistré, compte tenu des environ 100 millions de téléchargements hebdomadaires d’Axios et de sa présence dans les cadres front-end, les services back-end et d’innombrables applications d’entreprise.

Heureusement, les versions trojanisées, axios@1.14.1 et axios@0.30.4, ont été détectées par plusieurs sociétés de sécurité surveillant le registre npm quelques minutes après leur publication, déclenchant une réponse rapide qui a vu les packages malveillants supprimés par l’équipe npm entre deux à trois heures plus tard. Cela dit, étant donné l’activité de téléchargement élevée que connaît ce projet, la courte fenêtre de temps était suffisante pour avoir un impact sur un nombre important d’environnements de développement.

Selon la société de sécurité cloud Wiz, Axios est utilisé dans 80 % des environnements cloud et de code ; la société a observé l’exécution du malware dans environ 3 % des environnements impactés. Les chercheurs de la société de sécurité Snyk ont ​​noté que « même une fenêtre malveillante de deux heures représente un énorme rayon d’explosion potentiel » compte tenu de la popularité de la bibliothèque. Près de 175 000 autres projets sur npm répertorient Axios comme dépendance, ce qui signifie que cela a eu un énorme effet de cascade à travers l’écosystème.

L’attaque fait suite à une série d’attaques sur la chaîne d’approvisionnement qui ont touché plusieurs projets open source dans différents référentiels de packages au cours des dernières semaines, la plupart étant attribuées à un groupe connu sous le nom de TeamPCP. Cependant, le Google Threat Intelligence Group (GTIG) a attribué l’attaque d’Axios à un acteur menaçant nord-coréen qu’il suit sous le nom d’UNC1069.

« Les pirates nord-coréens ont une vaste expérience des attaques contre la chaîne d’approvisionnement, qu’ils ont historiquement utilisées pour voler des cryptomonnaies », a déclaré John Hultquist, analyste en chef chez GTIG. « L’ampleur de cet incident n’est pas encore claire, mais étant donné la popularité du paquet compromis, nous nous attendons à ce qu’il ait des conséquences considérables. »

Dans leur analyse, les chercheurs de Snyk ont ​​également noté la sophistication des techniques impliquées dans l’attaque.

« L’attaquant a également fait preuve d’une sophistication opérationnelle significative, en pré-organisant la dépendance malveillante, en utilisant un historique de versions ‘propre’, en obscurcissant doublement le compte-gouttes, en créant des RAT spécifiques à la plate-forme et en mettant en œuvre l’auto-suppression anti-légale », ont déclaré les chercheurs de Snyk dans leur rapport. « Ce n’était pas opportuniste. »

Comment s’est déroulée l’attaque

Les attaquants ont commencé à préparer l’attaque Axios environ 18 heures auparavant lorsqu’un compte nommé nrwise a publié un package appelé plain-crypto-js@4.2.0. Il s’agissait d’un leurre propre conçu pour établir l’historique et la légitimité du registre. La charge utile malveillante est arrivée plus tard le même jour dans plain-crypto-js@4.2.1, qui contenait un postinstall hook qui exécuterait un script dropper lorsqu’il serait extrait par un autre package en tant que dépendance.

Peu après minuit UTC le 31 mars, une nouvelle version du package Axios, axios@1.14.1, a été publiée sur npm, suivie de axios@0.30.4 39 minutes plus tard. Tous deux ont répertorié plain-crypto-js@4.2.1 comme dépendance dans leur package.json fichiers, mais le reste des composants est resté inchangé.

Un package qui apparaît dans le manifeste mais qui n’a aucune utilisation ou importation dans la base de code est appelé dépendance fantôme et constitue un indicateur de compromission de haut niveau de confiance, selon les chercheurs de StepSecurity. Un autre indicateur était que ces versions apparaissaient uniquement sur npm et non dans le dépôt GitHub du projet en tant que versions étiquetées.

Les versions 1.x légitimes d’Axios ont été configurées pour utiliser le mécanisme OIDC Trusted Publisher de npm lié aux actions GitHub, mais la version 1.14.1 a été publiée manuellement via un jeton volé sans validation ni balise correspondante dans le référentiel.

Dans des commentaires sur GitHub, le responsable principal du projet, Jason Saayman, a reconnu que même si la version v1.x avait configuré la publication de confiance, la branche v0.x s’appuyait toujours sur un jeton hérité de longue durée. Un membre de la communauté a en outre souligné que le flux de travail de publication v1.x était toujours réussi. NODE_AUTH_TOKEN à npm, qui a priorité sur OIDC lorsque les deux sont présents, ce qui signifie que le jeton de longue durée était également utilisé pour la v1.x plutôt que pour le mécanisme de publication approuvé prévu.

Malware multiplateforme

Le obscurci et crypté postinstall Le script a contacté un serveur de commande et de contrôle (C2) sur un domaine enregistré la veille par les attaquants et a téléchargé des charges utiles RAT de deuxième étape spécifiques à la plate-forme.

Sur macOS, le binaire est écrit dans /Library/Caches/com.apple.act.mond et peut auto-signer les charges utiles injectées via codesign —force —deep —signcontournant les protections de macOS Gatekeeper. Le malware prend les empreintes digitales du système, collecte le nom d’hôte, le nom d’utilisateur, la version de macOS, les temps de démarrage et d’installation, l’architecture du processeur et les processus en cours d’exécution, puis atteint le serveur C2 toutes les 60 secondes.

Sur les machines Windows, la charge utile est un script PowerShell copié dans %PROGRAMDATA%wt.exese faisant passer pour un terminal Windows. Le malware établit la persistance via une clé d’exécution de registre nommée « MicrosoftUpdate » et un fichier batch de nouveau téléchargement. Pendant ce temps, les systèmes Linux reçoivent un script Python stocké sous /tmp/ld.py qui est exécuté via nohup python3.

Le RAT prend en charge quatre commandes : peinject pour déployer des binaires supplémentaires, runscript pour exécuter du code shell ou AppleScript, rundir pour l’énumération des répertoires, et kill pour l’auto-résiliation.

Selon les chercheurs de la société de sécurité Socket, après son exécution, le malware tente d’effacer ses traces en supprimant setup.jssupprimant le malware package.json qui contenait le hook de post-installation et en le remplaçant par une copie vierge indiquant la version 4.2.0 au lieu de 4.2.1. Cela signifie que les utilisateurs exécutent npm list dans un répertoire de projet affecté verra plain-crypto-js@4.2.0, ce qui pourrait les induire en erreur en leur faisant croire que la version installée est antérieure à l’attaque.

Détection et réponse du responsable

Les entreprises de sécurité surveillant npm ont signalé plain-crypto-js@4.2.1 quelques minutes après sa publication, déclenchant une série de réponses, notamment de la part de l’équipe du registre npm qui a supprimé les packages. Cependant, le projet Axios lui-même a eu du mal à contenir le problème car l’incident s’est produit pendant la nuit du responsable principal.

Un collaborateur principal du projet a également répondu au problème signalé par la communauté sur GitHub en quelques minutes, mais ses autorisations étaient inférieures à celles du responsable dont le jeton était compromis.

Cela souligne les lacunes potentielles en matière de réponse aux incidents auxquels les projets open source pourraient être confrontés, car même si les contributeurs du projet remarquent immédiatement une violation, l’attaquant pourrait disposer de privilèges plus élevés qu’eux grâce à un jeton volé et pourrait ralentir les tentatives de contrôle des dégâts.

Dans le récent compromis Trivy, les attaquants ont inondé le problème GitHub de commentaires indésirables provenant de robots afin de rendre plus difficile la réponse et la communication des responsables avec la communauté.

Préparez-vous à plus de compromis

L’effet en cascade de l’incident d’Axios est devenu visible lorsque les outils d’analyse des dépendances ont signalé des centaines de projets en aval qui avaient extrait les versions malveillantes. Un utilisateur a publié des avertissements sur plus de 50 référentiels après avoir détecté plain-crypto-js dans ses fichiers de verrouillage, tandis qu’un autre en a identifié des dizaines d’autres, depuis des blogs personnels jusqu’aux applications d’entreprise.

Cela démontre à quelle vitesse la compromission d’un package npm populaire se propage dans l’écosystème, même si la violation est détectée en quelques heures.

Les organisations doivent immédiatement auditer les fichiers de verrouillage et les dépendances installées pour les versions malveillantes. Si les versions malveillantes ont été installées, supposez que les environnements de développement sont entièrement compromis. Les équipes de sécurité doivent isoler les systèmes concernés, alterner toutes les informations d’identification présentes sur eux, telles que les jetons npm, les clés du fournisseur cloud, les clés privées SSH, les secrets CI/CD, etc.

« Ne faites pas de rotation sur place ; révoquez et rééditez », ont conseillé les chercheurs de Snyk. « N’essayez pas de nettoyer les systèmes compromis. Reconstruisez à partir d’un instantané connu comme propre. »

À long terme, les organisations devraient appliquer npm ci —ignore-scripts dans les pipelines CI/CD pour éviter postinstall les hooks de s’exécuter pendant les builds automatisés et prendre en compte les politiques d’âge des packages telles que le paramètre minimumReleaseAge de npm. Cela donne aux équipes de développement la possibilité de bloquer l’installation de packages qui n’ont pas d’âge minimum, ce qui aurait bloqué cette attaque puisque « plain-crypto-js » a existé moins de 24 heures avant d’être intégré dans l’arborescence des dépendances d’Axios.

L’utilisation d’outils d’IA tels que Claude Code ou OpenAI Codex dans les environnements d’entreprise via leurs applications de bureau respectives étend l’impact au-delà des environnements de développement. Ces outils sont de plus en plus utilisés par les non-développeurs dans leurs flux de travail, et les LLM ont tendance à s’appuyer fortement sur les écosystèmes npm et PyPI pour les outils CLI.

CyberattaquesSécuritéDevSecOpsSécurité des applicationsBibliothèques et frameworksDéveloppement de logiciels