Source: Trigger.dev (blog) — Post‑mortem publié par le CTO Eric Allam le 28 novembre 2025, décrivant une compromission le 25 novembre 2025 via le ver supply chain Shai‑Hulud 2.0 diffusé dans l’écosystème npm.
Résumé de l’incident
- Un ingénieur installe un package compromis (via
pnpm install) exécutant un script preinstall qui déploie TruffleHog pour exfiltrer des identifiants (GitHub, AWS, npm, variables d’environnement) et les pousser vers des dépôts GitHub éphémères. - L’attaquant mène ~17 h de reconnaissance (clonage massif de 669 dépôts depuis infrastructures US/Inde), surveille l’activité de l’ingénieur, puis lance une phase destructrice: force‑push de commits « init » attribués à « Linus Torvalds <[email protected]> » et fermeture de PRs (199 branches touchées, 42 PRs fermées). Certaines tentatives sont bloquées par la protection de branche.
- Détection rapide via une avalanche d’alertes Slack; en 4 minutes le compte compromis est retiré de l’organisation, stoppant l’attaque. Pas d’accès en écriture aux ressources AWS ni de compromission des packages npm de Trigger.dev.
Impact et périmètre
- Clonages: 669 dépôts (publics/privés), y compris infrastructure et docs internes.
- Branches affectées: 199 (force‑push), PRs: 42 fermées; rejets: 4 par protections de branche.
- npm non impacté: aucun package @trigger.dev/* compromis; publication protégée par 2FA et absence de token de publication sur la machine.
- AWS: uniquement des lectures (ECS, CloudWatch, notifications); AWS a émis une alerte proactive sur un ancien compte test exposant des appels caractéristiques de Shai‑Hulud.
Réponse et rétablissement
- Révocations en chaîne (GitHub, Infisical, AWS IAM Identity Center, Vercel, Cloudflare); blocage des sessions AWS SSO via deny policy; suppression login IAM user.
- Restauration des branches en ~7 h via: GitHub Events API (push « before »), forks publics et reflogs locaux.
- Clé privée d’une GitHub App trouvée dans la corbeille de l’ordinateur compromis (potentiellement exfiltrable); rotation immédiate. Aucune preuve d’accès non autorisé aux dépôts clients; Trigger.dev a contacté GitHub Support et notifié les clients concernés.
Fonctionnement technique de Shai‑Hulud 2.0
- Chaîne d’infection: script
preinstalllancesetup_bun.js→ détecte OS/arch, télécharge Bun, exécute en tâche de fondbun_environment.js(silencieux), TruffleHog scanne$HOME(tokens GitHub/AWS/GCP/Azure, npm, env vars, secrets CI) → exfiltration dans des dépôts GitHub aléatoires avec données triple base64 pour contourner le secret scanning. - Propagation npm: si un token npm est trouvé et valide, patch et republie les packages maintenus pour disséminer le ver.
- Fallback destructeur: si pas de secrets ni de propagation, tentative de suppression du répertoire $HOME.
IOCs et TTPs
- IOCs:
- Fichiers/artefacts:
setup_bun.js,bun_environment.js,cloud.json,contents.json,environment.json,truffleSecrets.json,actionsSecrets.json,.trufflehog-cache,trufflehog_3.91.1_darwin_amd64.tar.gz. - Modus exfiltration: dépôts GitHub aléatoires (ex.
xfjqb74uysxcni5ztn,ls4uzkvwnt0qckjq27,uxa7vo9og0rzts362c), contenus triple base64. - Vandalisme: commits « init » attribués à Linus Torvalds <[email protected]>; PRs fermées en rafale.
- Fichiers/artefacts:
- TTPs:
- Supply chain npm via script
preinstallet exécution de Bun en arrière‑plan. - Living‑off‑the‑land: usage de TruffleHog pour le vol d’identifiants.
- Exfiltration vers GitHub (repos éphémères), évasion par triple base64; cleanup des traces.
- Reconnaissance et clonage massif multi‑infrastructures (US/Inde); surveillance de l’activité de la victime.
- Destruction: force‑pushs et fermetures de PRs; propagation npm conditionnelle.
- Supply chain npm via script
Conclusion Il s’agit d’un post‑mortem détaillé visant à documenter l’attaque Shai‑Hulud 2.0 subie par Trigger.dev, les impacts, la réponse et les mécanismes techniques du ver.
🔗 Source originale : https://trigger.dev/blog/shai-hulud-postmortem