- Deux versions malveillantes du très utilisé client HTTP axios ont été publiées sur npm et déploient, lors de l’installation, un cheval de Troie d’accès à distance (RAT)
- L’attaquant a contourné GitHub Actions et téléversé manuellement les paquets malveillants après avoir volé les identifiants du compte du mainteneur
- Les versions malveillantes incluaient une fausse dépendance
plain-crypto-js@4.2.1qui installait le RAT via un scriptpostinstallpuis effaçait ses traces - Le RAT infecte macOS, Windows et Linux, communique avec le serveur C2 (
sfrclak.com:8000) et télécharge des charges utiles supplémentaires - npm et GitHub ont rapidement supprimé les versions malveillantes, mais l’incident remet en lumière l’importance du renforcement de la sécurité de la supply chain et de la protection des identifiants
Vue d’ensemble de l’attaque sur la supply chain npm d’axios
- Le 31 mars 2026, deux versions malveillantes de la très utilisée bibliothèque cliente HTTP axios (
axios@1.14.1,axios@0.30.4) ont été publiées sur npm - L’attaquant a volé les identifiants npm d’un mainteneur principal d’axios, contourné le pipeline CI/CD GitHub Actions et publié manuellement les paquets malveillants
- Les deux versions inséraient une fausse dépendance,
plain-crypto-js@4.2.1, dont le scriptpostinstallinstallait un cheval de Troie d’accès à distance (RAT) - Le RAT vise macOS, Windows et Linux, et communique avec le serveur C2 (Command and Control)
sfrclak.com:8000pour télécharger une charge utile de deuxième étape - Après l’installation, le code malveillant supprime ses fichiers et remplace le
package.jsonpar une version propre afin d’échapper à la détection forensique
Chronologie de l’attaque
- 30 mars 05:57 UTC : publication de
plain-crypto-js@4.2.0(version légitime) - 30 mars 23:59 UTC : publication de
plain-crypto-js@4.2.1(version malveillante), avec ajout d’un hookpostinstall - 31 mars 00:21 UTC : publication de
axios@1.14.1, avec insertion de la dépendance malveillante - 31 mars 01:00 UTC : publication de
axios@0.30.4, avec la même dépendance malveillante - 31 mars 03:15 UTC : npm supprime les deux versions malveillantes
- 31 mars 04:26 UTC : npm remplace
plain-crypto-jspar un stub de protection de sécurité (0.0.1-security.0)
Présentation d’axios
- axios est le client HTTP le plus largement utilisé dans l’écosystème JavaScript, aussi bien côté Node.js que dans le navigateur
- Avec plus de 300 millions de téléchargements hebdomadaires, une seule release malveillante peut avoir un impact à très grande échelle
- Pour un développeur classique, il est difficile de remarquer l’installation de code malveillant lors d’un
npm install
Étapes de l’attaque
-
Étape 1 — Compromission du compte du mainteneur
- L’attaquant a compromis le compte npm
jasonsaaymanet changé l’adresse e-mail enifstap@proton.me - Il a ensuite publié des builds malveillants sur les branches de release 1.x et 0.x
- Les releases légitimes sont publiées via OIDC Trusted Publisher de GitHub Actions, mais
axios@1.14.1a été publié manuellement, sansgitHeadni signature OIDC - L’attaquant est soupçonné d’avoir utilisé un token d’accès npm à longue durée de vie
- L’attaquant a compromis le compte npm
-
Étape 2 — Pré-déploiement de la dépendance malveillante
plain-crypto-js@4.2.1a été publié depuis le comptenrwise@proton.me- Le paquet usurpe
crypto-jsen réutilisant la même description et l’URL du dépôt - Il contient le hook
"postinstall": "node setup.js", exécuté automatiquement à l’installation - Après l’attaque,
package.mdest remplacé parpackage.jsonafin de préparer l’effacement des preuves
-
Étape 3 — Injection de la dépendance dans axios
plain-crypto-js@^4.2.1est ajouté comme dépendance d’exécution- Le code ne l’importe jamais → dépendance fantôme
- Lors d’un
npm install, elle est installée automatiquement et exécute le scriptpostinstall
Analyse du dropper RAT (setup.js)
-
Techniques d’obfuscation
- Les chaînes sont stockées de façon chiffrée dans le tableau
stq[]puis déchiffrées via_trans_1(XOR) et_trans_2(Base64 + inversion) - L’URL du C2 est
http://sfrclak.com:8000/6202033 - Les chaînes déchiffrées incluent des identifiants d’OS (
win32,darwin), des chemins de fichiers et des commandes shell
- Les chaînes sont stockées de façon chiffrée dans le tableau
-
Charges utiles selon la plateforme
-
macOS
- Un AppleScript est écrit dans
/tmppuis exécuté viaosascript - Le binaire RAT est récupéré depuis le C2, enregistré dans
/Library/Caches/com.apple.act.mond, puis exécuté - Le nom du fichier imite un daemon système Apple
- Un AppleScript est écrit dans
-
Windows
- Le chemin de PowerShell est recherché puis le fichier est copié vers
%PROGRAMDATA%\wt.exe - Un VBScript télécharge et exécute depuis le C2 un RAT PowerShell
- Les fichiers temporaires (
.vbs,.ps1) sont supprimés après exécution
- Le chemin de PowerShell est recherché puis le fichier est copié vers
-
Linux
curltélécharge/tmp/ld.py, puis celui-ci est lancé avecnohup python3- Le fichier
/tmp/ld.pyreste présent - Sur les trois plateformes, le corps POST envoyé à
packages.npm.org/product0~2sert à imiter un trafic npm légitime
-
-
Auto-suppression et dissimulation
setup.jsetpackage.jsonsont suppriméspackage.mdest remplacé parpackage.jsonafin de faire passer le paquet pour légitime- Ensuite, ni
npm auditni une revue manuelle ne permettent de le détecter - En revanche, la présence de
node_modules/plain-crypto-js/constitue en elle-même une preuve d’infection
Validation de l’exécution avec StepSecurity Harden-Runner
- Harden-Runner journalise en temps réel les événements réseau, processus et fichiers dans GitHub Actions
- Lors de l’installation de
axios@1.14.1, deux connexions au C2 (curl,nohup) ont été détectées- La première a eu lieu 2 secondes après le début de
npm install - La seconde, 36 secondes plus tard, s’est poursuivie via un processus en arrière-plan
- La première a eu lieu 2 secondes après le début de
- L’analyse de l’arbre des processus montre que le processus
nohup, devenu orphelin sous PID 1 (init), continue de s’exécuter durablement - Les journaux d’événements fichiers montrent que
package.jsona été réécrit deux fois- Première fois : écriture de la version malveillante pendant l’installation
- Deuxième fois : 36 secondes plus tard, remplacement par un stub propre
Indicateurs de compromission (IOC)
-
Paquets npm malveillants
- axios@1.14.1 · shasum : 2553649f232204966871cea80a5d0d6adc700ca
- axios@0.30.4 · shasum : d6f3f62fd3b9f5432f5782b62d8cfd5247d5ee71
- plain-crypto-js@4.2.1 · shasum : 07d889e2dadce6f3910dcbc253317d28ca61c766
-
Réseau
- Domaine C2 : sfrclak.com
- IP : 142.11.206.73
- URL :
http://sfrclak.com:8000/6202033
-
Chemins de fichiers
- macOS :
/Library/Caches/com.apple.act.mond - Windows :
%PROGRAMDATA%\wt.exe - Linux :
/tmp/ld.py
- macOS :
-
Comptes attaquants
jasonsaayman(mainteneur compromis)nrwise(compte créé par l’attaquant)
-
Version sûre
- axios@1.14.0 (légitime)
Vérification d’impact et procédure de réponse
- Vérifier dans
npm list axiosoupackage-lock.jsonla présence de 1.14.1 / 0.30.4 - Vérifier l’existence de
node_modules/plain-crypto-js - Si les fichiers RAT sont présents selon l’OS, considérer le système comme totalement compromis
- Vérifier dans les logs CI/CD si ces versions ont été installées, puis remplacer tous les secrets et tokens
Étapes de remédiation
- Épingler axios sur une version sûre (
1.14.0ou0.30.3) - Supprimer le dossier
plain-crypto-js, puis réinstaller avecnpm install --ignore-scripts - En cas de traces du RAT, reconstruire le système
- Faire tourner toutes les informations d’identification (AWS, SSH, CI/CD, etc.)
- Auditer le pipeline CI/CD et remplacer les secrets
- Utiliser l’option
--ignore-scriptslors des builds automatisés - Bloquer le domaine/l’IP du C2 via le pare-feu ou
/etc/hosts
Fonctionnalités StepSecurity Enterprise
-
Harden-Runner
- Application d’une liste blanche des sorties réseau dans GitHub Actions
- Blocage des trafics anormaux et journalisation
- Possibilité de bloquer en amont la connexion à
sfrclak.com:8000
-
Dev Machine Guard
- Supervision en temps réel des paquets npm installés sur les PC des développeurs
- Détection immédiate des machines ayant installé
axios@1.14.1ou0.30.4
-
npm Package Cooldown Check
- Application d’une période temporaire de blocage d’installation sur les nouveaux paquets publiés
- Permet de détecter des publications malveillantes rapides comme
plain-crypto-js@4.2.1
-
Compromised Updates Check
- Blocage des merges de PR à partir d’une base de données temps réel de paquets malveillants
axios@1.14.1etplain-crypto-js@4.2.1y sont ajoutés immédiatement
-
Package Search
- Recherche dans l’ensemble des PR et dépôts d’une organisation pour localiser où un paquet est introduit
- Permet d’identifier immédiatement le périmètre d’impact (dépôts, équipes, PR)
-
AI Package Analyst
- Surveillance en temps réel du registre npm et détection comportementale des paquets malveillants
- Les deux versions malveillantes ont été détectées quelques minutes après leur publication
-
Threat Center Alert
- Fournit des alertes de threat intel incluant résumé de l’attaque, IOC et procédure de réponse
- Offre une visibilité en temps réel via l’intégration SIEM
Remerciements
- Les mainteneurs d’axios et la communauté ont réagi rapidement via la GitHub issue #10604
- GitHub a suspendu le compte compromis et npm a supprimé les versions malveillantes tout en appliquant le security holder
- La réponse coordonnée entre mainteneurs, GitHub et npm a permis de limiter les dégâts pour les développeurs du monde entier
Aucun commentaire pour le moment.