Faille encore, chez Tanstack maintenant

A croire que l'IA a aussi un très mauvais côté: accélérer le hacking. Les failles pleuvent ces derniers temps. Cette fois-ci c'est TanStack qui en fait les frais.
TanStack piraté : 42 packages npm vérolés par une chaîne d'attaque GitHub Actions
Le 11 mai 2026 à 19h20 UTC, un attaquant a publié 84 versions malveillantes sur 42 packages @tanstack/* du registre npm en moins de six minutes.
La fenêtre a été refermée par Ashish Kurmi (StepSecurity), qui a documenté publiquement le compromis vingt minutes après la publication.
Les familles query, table, form, virtual et store sont indemnes, mais tout poste de développement ou runner CI ayant exécuté npm install sur une version touchée doit être considéré compromis : credentials AWS, GCP, Kubernetes, Vault, GitHub, npm et clés SSH doivent être rotés.
Trois failles enchaînées, aucune suffisante seule
pull_request_target"] -->|code non audité
exécuté| B["Cache pnpm
empoisonné"] B -->|restauré par release.yml
sur push main| C["Binaires malveillants
sur le runner"] C -->|dump /proc/mem
extraction OIDC| D["Publish direct
vers registry.npmjs.org"]
Le pattern « Pwn Request » dans bundle-size.yml checkoutait refs/pull/N/merge du fork sous trigger pull_request_target, ce qui contourne l'approbation first-time-contributor.
Le job tournait avec permissions: contents: read, mais actions/cache@v5 écrit via un token runner interne non gouverné par cette policy.
Le payload a déposé un store pnpm vérolé sur la clé Linux-pnpm-store-${hashFiles('**/pnpm-lock.yaml')} exactement celle que release.yml allait restaurer au prochain push sur main.
Au runtime de release, le binaire injecté localisait le process Runner.Worker via /proc/*/cmdline, lisait /proc/
Une exfiltration furtive via Session
Le payload router_init.js (2,3 Mo obfusqués) déclenché par le hook prepare ratisse les emplacements classiques : IMDS AWS, métadonnées GCP, tokens de service-account Kubernetes, tokens Vault, ~/.npmrc, GitHub tokens (env, gh CLI, .git-credentials), clés SSH privées.
L'exfiltration passe par le réseau de messagerie chiffrée Session/Oxen (filev2.getsession.org, seed{1,2,3}.getsession.org), pas de C2 contrôlé par l'attaquant, chiffrement de bout en bout, seule la coupure réseau par IP/domaine est efficace.
Le payload se propage ensuite seul : il énumère les autres packages du mainteneur via registry.npmjs.org/-/v1/search?text=maintainer:
Détail notable : la technique de dump mémoire reprend verbatim le script Python publié lors du compromis tj-actions/changed-files de mars 2025, attribution comprise.
Ce qu'il faut retenir si vous maintenez un package npm
Le trigger pull_request_target reste un piège connu depuis des années, auditez chaque workflow qui le combine avec un checkout de la PR.
Le scope cache GitHub Actions est partagé entre les exécutions sur fork et les pushes sur main : ce qu'une PR écrit dans le cache, main le lira.
La permission id-token: write transforme tout step exécutable en candidat-publication via OIDC, sans review par publish.
Pinnez les actions tierces sur SHA plutôt que sur tag flottant (@v6.0.2, @main), ajoutez des garde-fous if: github.repository_owner == 'votre-org', et surveillez activement vos propres publications npm, TanStack a appris l'incident d'un tiers, vingt minutes trop tard.

Alexandre P.
Développeur passionné depuis plus de 20 ans, j'ai une appétence particulière pour les défis techniques et changer de technologie ne me fait pas froid aux yeux.
Poursuivre la lecture

