Aller au contenu
Guide

Axios a été détourné : 5 packages npm à remplacer par des API HTTP

| 9 min read

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.

Server room with network cables representing supply chain infrastructure
Photo by Taylor Vick on Unsplash

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 install est 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 postinstall crochets 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.