Selon Wiz (blog), une attaque de supply chain a touché le 26 août 2025 le système de build Nx sur npm via des versions malveillantes contenant un malware post-install. Le code a collecté des actifs sensibles (wallets crypto, tokens GitHub/npm, clés SSH, fichiers .env, etc.) et a exfiltré ces données vers des dépôts publics créés au sein des comptes GitHub des victimes (s1ngularity-repository). GitHub a désactivé ces dépôts le 27 août à 9h UTC, mais la fenêtre d’exposition (~8h) a permis des téléchargements par les attaquants et d’autres acteurs.

Wiz précise que, malgré la suppression des paquets compromis de npm, ils peuvent encore s’exécuter localement là où ils sont installés. Le 28 août à 9h UTC, la cause racine a été identifiée : une faiblesse de workflow GitHub Actions combinant une injection via des titres de pull request non assainis et l’usage de pull_request_target (octroyant un GITHUB_TOKEN en lecture/écriture), permettant une exécution de commandes arbitraires. Wiz note que 90% de plus d’un millier de tokens GitHub fuités et 61% de plusieurs dizaines de tokens npm restent valides.

Le 28 août à 18h UTC, Wiz et Adnan Khan ont observé une seconde vague : un acteur exploite des tokens GitHub compromis pour rendre publics des dépôts privés et les renommer selon le motif s1ngularity-repository-#5letters#, affectant plus de 190 utilisateurs/organisations et plus de 3000 dépôts.

Produits/versions affectés (extraits) : Nx (@nrwl/nx, nx) 20.9.0, 20.10.0, 20.11.0, 20.12.0, 21.5.0, 21.6.0, 21.7.0, 21.8.0 ; @nx/devkit 21.5.0, 20.9.0 ; @nx/enterprise-cloud 3.2.0 ; @nx/eslint 21.5.0 ; @nx/js 21.5.0, 20.9.0 ; @nx/key 3.2.0 ; @nx/node 21.5.0, 20.9.0 ; @nx/workspace 21.5.0, 20.9.0. Artefacts observés : modifications de ~/.bashrc et ~/.zshrc avec « sudo shutdown -h 0 » ; /tmp/inventory.txt et /tmp/inventory.txt.bak ; appels sortants à api.github.com (/user/repos, /repos/*/contents/results.b64) ; dépôts publics nommés s1ngularity-repository, s1ngularity-repository-0, s1ngularity-repository-1 ; fichiers results.b64 contenant des données encodées en base64.

TTPs clés 🛠️:

  • Chaîne d’approvisionnement npm avec script post-install (Linux/macOS) et télémetrie.js malveillant.
  • Exfiltration vers des dépôts GitHub créés chez les victimes (double/triple base64).
  • Abus d’outils IA en ligne de commande (Claude, Gemini, Q) avec flags « –dangerously-skip-permissions », « –yolo », « –trust-all-tools » pour la reconnaissance.
  • Sabotage via insertion de « sudo shutdown -h 0 » dans les shells d’ouverture de session.
  • Exécution en environnements développeur et CI/CD (dont GitHub Actions), avec seconde vague exploitant des tokens GitHub volés pour rendre publics et renommer des dépôts.

IOCs 🧪:

  • Fichiers: ~/.bashrc, ~/.zshrc modifiés ; /tmp/inventory.txt ; /tmp/inventory.txt.bak ; results.b64.
  • Réseaux/Comptes: API calls api.github.com (/user/repos, /repos/*/contents/results.b64) ; dépôts « s1ngularity-repository », « s1ngularity-repository-0 », « s1ngularity-repository-1 » ; motif « s1ngularity-repository-#5letters# ».

L’article est un rapport d’incident technique visant à documenter l’attaque « s1ngularity », ses causes, son impact, les artefacts/IOCs et les actions de remédiation proposées, ainsi que les capacités de détection mises à disposition par Wiz.


🔗 Source originale : https://www.wiz.io/blog/s1ngularity-supply-chain-attack