Des centaines de packages sur npm et PyPI subissent une compromission dans la campagne de chaîne d’approvisionnement Shai-Hulud. Cette opération déploie un malware qui vole les identifiants des développeurs.
L’attaquant détourne des jetons valides OpenID Connect (OIDC) pour diffuser des versions malveillantes de packages. Ces versions portent des attestations de provenance vérifiables conformes à SLSA Build Level 3.
Les experts attribuent l’attaque au groupe de menaces TeamPCP. L’opération commence par la compromission de dizaines de packages TanStack et Mistral AI. Elle s’étend vite à d’autres projets populaires tels que Guardrails AI, UiPath et OpenSearch. Les victimes récentes incluent le package CLI de Bitwarden et les packages officiels SAP.
La campagne Shai-Hulud apparaît en septembre dernier. Plusieurs itérations suivent. Elles exposent des centaines de milliers de secrets de développeurs dans des dépôts GitHub générés automatiquement.
L’attaquant publie hier plusieurs packages malveillants dans les espaces de noms TanStack sur npm. Il propage ensuite le mal sur d’autres projets grâce à des identifiants CI/CD volés.
StepSecurity précise que l’attaquant exploite le pipeline CI/CD légitime. Les packages infectés portent des attestations SLSA valides, émises par l’infrastructure de signature de npm. Ces attestations lient les packages au workflow de publication légitime de TanStack/router.
Endor Labs recense plus de 160 packages compromis sur npm. Aikido dénombre 373 entrées de versions malveillantes. Socket suit 416 artefacts compromis sur npm, PyPI et Composer.
Le rapport post-mortem de TanStack révèle une chaîne de trois vulnérabilités. L’attaquant combine un workflow ‘pull_request-target’ risqué, un empoisonnement du cache GitHub Actions et un vol de jeton OIDC dans la mémoire des runners.
Les attaquants diffusent 84 versions malveillantes sur 42 packages TanStack. Ces versions arborent une provenance valide, des attestations Sigstore authentiques et des signatures GitHub Actions légitimes.
Endor Labs met en lumière un astucieux tour avec un commit orphelin. Les attaquants le poussent dans une fourche du dépôt TanStack/router. Ce commit reste accessible via le stockage d’objets partagés de GitHub, même sans branche associée. Une dépendance optionnelle malveillante le référence. npm le récupère et l’exécute lors de l’installation du package.
Le malware vise les secrets des développeurs :
- jetons OIDC et PAT de GitHub Actions
- identifiants Git
- jetons de publication npm
- identifiants AWS Secrets Manager, IAM et tâches ESC
- jetons de comptes de service Kubernetes et identifiants de cluster
- jetons HashiCorp Vault
- clés SSH
- configurations Claude Code
- tâches VS Code
- fichiers .env
Le payload lit la mémoire du processus GitHub Actions. Il extrait des identifiants de plus de 100 chemins de fichiers liés aux fournisseurs cloud, jetons de cryptomonnaies et applications de messagerie.
Le malware exfiltre les données via le réseau P2P Session. Ce trafic mime des échanges de messagerie chiffrée. Les mesures de détection, blocage et suppression deviennent complexes.
Après infection, le malware s’inscrit dans les hooks de Claude Code et les tâches auto-exécutables de VS Code. La désinstallation des packages malveillants ne l’élimine pas.
Le mécanisme d’auto-propagation reste identique aux vagues précédentes. L’attaquant utilise les identifiants GitHub et npm volés. Il énumère les packages liés au mainteneur compromis, modifie les tarballs pour injecter le payload, puis republie les versions malveillantes.
SafeDep confirme que les packages Mistral AI et TanStack déploient le même payload voleur d’identifiants, malgré un mécanisme de déclenchement différent.
Les chercheurs conseillent aux développeurs d’assumer une exposition des identifiants si une version affectée télécharge. Les équipes de sécurité vérifient :
- les versions de packages affectées
- la persistance sur les machines des développeurs
- rotation de tous les identifiants (jetons GitHub, npm, AWS, Vault, comptes de service Kubernetes, secrets CI/CD)
- audit des répertoires IDE pour fichiers malveillants persistants après npm install (ex. router_runtime.js ou setup.mjs)
- blocage de l’infrastructure de commande et contrôle de l’attaquant (api.masscan.cloud, git-tanstack.com, *.getsession.org) au niveau DNS ou proxy
Les chercheurs de Snyk insistent sur la validation des attestations SLSA Build Level 3 pour les packages malveillants. Ils préconisent une analyse comportementale à l’installation, avec vérification des signatures. À long terme, les installations basées uniquement sur lockfile préviennent les mises à jour automatiques ou silencieuses.
