Attaque NPM Shai-Hulud : Analyse d'une campagne impliquant des mécanismes de réplication
- Loïc Castel
- il y a 2 jours
- 5 min de lecture
Sommaire
Shai-Hulud, c'est pas le ver des sables dans Dune ?

Tout d’abord, cet article n’est pas une seconde version de notre article de blog (https://www.safercy.com/post/la-plus-grande-attaque-de-supply-chain-de-l-histoire-javascript) de la semaine dernière mais concerne bien une autre attaque séparée, qui fonctionne sur le même principe, certes, mais qui a un impact bien différent. En revanche, l'impact de l'attaque Shai-Hulud est très proche de l'attaque S1ngularity, documentée ici : https://www.safercy.com/post/s1ngularity-une-attaque-bien-singuli%C3%A8re
L'écosystème NPM a été la cible d'une attaque d'approvisionnement majeure découverte le 15 septembre 2025. Cette campagne, baptisée "Shai-Hulud" en référence aux vers des sables de Dune, représente une évolution dangereuse des menaces sur la chaîne d'approvisionnement logicielle. Contrairement aux attaques NPM mentionnées plus haut, le malware injecté présente des capacités d'auto-propagation similaires à celles d'un ver informatique, lui permettant de se répandre automatiquement à travers l'écosystème JavaScript.
L'attaque a initialement été détectée lors de la compromission du package populaire @ctrl/tinycolor, qui cumule plus de 2,2 millions de téléchargements hebdomadaires. Cependant, l'ampleur réelle de cette campagne s'est rapidement révélée beaucoup plus importante, touchant par effet de rebond plus de 180 packages différents appartenant à de multiples mainteneurs.
Impact
Packages NPM compromis
L'attaque Shai-Hulud a infecté un nombre considérable de packages NPM populaires. Parmi les packages les plus notables compromis figurent :
Packages majeurs touchés :
@ctrl/tinycolor (2,2 millions de téléchargements hebdomadaires) - versions 4.1.1 et 4.1.2
ngx-bootstrap (300k téléchargements hebdomadaires)
ng2-file-upload (100k téléchargements hebdomadaires)
angulartics2 (version 14.1.2)
Organisations impactées :
CrowdStrike : 9 packages NPM compromis
Crowdstrike a déjà investigué cet incident, qui ne se révèle pas impactant pour leurs clients. Voici leur communiqué :
After detecting several malicious Node Package Manager (NPM) packages in the public NPM registry, a third-party open source repository, we swiftly removed them and proactively rotated our keys in public registries. These packages are not used in the Falcon sensor, the platform is not impacted and customers remain protected. We are working with NPM and conducting a thorough investigation.
NativeScript : Plusieurs packages de la communauté @nativescript-community
Multiples packages de l'espace de noms @ctrl/ incluant @ctrl/deluge, @ctrl/golang-template, et @ctrl/magnet-link
Actions malveillantes réalisées
Le malware Shai-Hulud exécute plusieurs actions critiques une fois déployé :
Vol et exfiltration de secrets : Extraction des tokens NPM, GitHub, AWS, GCP et Azure depuis les variables d'environnement et les endpoints de métadonnées cloud
Création de repositories publics : Publication automatique d'un repository GitHub public nommé "Shai-Hulud" contenant les secrets volés encodés en JSON
Injection de workflows malveillants : Déploiement du fichier .github/workflows/shai-hulud-workflow.yml pour maintenir la persistance et exfiltrer les secrets des repositories
Propagation automatique : Utilisation des tokens NPM découverts pour republier automatiquement d'autres packages avec le code malveillant intégré
Exposition de repositories privés : Transformation de repositories privés en repositories publics ou création de nouvelles branches nommées "shai-hulud"

Au moment de la découverte, environ 200 paquets NPM infectés avaient été identifiés, avec une propagation rapide dans les premières 24 heures avant que les mesures de réponse ne ralentissent la spread.
Fonctionnement du code malveillant
Mécanisme d'exécution initial
Le malware Shai-Hulud s'exécute via un script bundle.js de plus de 3MB intégré dans les packages NPM compromis. Ce script est déclenché automatiquement lors de la phase post-installation des packages via la directive suivante dans le fichier package.json :
{
"scripts": {
"postinstall": "node bundle.js"
}
}
Phase de reconnaissance et collecte
Une fois activé, le malware effectue une reconnaissance complète du système cible :
Scan des variables d'environnement : Recherche spécifique des tokens GITHUB_TOKEN, NPM_TOKEN, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
Utilisation de TruffleHog : Téléchargement et exécution de l'outil légitime TruffleHog (https://github.com/trufflesecurity/trufflehog) pour scanner le système de fichiers à la recherche de plus de 800 types de secrets différents :
trufflehog filesystem . --json --results=verified
Interrogation des endpoints de métadonnées cloud : Extraction des credentials depuis les services IMDS d'AWS, GCP et Azure
Mécanisme de propagation auto-réplicante
La caractéristique la plus dangereuse de Shai-Hulud réside dans sa capacité d'auto-propagation :
Énumération des packages : La fonction getPackagesByMaintainer() récupère la liste des packages maintenus par l'utilisateur compromis et les trie par nombre de téléchargements mensuels
Modification automatique : La fonction updatePackage() télécharge le package cible, modifie le package.json pour ajouter le script postinstall, injecte le fichier bundle.js malveillant, et republie automatiquement le package
Validation des credentials : Vérification de la validité des tokens via les API npm whoami et GitHub user avant leur utilisation
Exfiltration des données
Le malware emploie deux méthodes simultanées pour exfiltrer les données volées :
Repository GitHub public : Création d'un repository "Shai-Hulud" contenant un fichier JSON avec les secrets collectés, les informations système et les variables d'environnement
GitHub Actions malveillant : Injection du workflow .github/workflows/shai-hulud-workflow.yml qui encode les secrets en JSON et les transmet vers le serveur webhook[.]site contrôlé par l'attaquant
A noter que la version gratuite du site avait été utilisée, limitée à 100 interactions, et vite bloquée par la plateforme webhook site en raison de l’utilisation excessive
Recommandations
Mesures immédiates de réponse
Audit des comptes GitHub :
Vérifier la présence de repositories publics non autorisés, en particulier ceux avec la description "Shai-Hulud Migration"
Rechercher les nouvelles branches nommées "shai-hulud" dans vos repositories
Examiner les workflows GitHub Actions récemment ajoutés, spécifiquement .github/workflows/shai-hulud-workflow.yml
Nettoyage des packages NPM :
Identifier et supprimer immédiatement toutes les versions affectées des packages compromis
Purger le cache NPM local et réinstaller tous les packages pour éliminer les dépendances compromises
Analyser les logs CI/CD pour identifier les accès suspects à npm publish
Rotation des clés et identifiants
En cas de compromission confirmée, procéder immédiatement à la rotation complète de tous les tokens et clés :
Tokens NPM de publication
Tokens d'accès personnel GitHub (PAT)
Clés d'accès AWS (Access Key ID et Secret Access Key)
Credentials de service Google Cloud Platform
Tokens d'authentification Azure
Si du code source privé a été passé en public, vérifiez que le code ne contient pas de données d’authentification en dur et, si c’est le cas, renouvelez ces identifiants.
Mesures préventives à long terme
Surveillance et détection :
Implémenter une surveillance continue des publications de packages via les API NPM
Mettre en place des alertes pour les modifications non planifiées des package.json
Utiliser des solutions de sécurité de la chaîne d'approvisionnement comme Falco ou Sysdig Secure pour la détection en temps réel
Durcissement des processus :
Implémenter une période d'attente avant l'adoption de nouvelles dépendances pour réduire l'exposition aux attaques fraîches
Utiliser des registres NPM privés avec validation des packages
Mettre en place l'authentification à deux facteurs (2FA) obligatoire pour tous les comptes NPM et GitHub
Effectuer des audits réguliers des dépendances avec des outils comme npm audit ou des solutions tierces
Cette attaque Shai-Hulud marque une escalade significative dans la sophistication des menaces sur l'écosystème JavaScript, démontrant la nécessité d'une vigilance accrue et de mesures de sécurité renforcées pour tous les développeurs utilisant NPM.
Safercy peut vous accompagner et propose les prestations suivantes :
Réponse à incident en cas de suspicion de compromission ou pour une recherche proactive type “threat hunting” - https://www.safercy.com/pentest-tests-d-intrusion
Pentest & audits afin de valider que votre code source n’est pas affecté et afin de vous accompagner dans vos processus de sécurisation et DevOps - https://www.safercy.com/reponse-a-incident