Axios a été détourné : 5 packages npm à remplacer par des API HTTP
Un acteur lié à la Corée du Nord a expédié un RAT dans axios 1.14.1 à 70 millions d'installateurs hebdomadaires. Cinq packages NPM à usage unique que vous pouvez supprimer aujourd'hui et remplacer par des appels d'API HTTP.
Le 31 mars 2026, un opérateur lié à la Corée du Nord a publié deux versions dérobées de
axios à npm. Les versions 1.14.1 et 0.30.4 sont livrées avec une dépendance post-installation nommée
plain-crypto-js qui a retiré un implant RAT spécifique à la plate-forme
sfrclak[.]com:8000. Les packages ont été diffusés pendant trois heures. Axios obtient 70 millions
téléchargements hebdomadaires. Faites le calcul.
Chaque tâche CI exécutée npm install pendant cette fenêtre, une charge utile a été envoyée dans sa construction
environnement. Les secrets des variables d'environnement ont été exfiltrés ; les jetons privés GitHub se sont habitués à
versions de suivi à la menthe ; ordinateurs portables de développeur en cours d'exécution npm install localement, j'ai obtenu un RAT.
L'incident a contourné 2FA car la machine du responsable était déjà compromise via un
campagne ciblée d’ingénierie sociale. 2FA sur le compte npm ne fait rien lorsque l'attaquant possède
le terminal qui exécute npm publish.
Vous ne pouvez pas éliminer cette classe d'attaque, mais vous pouvez réduire votre rayon d'explosion. Chaque package npm cela fait une petite chose ; valider un email, analyser un numéro de téléphone, supprimer du HTML, générer un code QR, signant un JWT ; est un package que vous pouvez supprimer et remplacer par un appel HTTPS vers une API que vous commande via clé rotative. Un package compromis s’exécute avant que vous puissiez réagir. Une clé API compromise cesse de fonctionner en quelques secondes.
Voici cinq packages npm que vous pouvez remplacer cette semaine, par l'API HTTP qui fait la même chose, plus un garde CI qui empêche les nouveaux hooks de post-installation d'atterrir dans votre fichier de verrouillage.
Auditez votre surface de dépendance npm actuelle
Avant de supprimer quoi que ce soit, sachez ce que vous avez. Cette passe de shell fait apparaître les dépendances de production avec des hooks d'installation et vérifie si les versions d'axios empoisonnées se trouvent quelque part dans votre arborescence :
Si l'une des versions d'axios apparaît dans votre fichier de verrouillage, faites pivoter chaque secret de la machine ou du CI concerné. le travail avait accès. Pas « vérifier les journaux ». Tourner. Supposons que l'exfiltration ait eu lieu dans les 180 minutes entre la publication et le retrait. Les secrets divulgués ne peuvent pas être divulgués.
Google Threat Intelligence attribue l'opération à UNC1069, le même acteur qui a exécuté
plus tôt WAVESHAPER campagnes. Leur playbook cible les ordinateurs portables des responsables via
phishing, puis utilise les informations d'identification du responsable pour publier. Votre défense doit supposer que
au moins un responsable d'au moins un dépôt transitif est à un phishing d'être un implant
système de livraison.
Remplacement 1 : validateur d'e-mail → /v1/email/valider
validator, email-validator, deep-email-validator, et
disposable-email-domains apparaissent dans une part énorme des flux d’inscription. Ensemble, ils ajoutent
environ un demi-Mégaoctet de poids d'installation, leurs propres arborescences transitives et une liste maintenue à jour des
domaines jetables qui deviennent obsolètes en quelques semaines.
L'API vérifie la syntaxe, les enregistrements DNS MX et une liste de domaines jetables en direct en un seul appel. Échange les deux packages sortis ressemblent à ceci :
Vous perdez la possibilité de valider hors ligne. Vous bénéficiez d'un contrôle MX maintenu, d'une liste jetable en direct, et aucun paquet avec des hooks de post-installation situés dans votre arborescence. Pour l'inscription, le paiement et le webhook champs de courrier électronique, ce compromis favorise l'API.
Remplacement 2 : libphonenumber-js → /v1/téléphone
libphonenumber-js est un portage de Google libphonenumber. Il pèse 147 Ko
minifié. La version « mini » tombe à 79 Ko mais perd les métadonnées pour la plupart des pays. Les métadonnées complètes
le bundle ramène le poids à 2 Mo déballé. Sur Cloudflare Workers ou un Lambda froid, c'est
latence réelle que vous payez à chaque invocation.
Un POST renvoie le format E.164, le pays, le numéro national, le type de ligne et le fuseau horaire. Si le numéro
est invalide, data.valid est false et le reste est nul. Côté serveur
le flux d'inscription appelle cela entre « lire le formulaire » et « écrire dans la base de données ». L'aller-retour API de 60 ms se trouve
dans votre fenêtre d'écriture de base de données existante.
Remplacement 3 : qrcode → /v1/qr/générer
La qrcode Le package npm lui-même convient : 34 Ko, pas de hook post-installation. Ce qui ne va pas, c'est
le canvas dépendance envers les pairs vers laquelle la moitié des tutoriels vous poussent, ce qui résume
code natif, installe node-gyp et dispose de dix ans de CVE dans sa chaîne d'outils de construction. Chaque natif
npm dep est un joint de la chaîne d'approvisionnement.
La réponse est un SVG brut. Transférez-le vers un fichier, insérez-le dans un modèle de facture ou affichez-le en ligne
dans un composant React avec dangerouslySetInnerHTML. Pas de modules natifs, pas de build
chaîne d'outils, pas d'arbre transitif.
Remplacement 4 : jsonwebtoken → /v1/jwt/generate et /v1/jwt/decode
jsonwebtoken est l'une des bibliothèques JWT les plus copiées dans Node. C'est aussi la bibliothèque
la plupart des gens effectuent une mauvaise configuration : mauvais algorithme, revendication d'audience manquante, pas d'expiration. Un mauvais algorithme
vérifier l'appel plus un en-tête contrôlé par l'attaquant réintroduit le JWT de l'ère 2015 none
vulnérabilité. L'API applique des listes blanches d'algorithmes et rejette les jetons non signés au point de terminaison :
Utilisez-le pour les jetons de courte durée émis par un service backend : liens de réinitialisation de mot de passe, uniques télécharger des URL, des jetons de support de service à service. Ne pas utiliser de service externe pour la session utilisateur JWT sur le chemin actif de chaque requête authentifiée ; pour ceux-là, gardez une bibliothèque vérifiée en cours et verrouillez l'algorithme.
Remplacement 5 : html vers texte → /v1/html-to-text/convertir
html-to-text, sanitize-html, node-html-parser, et leur
les amis existent parce que chaque API acceptant le contenu utilisateur doit finalement supprimer le HTML pour le texte brut
aperçus, résumés d’e-mails ou indexation de recherche. Leur poids combiné est de 500 Ko à 1,2 Mo ; ils tirent
parse5 ou htmlparser2 par la porte, qui ont chacun la sienne
surface du mainteneur.
Pour une sortie plus riche, /v1/html-to-markdown renvoie GitHub-Flavored Markdown, et
/v1/html-sanitize renvoie du HTML nettoyé avec une liste blanche configurable. Choisissez celui
qui correspond à la façon dont votre consommateur en aval souhaite stocker le contenu.
Ajouter une protection CI qui bloque les nouveaux hooks post-installation
La suppression de packages est un travail ponctuel. Rester mince est continu. Cette vérification des actions GitHub échoue
le PR si une mise à jour du fichier de verrouillage introduit un nouveau postinstall ou preinstall
accrochez-vous n'importe où dans l'arbre :
Le contrôle est bon marché, s'exécute sur chaque PR et force un examen humain avant l'arrivée de tout nouveau crochet de script.
Associez-le à npm config set ignore-scripts true sur CI et les listes autorisées explicites pour
les forfaits dont vous avez besoin esbuild-post-installation de style (TypeScript, Puppeteer, bcrypt).
Ce que vous avez abandonné et quand le remettre
Déplacer la validation vers un appel HTTP entraîne des coûts réels. Vous les échangez contre une dépendance plus petite superficie :
| Compromis | paquet npm | API HTTP |
|---|---|---|
| Latence | Microsecondes | 50 à 150 ms du bord |
| Utilisation hors ligne | Oui | Non |
| Risque d'installation | La post-installation exécute du code arbitraire | Aucune étape d'installation |
| Révocation | Reconstruire, republier, redéployer | Faites pivoter la clé API en quelques secondes |
| Piste d'audit | Aucun par défaut | Journal des demandes par appel |
| Dérive des versions | Épingler ou rénover | En-tête de version, contrat stable |
La bonne réponse est « les deux, avec intention ». Conserver les bibliothèques du chemin critique en cours (session JWT vérification, primitives cryptographiques, middleware d'authentification). Déplacez la longue traîne des utilitaires à usage unique hors de votre fichier de verrouillage et sur un point de terminaison HTTPS signé que vous pouvez révoquer.
Points clés à retenir
- Supposons qu’un responsable soit à un phishing d’un implant. Axios a reçu 70 millions par semaine téléchargements et son compte npm était toujours compromis par une attaque d'ingénierie sociale sur un ordinateur portable personnel.
-
Auditez les hooks de post-installation aujourd’hui. Toute agence qui exécute du code arbitraire pendant
npm installest un joint de la chaîne d’approvisionnement. Inventoriez-les, puis supprimez-les ou ajoutez-les à la liste autorisée. - Supprimez d’abord les packages à usage unique. E-mail, téléphone, QR, signature JWT, HTML conversion; chacun a un remplacement HTTP sur une ligne avec une clé révocable.
- Faire pivoter, ne pas enquêter, après exposition. Si des axios empoisonnés atterrissent dans votre arbre, faites pivoter chaque secret touché par l’environnement affecté. L'exfiltration se produit en quelques minutes.
-
Ajoutez un garde CI. Bloquer nouveau
postinstallcrochets d'atterrir dans votre fichier de verrouillage sans examen humain. Le compromis axios aurait fait trébucher cette garde.
Botoi fournit des remplacements HTTP pour les cinq packages ci-dessus et environ 145 autres à usage unique utilitaires : hachage, génération d'UUID, tests d'expressions régulières, conversion d'horodatage, validation de schéma JSON, génération de codes-barres, rendu PDF et le reste. Une clé API, 5 req/min sur l'offre gratuite, non installer des crochets. Parcourez le documents interactifs ou câblez le Serveur MCP dans votre Agent de codage IA pour appeler les mêmes points de terminaison depuis Claude Code ou Cursor sans quitter l'éditeur.
FAQ
- Que s'est-il passé avec le package axios npm en mars 2026 ?
- Entre le 31 mars 2026, 00h21 et 03h20 UTC, un attaquant a utilisé un compte de responsable compromis pour publier axios 1.14.1 et 0.30.4 avec une dépendance post-installation malveillante appelée plain-crypto-js. La dépendance a téléchargé des implants RAT spécifiques à la plate-forme à partir de sfrclak[.]com:8000. Google Threat Intelligence attribue l'opération à UNC1069, un acteur lié à la Corée du Nord. Les packages ont duré environ trois heures, suffisamment longtemps pour atterrir dans les caches CI et les ordinateurs portables des développeurs du monde entier.
- Le remplacement des packages npm par des API HTTP réduit-il les risques ?
- Cela réduit la surface d’attaque de deux manières. Tout d’abord, vous supprimez un hook de post-installation qui exécute du code arbitraire sur votre serveur de build. Deuxièmement, vous déplacez la logique de validation de l'ordinateur portable du développeur vers un point de terminaison signé uniquement HTTPS que vous contrôlez via la rotation des clés API. Un paquet empoisonné s'exécute avant que vous puissiez réagir ; une clé API révoquée cesse de fonctionner en quelques secondes.
- Un appel HTTP est-il plus lent qu'un package npm local ?
- Pour un seul appel sur demande à froid, oui ; la latence typique de l'API botoi est de 50 à 150 ms entre un client en Amérique du Nord et la périphérie de Cloudflare. Pour la plupart des flux côté serveur (inscription, paiement, traitement des webhooks) qui chevauchent les appels DB que vous effectuez déjà, cela n'ajoute rien de mesurable. Pour les chemins à haut débit, mettez en cache la réponse par hachage d’entrée pour le même profil de latence qu’un package local.
- Comment puis-je auditer mon dépôt pour les packages npm à risque dès maintenant ?
- Exécutez npm audit --omit=dev pour faire apparaître les dépendances de production, puis inspectez tout package avec un hook de postinstallation ou de préinstallation à l'aide des scripts npm ls et npm view {name}. Les packages qui font une petite chose (validation d'e-mail, génération QR, signature JWT, analyse téléphonique, suppression HTML) sont de bons candidats pour passer à un appel HTTP. Les packages qui effectuent de la cryptographie ou récupèrent activement le contenu du réseau sont les cibles d'audit les plus prioritaires.
- Que se passe-t-il si un fournisseur d'API HTTP est compromis au lieu de npm ?
- Le rayon de souffle est plus petit et la détection plus rapide. Vous contrôlez la clé API et pouvez la révoquer en un seul appel. Votre fournisseur expose une page d'état, un flux RSS d'incident et des réponses signées via HTTPS. Comparez cela à un package exécuté dans votre build où la détection nécessite la lecture de chaque hook post-installation dans votre arborescence de dépendances transitives. Le risque zéro n’est pas non plus le cas ; l’un vous donne des leviers, l’autre non.
Commencez a construire avec botoi
150+ endpoints API pour la recherche, le traitement de texte, la generation d'images et les utilitaires pour developpeurs. Offre gratuite, sans carte bancaire.