Selon Iru (Threat Intelligence), dans un billet du 4 décembre 2025 signé par Calvin So, des attaquants ont mené une opération de chaîne d’approvisionnement NPM baptisée Shai‑Hulud puis Shai‑Hulud 2.0, combinant vol de jetons, auto‑propagation et abus de GitHub Actions comme C2.

Le 26 août 2025, une injection GitHub Actions dans le workflow de Nx a permis, via un titre de pull request malicieusement forgé, d’exécuter des commandes et d’exfiltrer le jeton de publication NPM de l’éditeur. Des versions piégées de packages Nx ont alors été publiées. En septembre, CISA et plusieurs éditeurs ont constaté une infection de chaîne d’approvisionnement plus large : le ver Shai‑Hulud se réplique en transformant des packages NPM populaires en conteneurs de scripts malveillants, vole des secrets avec trufflehog, tente de rendre publics des dépôts GitHub privés et se copie dans d’autres packages.

La variante Shai‑Hulud 2.0 est livrée via un package NPM doté d’un preinstall (“node setup_bun.js”) qui installe Bun (curl|bash) puis lance bun_environment.js. La charge utile priorise les environnements CI/CD, et cible/vole des identifiants et jetons pour GitHub, NPM, AWS, GCP, en lisant le système de fichiers et en abusant des CLIs cloud. Elle interroge l’API NPM (/whoami) pour identifier les packages du compte compromis et publier des versions trojanisées, et utilise Octokit pour créer un dépôt nommé “Shai-Hulud: The Second Coming”.

Pour la persistence et le C2, le malware enregistre l’hôte compromis comme runner GitHub auto‑hébergé (SHA1HULUD) et déploie un workflow vulnérable (.github/workflows/discussion.yaml) déclenché par GitHub Discussions, offrant une exécution de commandes à distance furtive. Il tente l’élévation de privilèges (tests sudo sans mot de passe, conteneur Docker privilégié modifiant sudoers.d) et procède à l’évasion des défenses (arrêt/remplacement de systemd-resolved, changement DNS, vidage des chaînes iptables OUTPUT et DOCKER-USER). L’exfiltration s’effectue en double Base64 vers un dépôt GitHub de l’attaquant, via des JSON (contents.json, environment.json, cloud.json, trufflesecrets.json, actionSecrets.json). En cas d’échec d’accès au jeton GitHub, le malware tente une destruction des données dans le répertoire personnel (Windows/Unix ; particularités notées sur macOS).

IOCs observés 🧭

  • Hashes: cbb9bc5a8496243e02f3cc080efbe3e4a1430ba0671f2e43a202bf45b05479cd, f099c5d9ec417d4445a0328ac0ada9cde79fc37410914103ae9c609cbc0ee068, 46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09, 768496fbdbbd05657d1cf858591480232313488831ad9a377a698aa1a6547f88, de0e25a3e6c1e1e5998b306b7141b3dc4c0088da9d7bb47c1c00c91e6e4f85d6.

TTPs et commandes notables 🧪

  • Livraison/Exécution: preinstall NPM (node setup_bun.js), installation Bun (curl vers bash), exécution de bun_environment.js, interrogation NPM /whoami, Octokit pour création de dépôt.
  • Persistance/C2: enregistrement runner auto‑hébergé SHA1HULUD (téléchargement/extraction/configuration d’Actions Runner sur Windows/Linux/macOS, exécution run en arrière‑plan), workflow .github/workflows/discussion.yaml vulnérable déclenché par Discussions.
  • Élévation/Evasion: test sudo -n true, conteneur Docker privilégié montant / pour écrire dans sudoers.d, arrêt/remplacement/redémarrage de systemd-resolved, iptables -t filter -F OUTPUT et -F DOCKER-USER.
  • Exfiltration/Impact: export double Base64 de contents.json, environment.json, cloud.json, trufflesecrets.json, actionSecrets.json vers GitHub ; suppression destructrice du répertoire utilisateur si jeton GitHub indisponible.

Article de menace technique visant à documenter l’attaque, son évolution vers un ver NPM auto‑réplicant, ses capacités de backdoor/C2, et à fournir indicateurs et TTPs pour le suivi et la détection.

🧠 TTPs et IOCs détectés

TTP

[‘Supply Chain Compromise’, ‘Command and Control via GitHub Actions’, ‘Credential Access via trufflehog’, ‘Persistence via self-hosted GitHub runner’, ‘Privilege Escalation via sudo manipulation’, ‘Defense Evasion via DNS and iptables manipulation’, ‘Exfiltration via double Base64 encoding’, ‘Data Destruction on failure to access GitHub token’, ‘Execution via NPM preinstall script’, ‘Abuse of cloud CLIs for credential access’]

IOC

[‘cbb9bc5a8496243e02f3cc080efbe3e4a1430ba0671f2e43a202bf45b05479cd’, ‘f099c5d9ec417d4445a0328ac0ada9cde79fc37410914103ae9c609cbc0ee068’, ‘46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09’, ‘768496fbdbbd05657d1cf858591480232313488831ad9a377a698aa1a6547f88’, ‘de0e25a3e6c1e1e5998b306b7141b3dc4c0088da9d7bb47c1c00c91e6e4f85d6’]


🔗 Source originale : https://the-sequence.com/investigating-shai-hulud