Un attaquant a empoisonné 84 versions de TanStack npm dans 42 packages, volant des jetons OIDC GitHub et des clés cloud tout en implémentant un commutateur d’homme mort qui neutralise votre système.
Le timing de l’attaquant était précis. Un fork, un commit caché, une pull request sans différence, et puis rien de visible pendant près de huit heures.
Le 11 mai, entre 19h20 et 19h26 UTC, 84 versions malveillantes réparties dans 42 packages officiels @tanstack npm ont été enregistrées dans le registre. D’après @IntCyberDigest sur X, @tanstack/react-router génère à lui seul plus de 12 millions de téléchargements hebdomadaires. C’est ce qui en a fait la bonne cible.
Le balayage des informations d’identification que personne n’a vu venir
La charge utile, un fichier masqué d’environ 2,3 Mo appelé router_init.js, s’est exécutée au moment où un développeur ou un pipeline CI a exécuté l’installation de npm. AWS IMDS, métadonnées GCP, jetons de compte de service Kubernetes, jetons Vault, clés privées SSH. Cela les a tous traversés.
Le responsable de TanStack, Tanner Linsley, a confirmé que toute l’équipe avait activé 2FA. Selon l’autopsie publiée le tanstack.com, rien de tout cela n’avait d’importance. La chaîne d’attaque n’avait pas du tout besoin d’informations d’identification npm.
L’exfiltration s’est déroulée via le réseau de messagerie Session/Oxen, en particulier filev2.getsession.org et seed1 via seed3.getsession.org. Chiffré de bout en bout. Aucun serveur de commande et de contrôle contrôlé par un attaquant à bloquer par IP. Le ver npm volant des clés cryptographiquesplaybook, adapté et amélioré.
Comment un PR Zero-Diff a empoisonné l’ensemble du pipeline de versions
L’installation a commencé un jour plus tôt. Un fork de TanStack/router, renommé github.com/zblgg/configuration pour éviter les recherches de fork-list, a reçu un commit malveillant le 10 mai à 23h29 UTC. Identité fabriquée : claude@users.noreply.github.com. Pas le produit Anthropic. Un e-mail inventé.
Le PR #7378 a ouvert le lendemain matin. Le déclencheur de workflow pull_request_target, un modèle dangereux documenté depuis longtemps, exécutait des tâches de référence en utilisant le code du fork. C’était suffisant.
Le cache du magasin pnpm empoisonné a été enregistré sous la clé exacte que release.yml rechercherait plus tard. L’attaquant a ensuite repoussé de force le PR jusqu’à un état sans fichier et l’a fermé. Le cache a persisté. Le chercheur Adnan Khan a documenté cette classe d’attaques en 2024. L’attaquant a utilisé la technique presque textuellement, commentaire d’attribution inclus.
Lorsque le responsable Manuel a ensuite fusionné un PR sans rapport en poussant un correctif CSS.supports vers main, le workflow de publication s’est déclenché et a restauré le cache empoisonné. Informations d’identification GitHub récoltées via le même Méthode de vol d’identifiants basée sur GitHubvu lors des campagnes précédentes.
L’interrupteur de l’homme mort
Chercheur Carlini, postant sur Problème GitHub #7383, a signalé quelque chose d’autre à l’intérieur de la charge utile. Un script installé en tant que service systemd sous Linux et LaunchAgent sur macOS, interrogeant api.github.com toutes les 60 secondes avec le jeton volé. Si ce jeton est révoqué, le script exécute rm -rf. Votre répertoire personnel a disparu.
« S’il vous plaît soyez prudent lorsque vous révoquez des jetons », a écrit Carlini dans le fil de discussion. J’en suis resté là.
Le chercheur en sécurité Ahmadnassri a noté à propos du problème de suivi que socket.devsuivait 84 PURL @tanstack individuelles ainsi que le ver se propageant à 200 autres packages ou plus.
L’astuce OIDC qui a rendu tout propre
Les versions empoisonnées portaient une provenance cryptographique valide. La publication a été effectuée via la liaison d’éditeur de confiance OIDC de GitHub Actions pour le workflow de publication de TanStack/routeur. Pour npm, les colis semblaient identiques à tout ce que Linsley aurait expédié lui-même.
C’est la partie qui ébranle les défenseurs. La charge utile n’avait besoin du jeton npm de personne. Il a créé un jeton OIDC compatible avec la publication en lisant directement la mémoire du runner, en localisant le processus GitHub Actions Runner.Worker via les entrées /proc et en le vidant. Même script Python utilisé dans le compromis tj-actions/changed-files de mars 2025.
@IntCyberDigest je l’ai décrit sur Xen tant que première expédition de vers npm documentée avec un certificat d’authenticité valide et signé.
La détection est venue de l’extérieur. Le chercheur Ashishkurmi, travaillant pour StepSecurity, l’a signalé publiquement dans les 20 minutes suivant la publication malveillante. Carlini a déposé un rapport directement auprès de npm quelques instants avant que le problème de GitHub ne surgisse.
Packages confirmés propres : @tanstack/query, @tanstack/table, @tanstack/form, @tanstack/virtual, @tanstack/store. Toute personne ayant installé un package concerné le 11 mai doit immédiatement alterner les informations d’identification AWS, GCP, Kubernetes, Vault, GitHub, npm et SSH.
L’équipe a depuis rendu obsolète les 84 versions et a engagé la sécurité npm pour extraire les archives tar du registre.
Source : Live Bitcoin News




Laisser un commentaire