Dans les entrailles d'une supply chain attack
REX de Shai-Hulud 2.0 et enseignements

Maxime Dupont

OVHcloud

Agenda

  1. L'attaque — contexte, chronologie et mécanisme technique
  2. Les enseignements — détection, remédiation et protection
  3. Questions / Réponses
 
portrait de Maxime

🦩 Maxime Dupont 🦩

OVHcloud · Alternatiba · Shifters

Jardinage · Bricolage · Jeux de société · Cinéma

maximedupont.fr - m.dupont103@gmail.com

Partie 1 — L'attaque

C'est quoi une supply chain attack ?

Vous n'attaquez pas la cible directement. Vous compromettez un de ses fournisseurs.

  1. Un attaquant compromet un paquet npm populaire
  2. Le paquet npm est installé par un développeur / une CI
  3. Cela donne accès aux secrets, aux tokens et aux infra cloud

Shai-Hulud 2.0 — "The Second Coming"

Une première attaque a eu lieu en septembre 2025. Deux mois plus tard, une deuxième version voit le jour.

MétriqueValeur
Paquets npm compromis796
Téléchargements hebdo cumulés20 millions+
Repos GitHub exposés25 000+
Secrets exfiltrés294 842
Durée de l'attaque48h (21-23 nov.)

Victimes notables

Zapier, PostHog, Postman, ENS Domains

Anatomie technique — Stage 0

Compromettre un premier package npm (ingénierie sociale)

Anatomie technique — Stage 1

Le paquet compromis contient un preinstall script dans package.json :

{
  "scripts": {
    "preinstall": "node setup_bun.js"
  }
}

Pourquoi preinstall ?

  • S'exécute avant l'installation
  • S'exécute même si l'installation échoue
  • Le fichier setup_bun.js est volontairement non obfusqué et bien documenté — il se fait passer pour un installeur légitime du runtime Bun
L'attaquant joue sur la confiance : le code a l'air normal à première vue.

Anatomie technique — Stage 2

setup_bun.js télécharge et exécute bun_environment.js — un fichier de 10 Mo, obfusqué.

Ce qu'il fait

  1. Énumère les variables d'environnement : tokens npm, GitHub, AWS, Azure...
  2. Scanne les fichiers SSH, .env, configs git, historique
  3. Télécharge et exécute Trufflehog (outil légitime de détection de secrets) pour scanner tout le répertoire home
  4. Collecte tout dans des fichiers JSON structurés : cloud.json, environment.json, actionsSecrets.json

Anatomie technique — Auto-réplication

S'il trouve un token npm valide → il republie les paquets accessibles avec le payload malicieux inclus. Le ver se propage.

Anatomie technique — Exfiltration

pas de serveur C2 (Command and Control) classique.

  1. Création d'un repo GitHub public "Sha1-Hulud: The Second Coming"
  2. Push les secrets volés

Anatomie technique — Le payload destructif

Si le malware ne trouve ni token npm, ni token GitHub :

  • Destruction du répertoire home de l'utilisateur
  • Écrasement sécurisé + suppression de chaque fichier accessible en écriture
C'est la première supply chain attack npm avec un mécanisme de sabotage punitif.

Partie 2 — Les enseignements

Pourquoi ça nous concerne ?

On utilise (tous) npm et si on n'utilise pas npm, on en utilise d'autres

Luck isn't a security strategy.
Ryan Sobol — Principal Software Engineer at the Seattle Times

Comment l'attaque a été détectée ?

Ecosystème

Connaissez votre écosystème !

Veille technique

Veillez ! → Hacker news

Tooling

Analyse de vulnérabilité sur la CI, Dépendabot, Artifactory, ...

Remédiation — Les premières heures

Si vous découvrez que vous êtes compromis :

ActionDétail
Ne pas supprimer le repo malveillantLe privatiser immédiatement pour stopper l'exposition
Désactiver les workflows malicieuxVérifier tous les self-hosted runners
Supprimer les paquets infectésReverter aux versions saines connues, surtout sur les registres internes
Révoquer TOUS les secretsPas seulement ceux trouvés dans le repo — tous
Auditer les accèsQui a installé quoi, quand, sur quelle machine

Se protéger — les basiques

  • Utiliser des jetons scoppés (local / CI)
  • Obliger la signature des commits
  • Utiliser des passphrase
  • Toujours publier depuis une CI
  • Trusted Publisher

Se protéger — package manager

Le choix du package manager est la première ligne de défense.

Choix du manager de paquets

Gestionnaire de paquetsVersionDate
Yarnv2.0Jan. 2020
Bun*v1.0Sept. 2023
pnpm**v10.0Jan. 2025
npm***--
  • *Avec bun, 367 librairies "reconnues" utilisant un postinsall sont whitelisté.
  • **Avec pnpm, strictDepBuilds permet de faire échouer l'installation
  • ***Avec npm, cela peut être configuré manuellement --ignore-scripts.

Se protéger — gérer les exceptions

Contrôler quels paquets sont autorisés à exécuter des lifecycle scripts.

Gestionnaire de paquetsParamètreDisponible depuis
YarnenableScripts (per-dep)v2.0 (Jan. 2020)
BuntrustedDependencies (per-dep)v1.1 (Avr. 2024)
pnpmonlyBuiltDependenciesv9.1 (Mai 2024)
npm--

Avantages

  • List explicite des dépendances
  • Approbation manuellement
  • Visible en code review

Se protéger — minimumReleaseAge

Bloquer l'installation de versions publiées trop récemment — le temps que la communauté détecte les paquets malicieux.

# .npmrc (pnpm)
minimum-release-age=3d
minimum-release-age-exclude=my-org
Les 796 paquets compromis ont été publiés et détectés en 48h — un délai de 3 jours les aurait tous bloqués.
Gestionnaire de paquetsParamètreDisponible depuis
npmminimum-release-agev11.11 (feb. 2026)
pnpmminimum-release-agev10.16 (sept. 2025)
YarnnpmMinimalAgeGatev4.10.0 (sept. 2025)
BunSupport natifv1.3 (oct. 2025)

Se protéger — trustPolicy

Ce contrôle bloque l’installation lorsqu’une version d’un package a une authentification plus faible que les versions publiées précédemment.

Gestionnaire de paquetsParamètreDisponible depuis
pnpmtrustPolicy: "no-downgrade"v9 (~2024)
npm
Yarn
Bun

Se protéger — npm et CI/CD

Si vous utilisez npm :

npm config set ignore-scripts true     # Désactive tous les lifecycle scripts
npm install --ignore-scripts           # Par installation

En CI/CD, toujours builder avec --ignore-scripts et exécuter les scripts nécessaires manuellement après audit.

Résumé — Ce qu'il faut retenir

  1. npm est un vecteur d'attaque majeur
  2. Les preinstall scripts sont dangereux
  3. Les tokens sont la cible n°1
  4. La CI/CD est une surface d'attaque
  5. Security by design
  6. Shai-Hulud 2.0 a introduit le sabotage

Questions ?

Posez vos questions — sur l'attaque, les mesures de protection.

Pour aller plus loin