Un hacker a pris le contrôle du compte npm de la bibliothèque HTTP JavaScript la plus téléchargée au monde

Le 31 mars 2026, entre 00h21 et 03h15 UTC, deux versions d'axios — 1.14.1 et 0.30.4 — ont été publiées sur le registre npm par le compte jasonsaayman, le mainteneur principal du projet. Les deux versions injectaient une dépendance fantôme, plain-crypto-js@4.2.1, dont le seul rôle était d'exécuter un script postinstall déposant un RAT (Remote Access Trojan) multiplateforme ciblant macOS, Windows et Linux simultanément.
Axios est la bibliothèque HTTP JavaScript la plus utilisée au monde. 100 millions de téléchargements hebdomadaires. Wiz estime qu'elle est présente dans 80 % des environnements cloud et de code qu'elle surveille. Une installation npm par défaut — npm install axios — résolvait automatiquement vers la version piégée.
Chez Huntress, la première infection sur un endpoint surveillé a été enregistrée 89 secondes après la publication de la version 1.14.1. En moins de deux secondes après le lancement de npm install, le malware contactait déjà le serveur C2 de l'attaquant — avant même que npm n'ait fini de résoudre les dépendances. Au total, au moins 135 endpoints dans la base clients de Huntress ont contacté l'infrastructure de commande et contrôle pendant la fenêtre d'exposition.
L'opération
L'attaque a été pré-positionnée 18 heures à l'avance. Le 30 mars à 05h57 UTC, une version propre de plain-crypto-js (4.2.0) a été publiée sur npm pour établir un historique de registre crédible. À 23h59, la version 4.2.1, porteuse du payload, a été substituée. Puis les deux versions d'axios ont été publiées à 39 minutes d'intervalle, ciblant simultanément la branche current (1.x, taguée latest) et la branche legacy (0.x, taguée legacy).
Trois payloads pré-compilés, un par système d'exploitation. Chaque artefact conçu pour s'autodétruire. Le dropper supprime son propre fichier postinstall après exécution et remplace le package.json compromis par une copie propre. Une inspection post-infection du répertoire node_modules ne montre aucune trace de compromission. npm audit ne détecte rien.
"This is among the most operationally sophisticated supply chain attacks ever documented against a top-10 npm package."
Le vecteur
Le mainteneur légitime, jasonsaayman, avait l'authentification multi-facteurs activée. Le problème était ailleurs. Le workflow de publication via GitHub Actions passait encore NPM_TOKEN comme variable d'environnement en parallèle des credentials OIDC. Quand les deux sont présents, npm utilise le token. Un token d'accès longue durée (long-lived), jamais roté, était donc la méthode d'authentification effective pour toutes les publications — indépendamment de la configuration OIDC.
L'email du compte npm a été changé vers ifstap@proton.me, une adresse ProtonMail contrôlée par l'attaquant. La publication est passée directement par le CLI npm, contournant entièrement le pipeline CI/CD GitHub Actions.
"I'm trying to get support to understand how this even happened. I have 2fa / mfa on practically everything."
Le MFA sur le login ne protège pas un token qui a été émis avant l'attaque et jamais révoqué.
UNC1069
Le 1er avril, Google Threat Intelligence Group a publiquement attribué l'attaque à UNC1069, un acteur financièrement motivé lié à la Corée du Nord, actif depuis au moins 2018. L'attribution repose sur l'utilisation de WAVESHAPER.V2, une évolution d'un backdoor macOS/Linux précédemment attribué au même groupe, et sur des recoupements d'infrastructure — le domaine C2 sfrclak.com résolvait vers une IP (142.11.206.73) connectée à un nœud AstrillVPN déjà observé dans des opérations UNC1069 antérieures.
Le binaire macOS livré par le dropper contenait un chemin de build interne : Jain_DEV/client_mac/macWebT/macWebT. Le nom macWebT renvoie directement au module webT utilisé par BlueNoroff — l'unité nord-coréenne spécialisée dans les attaques financières — dans les campagnes RustBucket et Hidden Risk documentées en 2023.
UNC1069 cible habituellement les exchanges de cryptomonnaies, les développeurs d'institutions financières et les fonds de capital-risque. John Hultquist, analyste en chef du GTIG : "North Korean hackers have deep experience with supply chain attacks, which they've historically used to steal cryptocurrency. The full breadth of this incident is still unclear, but given the popularity of the compromised package, we expect it will have far-reaching impacts."
Mars 2026
L'attaque sur axios n'est pas isolée. Elle clôture une séquence de douze jours qui a compromis cinq projets open source majeurs, attribués à au moins deux acteurs distincts. Google a explicitement indiqué que l'incident axios est séparé de la campagne TeamPCP.
Cinq projets en douze jours. Deux écosystèmes de packages (npm, PyPI). Trois mécanismes de livraison différents. Au moins deux acteurs étatiques ou para-étatiques distincts. TeamPCP a basculé vers la monétisation de ses récoltes de credentials en s'affiliant à Vect, une nouvelle opération ransomware-as-a-service.
Charles Carmakal, CTO de Mandiant : les secrets volés lors de ces attaques « will enable more software supply chain attacks, SaaS environment compromises leading to downstream customer compromises, ransomware and extortion events, and crypto heists over the next several days, weeks, and months. »
L'angle mort
Le vrai problème n'est pas axios. C'est le modèle de confiance. Un développeur qui tape npm install dans un pipeline CI/CD exécute du code arbitraire provenant d'un registre public, avec les mêmes permissions que le runner — y compris l'accès aux clés SSH, aux credentials cloud AWS/GCP/Azure, aux tokens API, et aux secrets Kubernetes. L'attaquant n'a pas besoin d'exploiter une vulnérabilité. Il exploite la confiance.
Le malware scannait spécifiquement les répertoires .ssh, .aws et les fichiers de configuration d'environnement. Sur un runner CI/CD self-hosted, c'est l'équivalent d'un accès root à l'infrastructure de déploiement. Sur un poste développeur, c'est l'accès à tous les dépôts, toutes les clés, tous les tokens stockés localement.
Axios n'avait que trois dépendances légitimes : follow-redirects, form-data, proxy-from-env. L'ajout de plain-crypto-js était un signal non ambigu de tampering. Mais npm n'a pas de mécanisme natif pour alerter quand un package ajoute une nouvelle dépendance à une version mineure. Les lockfiles protègent — à condition d'être utilisés, committés, et que les pipelines exécutent npm ci plutôt que npm install. Beaucoup ne le font pas.
Wiz a observé les versions malveillantes dans environ 3 % des environnements cloud qu'elle scanne. Sur une base de 80 % de présence, 3 % d'infection en moins de trois heures d'exposition est un ratio de conversion que la plupart des opérations offensives n'atteignent pas.
Le domaine C2, sfrclak.com, est offline. Les packages compromis ont été retirés du registre npm. Le mainteneur jasonsaayman a récupéré le contrôle de son compte. Le problème du token longue durée non révoqué, lui, est structurel.
Mercor
L'attaque a déjà fait une victime documentée en dehors du périmètre direct de npm. Mercor, une startup IA de recrutement, a confirmé un incident de sécurité lié à la compromission du projet open source LiteLLM — l'un des maillons de la chaîne TeamPCP. Un groupe d'extorsion a revendiqué le vol de données dans les systèmes de Mercor. La connexion entre la compromission d'un outil de routing LLM et l'exfiltration de données d'une startup de recrutement illustre la mécanique de propagation : un token volé dans un pipeline CI/CD devient un point d'entrée dans l'infrastructure de production d'un client.
TL;DR
La Corée du Nord a piégé la plomberie HTTP de 80 % du cloud mondial — et la première machine infectée a mis 89 secondes à tomber.
- Un acteur étatique nord-coréen (UNC1069) a compromis le compte npm du mainteneur principal d'axios (100 millions de téléchargements/semaine) et publié deux versions contenant un RAT multiplateforme. La fenêtre d'exposition : moins de trois heures. Le vecteur : un token d'accès longue durée jamais révoqué, malgré la MFA activée.
- L'attaque clôture une séquence de cinq compromissions supply-chain en douze jours (Trivy, Checkmarx, LiteLLM, Telnyx, axios), impliquant au moins deux acteurs distincts et couvrant npm et PyPI. Les secrets volés alimentent déjà des opérations de ransomware et d'extorsion.
- Le malware s'autodétruit après installation, remplace ses propres fichiers par des copies propres, et échappe à npm audit. Les organisations ayant installé axios entre 00h21 et 03h15 UTC le 31 mars doivent traiter chaque machine affectée comme intégralement compromise et rotater tous les credentials.
Questions fréquentes
Mon entreprise utilise axios — sommes-nous touchés?
Si vos lockfiles pinaient axios sur une version antérieure à 1.14.1 (branche 1.x) ou 0.30.4 (branche 0.x) et que vos pipelines utilisent npm ci, vous êtes protégés. Si un npm install a tourné entre 00h21 et 03h15 UTC le 31 mars avec un range flottant (^1.14.0), traitez la machine comme compromise et rotez tous les secrets accessibles au moment de l'installation.
Quel est le lien entre axios et la campagne TeamPCP (Trivy, LiteLLM)? Les deux campagnes exploitent la même faiblesse structurelle : des credentials sur des machines qui exécutent du code provenant de registres publics.
Google a explicitement indiqué que les deux campagnes sont distinctes. TeamPCP (attribué à UNC6780) a opéré par cascade de credentials volés à travers Trivy, Checkmarx, LiteLLM et Telnyx. Axios a été compromis par UNC1069, un groupe nord-coréen différent, via un token npm longue durée.
Qu'est-ce que ça change pour la gouvernance des dépendances open source en entreprise?
Mars 2026 invalide l'approche « on fait confiance au registre ». Les mesures immédiates : épingler les versions exactes, committer les lockfiles, désactiver les scripts lifecycle (--ignore-scripts) par défaut, auditer les tokens d'accès longue durée, et monitorer les connexions sortantes des runners CI/CD. Les entreprises qui ne l'ont pas encore fait doivent traiter leurs pipelines CI/CD comme une surface d'attaque prioritaire, pas comme un outil interne.BRIEFS IMAGEBrief 1 — « 89 secondes »Style : infographie technique sombre et tendue. Un chronomètre digital affichant 00:01:29 en rouge vif, superposé à un flux de logs npm qui défilent. En arrière-plan, une carte du monde avec des points d'impact lumineux clignotants indiquant les endpoints compromis. Palette : noir profond, rouge alerte, blanc terminal. Typographie monospace.Brief 2 — « La chaîne »Style : diagramme de propagation en style blueprint technique. Les cinq projets compromis (Trivy → Checkmarx → LiteLLM → Telnyx → Axios) représentés comme des maillons d'une chaîne, chacun relié par une flèche rouge indiquant le credential volé qui a permis le saut. Les deux acteurs (TeamPCP et UNC1069) sont différenciés par couleur. Fond bleu marine quadrillé, style salle de crise.Brief 3 — « Le fantôme dans la plomberie »Style : illustration conceptuelle minimaliste. Des tuyaux de plomberie en cuivre formant le schéma d'un réseau informatique, traversant un mur blanc. À un embranchement, un des tuyaux est translucide, laissant voir un flux de données toxiques (vert acide) qui circule à l'intérieur. Un autocollant de maintenance « plain-crypto-js 4.2.1 » est collé sur le tuyau compromis. Éclairage chirurgical, ombres nettes.