Le paquet npm qui efface vos fichiers lorsque vous essayez de l’arrêter
Crypto Scams

Le paquet npm qui efface vos fichiers lorsque vous essayez de l’arrêter

Par frenchlbn

Un attaquant a empoisonné 84 versions npm de TanStack réparties sur 42 paquets, volant des jetons OIDC GitHub et des clés cloud tout en installant un interrupteur de sécurité qui détruit votre système.

Le timing de l’attaquant était précis. Un fork, un commit caché, une pull request sans différence, puis rien de visible pendant près de huit heures.

Le 11 mai, entre 19h20 et 19h26 UTC, 84 versions malveillantes réparties sur 42 paquets officiels @tanstack npm ont atteint le registre. Selon @IntCyberDigest sur X, @tanstack/react-router à lui seul cumule plus de 12 millions de téléchargements hebdomadaires. C’est ce qui en a fait la cible idéale.

La rafle d’identifiants que personne n’a vue venir

La charge utile, un fichier obscurci d’environ 2,3 Mo appelé router_init.js, s’exécutait dès qu’un développeur ou un pipeline CI exécutait npm install. AWS IMDS, métadonnées GCP, jetons de compte de service Kubernetes, jetons Vault, clés privées SSH. Il les a toutes parcourues.

Le mainteneur de TanStack, Tanner Linsley, a confirmé que toute l’équipe avait activé l’authentification à deux facteurs. Selon le postmortem publié sur tanstack.com, cela n’a eu aucun impact. La chaîne d’attaque n’avait besoin d’aucun identifiant npm.

L’exfiltration passait par le réseau de messagerie Session/Oxen, notamment filev2.getsession.org et seed1 à seed3.getsession.org. Chiffré de bout en bout. Aucun serveur de commande et contrôle contrôlé par l’attaquant à bloquer par IP. Le plan d’action du ver npm volant des clés cryptographiques, adapté et amélioré.

Comment une PR sans différence a empoisonné tout le pipeline de publication

La mise en place a commencé un jour plus tôt. Un fork de TanStack/router, renommé github.com/zblgg/configuration pour échapper aux recherches de liste de forks, a reçu un commit malveillant le 10 mai à 23h29 UTC. Identité fabriquée : claude@users.noreply.github.com. Pas le produit d’Anthropic. Un email inventé.

La PR #7378 a été ouverte le lendemain matin. Le déclencheur de workflow pull_request_target, un modèle dangereux bien documenté, a exécuté des jobs de benchmark utilisant le code du fork. Cela a suffi.

Le cache du magasin pnpm empoisonné a été sauvegardé sous la clé exacte que release.yml rechercherait plus tard. L’attaquant a ensuite forcé le push de la PR pour revenir à une opération sans fichier et l’a fermée. Le cache a persisté. Le chercheur Adnan Khan a documenté cette classe d’attaque en 2024. L’attaquant a repris la technique presque textuellement, commentaire d’attribution inclus.

Lorsque le mainteneur Manuel a ensuite fusionné une PR non liée poussant un correctif CSS.supports vers la branche principale, le workflow de publication s’est déclenché et a restauré le cache empoisonné. Les identifiants GitHub ont été récoltés via la même méthode de vol d’identifiants GitHub observée dans des campagnes précédentes.

L’interrupteur de sécurité

Le chercheur carlini, postant sur l’issue GitHub #7383, a signalé autre chose dans la charge utile. Un script installé comme service systemd sur Linux et comme 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, disparu.

« Soyez prudent lors de la révocation des jetons », a écrit carlini dans le fil. Il n’en a pas dit plus.

Le chercheur en sécurité ahmadnassri a noté sur l’issue de suivi que socket.dev suivait 84 PURLs @tanstack individuelles plus le ver se propageant à 200 autres paquets ou plus.

La ruse OIDC qui a tout rendu propre en apparence

Les versions empoisonnées portaient une provenance cryptographique valide. La publication est passée par la liaison de l’éditeur de confiance OIDC de GitHub Actions pour le workflow de publication de TanStack/router. Pour npm, les paquets semblaient identiques à tout ce que Linsley aurait lui-même expédié.

C’est la partie qui ébranle les défenseurs. La charge utile n’avait besoin d’aucun jeton npm de quiconque. Elle a créé un jeton OIDC capable de publier en lisant directement la mémoire du runneur, en localisant le processus Runner.Worker de GitHub Actions via les entrées /proc et en le vidant. Même script Python utilisé dans la compromission de tj-actions/changed-files de mars 2025.

@IntCyberDigest l’a décrit sur X comme le premier ver npm documenté à être livré 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 l’issue GitHub ne soit publiée.

Paquets confirmés propres : @tanstack/query, @tanstack/table, @tanstack/form, @tanstack/virtual, @tanstack/store. Toute personne ayant installé un paquet concerné le 11 mai doit immédiatement renouveler les identifiants AWS, GCP, Kubernetes, Vault, GitHub, npm et SSH.

L’équipe a depuis déprécié les 84 versions et a sollicité la sécurité de npm pour retirer les tarballs du registre.

frenchlbn

À propos de l'auteur

frenchlbn

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *