Qué se publicó entre las 09:35 y las 11:44 UTC

La primera publicación envenenada fue keyv en su versión 6.0.0, difundida a las 09:35 UTC del 4 de agosto. Semgrep, que puso a la campaña el nombre ChainDrop, contó 1.557 versiones maliciosas repartidas en 435 paquetes durante la oleada posterior, entre las 09:40 y las 11:44 UTC. Wiz, que siguió el mismo incidente, calculó más de 400 paquetes distintos y lo atribuyó a una cuenta de mantenedor cuyas credenciales habían sido robadas. No eran imitaciones con nombres parecidos ni paquetes nuevos. Eran las bibliotecas auténticas, republicadas con el nombre del mantenedor auténtico y con un archivo añadido.

En media hora la propagación cruzó las fronteras entre organizaciones. Entre los espacios afectados figuran @deliveroo, @ornikar, @qlik, @servicetitan, @onereach, @or-sdk, @arv-bedrock y @adminide-stack, además de las propias familias keyv y cacheable. Esas organizaciones no comparten código ni propietario. Lo que compartieron fue un token de publicación robado: cada infección recogía credenciales de npm del equipo que instalaba el paquete y las usaba para republicar todo lo demás que ese token pudiera alcanzar. Eso es lo que convierte esto en un gusano y no en una única publicación envenenada.

Los portadores son paquetes que nadie eligió

Consultamos las cifras de descargas del registro de npm para los 30 días que terminaron el 3 de agosto, el día anterior a la intrusión. keyv reunió 619,7 millones de descargas. flat-cache, 579,8 millones. file-entry-cache, 571,2 millones. cacheable-request, 137,0 millones; cacheable, 30,1 millones, y cache-manager, 16,3 millones. Esas seis bibliotecas suman en conjunto unos 1.950 millones de descargas en el mes previo a su envenenamiento.

Casi nadie instala flat-cache o file-entry-cache de forma deliberada. Son ayudantes de memoria intermedia que llegan por debajo de las herramientas de análisis y de compilación, varios niveles más abajo en un árbol de dependencias, en proyectos cuyos responsables nunca han escrito ninguno de los dos nombres. Ahí está la parte incómoda del cálculo. Los paquetes de mayor radio de acción son precisamente los que faltan en la lista de dependencias que usted revisó y aprobó, de modo que auditar sus propias decisiones dice muy poco sobre este incidente. La cifra que predice su exposición es cuántas veces se ejecutó su compilación el 4 de agosto.

El código malicioso buscaba al asistente de inteligencia artificial

El mecanismo fue un enganche preinstall, y eso importa porque se ejecuta durante la resolución de dependencias y no espera a que su código importe nada. Los archivos de carga, setup.mjs y math_init.js, descargaban un entorno de ejecución Bun independiente y ejecutaban una segunda fase ofuscada. Wiz identificó el tráfico por su agente de usuario, Bun/1.3.13. El recolector buscaba tokens de npm, credenciales de la nube, claves SSH, secretos de CI, monederos de criptomonedas y archivos de configuración de herramientas de inteligencia artificial.

También escribió su persistencia en los directorios .claude y .vscode, lo que es una decisión deliberada sobre dónde depositan hoy su confianza los programadores. Un editor y un asistente de inteligencia artificial tienen acceso al repositorio, permisos de consola y, cada vez más, autoridad para ejecutar órdenes. El mando y control estaba escondido en un contrato inteligente de Ethereum, leído mediante una llamada eth_call y que devolvía el dominio npm-cache[.]com, de modo que los operadores pueden redirigir su infraestructura sin distribuir código nuevo. La exfiltración fue a repositorios de GitHub creados con las identidades usurpadas y titulados Shai-Hulud: Here We Go Again, el nombre de la familia de código malicioso de la que este desciende.

Dos horas bastan para un hallazgo de NIS2

Para un operador de la Unión Europea o del Reino Unido la pregunta de cumplimiento no es solo si sufrió la intrusión, sino si puede describir lo que ocurrió. Dos de los espacios afectados pertenecen a Deliveroo y Ornikar, una plataforma británica de reparto y una empresa francesa de autoescuelas. Ninguna de las dos es un comercio desconocido y ninguna eligió formar parte de este incidente. NIS2 sitúa la seguridad de la cadena de suministro en la dirección y no en el equipo de seguridad, y DORA exige a las entidades financieras las mismas pruebas sobre el riesgo de las tecnologías de terceros.

Por tanto, el registro importa tanto como la reparación. Determine si alguna compilación se ejecutó el 4 de agosto entre las 09:35 y aproximadamente las 15:00 UTC, momento en que se documentó el canal de mando en Ethereum y el análisis seguía en curso. Rote todas las credenciales que un ejecutor pudiera alcanzar, no solo el token de npm: claves de la nube, tokens de GitHub, claves SSH y credenciales de Kubernetes y Terraform. Reconstruya los ejecutores en lugar de limpiarlos. Después anote qué rotó y cuándo, porque ese documento es lo que pedirán el supervisor, el auditor o la aseguradora. En España el INCIBE es el organismo al que llega la notificación.