NIS2 50+ salariés ou €10M+ CA : reporting d’incident en 72h obligatoire. Reporting d’incident en 72h obligatoire. Êtes-vous prêt ? →
Skip to main contentSkip to footer

Compromission TanStack Mini Shai-Hulud (npm) : la checklist pratique pour PME-ETI

Mise à jour du 20 mai 2026 : ce qui a démarré le 11 mai sur 84 paquets du namespace @tanstack est devenu en neuf jours la plus grande campagne supply chain npm de l’année. Le tracker public Socket recense au 20 mai 639 versions compromises réparties sur 323 paquets uniques, dont 558 versions sur 279 paquets du namespace @antv ajoutées dans la nuit du 19 au 20 mai. Le marqueur du ver est désormais visible sur 2 100 dépôts GitHub publics, et le groupe TeamPCP — auteur de la campagne, identifié grâce à l’open-sourcing de Shai-Hulud puis au breach de 3 800 dépôts internes de GitHub — continue d’industrialiser les vagues à un rythme d’un nouveau namespace touché tous les deux à trois jours.

Le 11 mai 2026, l’équipe Socket a publié l’analyse de la première vague d’une compromission massive de paquets npm publiés sous le namespace @tanstack. 84 artefacts ont été immédiatement concernés, dont @tanstack/react-router et plus de 12 millions de téléchargements hebdomadaires cumulés, et la campagne attaquante — baptisée TanStack Mini Shai-Hulud — a rapidement touché OpenSearch, Mistral AI et Guardrails AI. Pour toute PME-ETI dont les équipes développent en JavaScript / TypeScript ou opèrent des pipelines CI/CD, le risque est concret : un simple npm install dans la mauvaise fenêtre suffit à exfiltrer secrets cloud, tokens GitHub et identifiants Kubernetes. Voici l’analyse de l’attaque et la checklist pratique pour vérifier votre exposition et nettoyer vos environnements.

TanStack Mini Shai-Hulud : la chaîne d’attaque expliquée pas à pas

Le point d’entrée n’est pas une fuite de credentials npm. Les attaquants ont exploité un workflow GitHub Actions vulnérable au pattern « Pwn Request » via pull_request_target : une pull request hostile fait exécuter du code attaquant dans le contexte du dépôt légitime, ce qui permet de polluer le cache du runner et d’en extraire en mémoire le jeton OIDC. Ce jeton OIDC, lié à la fédération de confiance entre GitHub Actions et npm, autorise ensuite des publications sur le registre sans qu’aucun secret n’ait jamais été dérobé. C’est élégant, silencieux, et cela passe sous les radars des audits classiques de tokens.

Une fois publié, le paquet piégé embarque deux fichiers JavaScript hautement obfusqués — router_init.js (≈2,3 Mo, dispatcher invoqué 2 864 fois) et tanstack_runner.js — accompagnés d’une dépendance optionnelle @tanstack/setup qui pointe vers un commit GitHub orphelin. À l’installation, le script vérifie une variable __DAEMONIZED, se duplique en démon détaché avec stdio supprimé, puis pose plusieurs persistances :

  • Dépose .claude/router_runtime.js, .claude/settings.json et .claude/setup.mjs — usurpant volontairement l’arborescence légitime du bot Claude Code d’Anthropic.
  • Crée .vscode/setup.mjs et .vscode/tasks.json pour s’exécuter à chaque ouverture de l’IDE.
  • Si l’environnement est un runner GitHub Actions : énumère les secrets du dépôt via l’API GitHub, tente d’obtenir un token IMDSv2 sur 169.254.169.254 pour piller AWS, lit les variables VAULT_TOKEN et VAULT_ADDR, et lit les jetons de service account Kubernetes dans /var/run/secrets/kubernetes.io/serviceaccount/.
  • Mint un nouveau token de publication npm via OIDC, recherche tous les paquets appartenant au mainteneur compromis et republie le payload worm-style sous le tag latest — en générant au passage une attestation Sigstore valide qui donne un faux signal de confiance.
  • Réinjecte le malware dans les dépôts source via la mutation GraphQL createCommitOnBranch, en signant les commits avec l’adresse [email protected] pour imiter le bot officiel Claude Code.
  • Exfiltre l’ensemble via le réseau P2P chiffré Session, sur filev2.getsession.org, ce qui rend la signature réseau quasi indistinguable d’une messagerie chiffrée légitime.

Vague @antv et propagation au dépôt aidenybai/million : la campagne mute

La vague du 19-20 mai cible désormais @antv, l’écosystème de visualisation de données très populaire dans la stack data des PME-ETI (G2, AVA, S2, X6). D’après Socket, 558 versions sur 279 paquets ont été republiées en quelques heures, la majorité détectées en moins de 6 minutes après publication. Le payload conserve la même boîte à outils que TanStack Mini Shai-Hulud — récolte de secrets, exfiltration via Session, persistance dans .claude/ — mais ajoute une logique de propagation plus agressive : valider les tokens npm volés, énumérer les paquets du mainteneur, injecter le payload et republier sous l’identité compromise. C’est exactement le code de propagation worm que TeamPCP avait dans le framework Shai-Hulud open-sourcé.

En parallèle, le dépôt GitHub aidenybai/million (bibliothèque React très populaire) a été compromis avec une variante intéressante : injection d’un fichier .claude/settings.json qui ajoute un hook exécutant la charge Shai-Hulud complète au démarrage de l’agent Claude Code. Aucun paquet npm publié n’est pour l’instant infecté, mais tout développeur clonant le dépôt et lançant Claude Code dessus déclenche le payload sur sa machine. Le périmètre d’IoC s’étend donc maintenant à tout fichier .claude/settings.json inattendu dans un repo cloné récemment, indépendamment des dépendances npm.

Êtes-vous touché ? Le diagnostic en 4 commandes

Avec 323 paquets uniques et plus de 2 100 dépôts GitHub porteurs du marqueur, la probabilité qu’au moins un environnement de votre PME-ETI ait croisé la campagne est désormais significative. Exécutez ces vérifications sur chaque poste développeur, runner CI et environnement de build :

  • Recherche des paquets dans vos lockfiles :
    grep -RIn -E "@tanstack/|@antv/" package-lock.json yarn.lock pnpm-lock.yaml 2>/dev/null

    Tout résultat doit faire l’objet d’une vérification de version contre les listes publiées par TanStack, @antv et Socket.

  • Détection des fichiers payload sur le filesystem :
    find / -type f \( -name router_init.js -o -name router_runtime.js -o -name tanstack_runner.js \) 2>/dev/null

    Toute occurrence en dehors d’un répertoire node_modules/@tanstack/ ou node_modules/@antv/ légitime est suspecte par défaut.

  • Vérification des hashs de fichiers suspects :
    shasum -a 256 ./node_modules/**/router_init.js 2>/dev/null

    Hashs malveillants connus : ab4fcadaec49c03278063dd269ea5eef82d24f2124a8e15d7b90f2fa8601266c (router_init.js) et 2ec78d556d696e208927cc503d48e4b5eb56b31abc2870c2ed2e98d6be27fc96 (tanstack_runner.js).

  • Audit des persistances dans les répertoires usurpés :
    ls -la .claude/ .vscode/ 2>/dev/null
    git log --all --author="[email protected]" --oneline

    Tout fichier inattendu dans .claude/ (et qui n’a pas été créé par votre installation officielle Claude Code) doit être traité comme un IoC, de même que tout commit signé par [email protected] ne provenant pas de l’application GitHub officielle d’Anthropic.

Plan de remédiation en 7 étapes

Si l’un des indicateurs précédents remonte un résultat positif, considérez tout environnement potentiellement exposé comme compromis et appliquez la séquence suivante. Si rien ne remonte, traitez quand même les étapes 4 à 7 comme un durcissement préventif — la campagne TanStack Mini Shai-Hulud est encore active, mute namespace par namespace, et continuera de toucher d’autres mainteneurs.

  1. Geler les builds et les déploiements sur les projets exposés. Couper tout pipeline CI/CD qui utilise @tanstack/* ou @antv/* pour éviter une nouvelle propagation pendant l’investigation.
  2. Rotation immédiate des secrets exposés, par ordre de priorité : tokens npm de publication, PAT GitHub et fédérations OIDC, clés AWS (statiques et rôles assumés), tokens Vault, certificats et tokens Kubernetes des service accounts montés dans les pods de build.
  3. Nettoyer les artefacts laissés par le payload : supprimer les répertoires .claude/ et .vscode/ suspects, purger le cache GitHub Actions du dépôt (gh cache delete --all), purger ~/.npm/_cacache et ~/.npm-global côté développeur.
  4. Verrouiller les versions et activer la vérification d’intégrité : épingler une version saine connue de chaque paquet @tanstack/* et @antv/* dans le package-lock.json ou le pnpm-lock.yaml avec son champ integrity, et casser le build si le hash diverge. Refuser systématiquement les dépendances git:// non pinnées sur commit signé.
  5. Restreindre les permissions OIDC dans chaque workflow GitHub Actions : permissions: id-token: none par défaut, et id-token: write uniquement sur le job de publication explicite. Supprimer toute fédération pull_request_target dont vous n’avez pas absolument besoin.
  6. Bloquer l’exfiltration au pare-feu et au DNS : bloc DNS-level sur *.getsession.org (sauf usage légitime documenté de la messagerie Session) et règle de filtrage sortant sur tout runner ou poste de build vers cette plage. Cette mesure neutralise le canal d’exfiltration même si le payload s’exécute.
  7. Auditer la chaîne de provenance : ne pas se reposer uniquement sur les attestations Sigstore — la campagne TanStack a démontré qu’un attaquant disposant d’un token OIDC GitHub Actions peut en générer des valides pour des paquets malveillants. Croiser avec les hashs publiés par l’éditeur et un scanner type Socket, Snyk ou OSV-Scanner sur la chaîne CI/CD.

Détection EDR : ce que la sonde voit en temps réel

Face à un payload polymorphique qui change de namespace tous les deux jours et qui réémet des hashs uniques à chaque rebuild (cf. le framework Shai-Hulud open-sourcé), la détection par signature antivirus est structurellement en retard. La couche qui fait la différence opérationnelle est l’EDR couplé à une corrélation comportementale. Chez nos clients PME-ETI déployés sur le socle ucyber.ai, la sonde EDR (CrowdStrike Falcon dans la majorité des cas, pour la profondeur de télémétrie comportementale qu’elle apporte) déclenche typiquement sur les indicateurs suivants pendant une vague Mini Shai-Hulud :

  • Processus node qui charge un fichier obfusqué > 1 Mo depuis node_modules, immédiatement suivi d’une duplication en démon détaché (setsid, stdio fermé). C’est la signature comportementale du __DAEMONIZED du payload.
  • Sondage HTTP sortant vers 169.254.169.254 depuis un processus Node ou Python qui n’est pas un agent cloud officiel (cloud-init, ec2-instance-connect…). C’est la tentative de pillage du metadata service AWS.
  • Accès en lecture sur /var/run/secrets/kubernetes.io/serviceaccount/token par un processus non listé comme client Kubernetes légitime (kubelet, kube-proxy). C’est la récolte de jetons de service account dans un pod de build.
  • Création de fichiers dans .claude/ ou .vscode/ par un processus npm ou yarn pendant une session npm install. C’est la pose de persistance.
  • Flux sortant TCP vers filev2.getsession.org (résolution DNS et connexion), depuis un processus Node ou Python. C’est l’exfiltration.

Chacun de ces signaux pris isolément génère du faux positif ; c’est la corrélation temporelle de plusieurs d’entre eux dans une fenêtre de 60 secondes qui fait basculer le verdict en compromission probable. C’est le rôle du Agentic SOC ucyber.ai qui ingère cette télémétrie EDR : il applique des modèles IA souverains pour passer de plusieurs centaines d’évènements bruts à une fiche d’incident contextualisée en français, avec le périmètre des secrets potentiellement exposés et le plan de rotation déjà séquencé. Un dirigeant non technique reçoit en clair : « compromission probable poste développeur X, vague @antv 2026-05-20, rotation des tokens npm et AWS en cours » — et non pas un dump JSON d’alertes Falcon brutes à interpréter.

Cette architecture — capteur EDR + cerveau IA souverain — est ce qui permet à une PME-ETI sans équipe sécurité dédiée d’absorber la cadence des nouvelles vagues TeamPCP sans transformer chaque alerte en incident à gérer manuellement. La couverture défensive est exactement celle des grandes ETI, sans le coût d’un SOC interne 24/7.

Pourquoi la sécurité supply chain devient un sujet PME-ETI

La fréquence des compromissions de la chaîne logicielle a doublé en moins de 18 mois : PyTorch Lightning, Hugging Face, DAEMON Tools, TanStack, @antv, et le breach interne de GitHub par TeamPCP. Toutes ces attaques exploitent le même angle mort : la PME-ETI fait confiance par défaut à son écosystème open source, mais ne contrôle ni les comptes mainteneurs, ni la sécurité de leurs workflows CI. Quand un mainteneur tombe, c’est toute la chaîne en aval qui hérite du risque.

La directive NIS 2 impose désormais aux entreprises critiques et à leurs sous-traitants une obligation de maîtrise de la chaîne logicielle, incluant la vérification des dépendances tierces. Concrètement, pour une PME-ETI cela signifie trois actions structurantes : générer et conserver une SBOM (Software Bill of Materials) pour chaque application déployée, intégrer un scanner de dépendances dans la CI/CD, et formaliser une procédure de réponse à incident supply chain. Le coût initial est faible mais le bénéfice est immédiat — chaque nouvelle alerte type TanStack Mini Shai-Hulud devient une simple notification à traiter, et non une remontée d’urgence à chaud.

Conclusion : un signal d’alarme à ne pas sous-estimer

La campagne TanStack Mini Shai-Hulud est un cas d’école pour 2026 : elle ne repose sur aucun zero-day exotique, mais sur l’enchaînement d’une vulnérabilité de workflow CI, d’une chaîne de confiance OIDC mal cloisonnée et d’un canal d’exfiltration P2P qui contourne les signatures réseau. En neuf jours, le périmètre est passé de 84 à 639 versions compromises, la cible s’est étendue de TanStack à @antv, et le ver mutera vers le prochain namespace populaire dans les jours qui viennent. Aucune PME-ETI développant ou opérant du code JavaScript ne peut considérer le sujet comme « réservé aux géants du SaaS ». Les 4 commandes de diagnostic et les 7 étapes de remédiation décrites ici doivent être passées dans les 48 heures par toute équipe technique exposée, et l’EDR doit être posé en parallèle pour absorber les vagues à venir sans intervention humaine immédiate.

Sources

Renforcez dès maintenant la cybersécurité de votre PME ou ETI avec ucyber.ai.
Évaluez votre niveau de sécurité ou
contactez-nous pour en savoir plus.
Suivez-nous sur LinkedIn.

Réserver 15 min — diagnostic