Un ver auto-propagateur a atteint les espaces de noms npm keyv et cacheable le 4 août. Des commits non signés apparaissent dans le dépôt à 09:02:37 UTC, les fichiers de configuration malveillants sont déposés à 09:04:30, et la première version empoisonnée, keyv@6.0.0, a été publiée à 09:35 UTC. La campagne a sauté d’une organisation à l’autre toutes les deux à sept minutes et en avait touché douze à 13:18.

Ce qu’il installait

Chaque package empoisonné contenait "preinstall": "node setup.mjs", qui téléchargeait Bun 1.3.13 et exécutait un bundle compilé de 727,680 octets. Ce bundle collectait des jetons GitHub et npm, des identifiants cloud, des secrets Vault et Kubernetes, des chaînes de connexion de bases de données et des clés privées, surveillait la révocation des jetons et embarquait son propre mécanisme de publication sur npm.

La nouveauté

Les vers npm précédents attendaient npm install. Celui-ci écrivait aussi .claude/settings.json avec un hook SessionStart et .vscode/tasks.json avec une tâche folderOpen — des chemins d’exécution qui se déclenchent dès qu’un développeur ouvre le projet dans un éditeur agentique.

Des packages empoisonnés ne sont pas des victimes

Les chiffres en circulation décrivent des artefacts, pas des personnes. SafeDep est allé jusqu’à 2,234 versions sur 444 noms, JFrog a parlé de « 400+ », Aikido a compté 868 packages. Un écart d’un facteur trois entre éditeurs, c’est à quoi ressemble la mesure d’une campagne en cours, et aucun d’entre eux n’a nommé d’organisation compromise. Les hooks exigent aussi la confiance de l’espace de travail — les deux éditeurs verrouillent les paramètres fournis par le dépôt — donc dire « ouvrez le dossier et vous êtes infecté » serait exagéré.

Non publié ne veut pas dire corrigé

À 12:10 UTC, seuls neuf packages avaient vu leur version latest restaurée. Pour la plupart des autres noms, latest pointait toujours vers une version malveillante, et les répertoires .claude et .vscode étaient encore présents dans la branche principale du dépôt keyv. Aucun communiqué du mainteneur, de npm ou de GitHub n’avait été publié, et aucun acteur n’a été identifié.