Un gusano autorreplicante llegó a los espacios de nombres npm keyv y cacheable el 4 de agosto. En el repositorio aparecen commits sin firmar a las 09:02:37 UTC, los archivos de configuración maliciosos se incorporan a las 09:04:30, y la primera versión envenenada, keyv@6.0.0, se publicó a las 09:35 UTC. La campaña pasó de una organización a otra cada dos a siete minutos y había alcanzado a doce a las 13:18.
Lo que instaló
Cada paquete envenenado llevaba "preinstall": "node setup.mjs", que descargaba Bun 1.3.13 y ejecutaba un binario compilado de 727.680 bytes. Ese binario recopilaba tokens de GitHub y npm, credenciales de nube, secretos de Vault y Kubernetes, cadenas de conexión de bases de datos y claves privadas, vigilaba la revocación de tokens y contaba con su propia maquinaria para publicar en npm.
La novedad
Los gusanos anteriores de npm esperaban a npm install. Este también escribía .claude/settings.json con un gancho SessionStart y .vscode/tasks.json con una tarea folderOpen: rutas de ejecución que se activan cuando un desarrollador abre el proyecto en un editor agéntico, sin más.
Los paquetes envenenados no son víctimas
Las cifras que circulan describen artefactos, no personas. SafeDep cerró en 2.234 versiones de 444 nombres, JFrog habló de "400+", Aikido contabilizó 868 paquetes. Una divergencia de tres veces entre proveedores es lo que parece medir una campaña en vivo, y ninguno de ellos nombró a una organización comprometida. Además, los ganchos requieren confianza en el espacio de trabajo: ambos editores bloquean la configuración suministrada por el repositorio, así que decir "abre la carpeta y ya estás infectado" sería exagerado.
Lo no publicado no está arreglado
Para las 12:10 UTC, solo nueve paquetes habían revertido latest. En la mayoría de los demás nombres, latest seguía resolviendo a una versión maliciosa, y los directorios .claude y .vscode seguían en la rama principal del repositorio de keyv. No se había emitido ninguna declaración del mantenedor, de npm o de GitHub, y no se ha identificado a ningún actor.
