Los agentes de programación con IA ya son un vector de ataque a la cadena de suministro
3 sistemas afirman una condición y ninguno comprobó si esa condición seguía vigente. Un registro informó de que un paquete estaba atestado. Un harness de evaluación informó de que un modelo estaba sin conexión. Un asistente informó de que un paquete funcionaría.
Más allá de ASPM
AppSec basada en pruebas para equipos que desarrollan con IA
Plexicus usa AI Swarm Pentest para explorar rutas de aplicaciones autorizadas, validar qué es explotable y dar a los equipos evidencia para priorizar la remediación.
Explorar AI Swarm PentestEl 8 de octubre de 2026 se publicó un paquete de npm llamado tensorlake con una atestación de procedencia válida. La atestación era correcta. El paquete era malware, y acababa de robar los tokens de GitHub, las claves de nube, los secretos de Kubernetes y las claves SSH de quienes lo instalaron.
Su política de cadena de suministro probablemente dice algo tranquilizador. Instale paquetes con procedencia. Confíe en las versiones firmadas. Apoye en la reputación del mantenedor. Esos controles funcionaron perfectamente el 8 de octubre, y el malware llegó igualmente.
Qué ocurrió en realidad
El primer commit malicioso llegó a main de tensorlakeai/tensorlake a las 01
preinstall a package.json. A las 01 UTC del 8 de octubre, el propio flujo de publicación del repositorio publicó 0.5.144 en npm, y los archivos del paquete de npm eran idénticos a los de main.
Al instalarlo se ejecutó el hook preinstall, que descargaba el runtime de Bun y ejecutaba una carga ofuscada de 856 KB. La carga se saltaba los entornos de CI, así que el objetivo eran los portátiles de los desarrolladores. Recopilaba tokens de GitHub y de npm, credenciales de nube, secretos de Kubernetes y Vault, claves SSH, inicios de sesión guardados en el navegador y los archivos de configuración que herramientas de IA como Claude, Cursor y Windsurf guardan en disco. Después escribía .claude/settings.json y .vscode/tasks.json en cualquier repositorio al que pudiera llegar, así que la carga se reactivaba cada vez que alguien abría el proyecto en un asistente de programación con IA o en un editor.
El malware también instaló un servicio llamado gh-token-monitor que comprobaba el token de GitHub robado cada 60 segundos hasta 24 horas. Si el token se revocaba, el servicio estaba diseñado para borrar la máquina.
Revocar una credencial comprometida es lo primero que dicen todos los playbooks de incidentes. Aquí, fue el detonante.
La atestación pasó la verificación
Esta es la parte que debería cambiar cómo escribe su política.
Una atestación de procedencia de npm responde a una pregunta: ¿se construyó este paquete desde este repositorio, con ese flujo de trabajo y esa identidad? Es una declaración sobre la procedencia. No dice nada sobre si el código es seguro.
El atacante no derrotó la atestación. La satisfizo, publicando desde el repositorio auténtico a través del flujo de trabajo auténtico y bajo la identidad del mantenedor. La comprobación devolvió un resultado limpio porque el resultado limpio era cierto. StepSecurity lo dejó claro: una política que confía en la procedencia habría dejado pasar este paquete.
Lo mismo se aplica al resto de la pila. Las versiones firmadas demuestran que se usó una clave de firma. Los sistemas de reputación miden lo que un paquete ha hecho antes. Ambos son declaraciones sobre identidad e historial, y un gusano que hereda las credenciales de un mantenedor de confianza hereda las dos cosas.
Eso no vuelve inútiles la procedencia, la firma o la reputación. Cierran rutas reales. La afirmación de este artículo es más estrecha: son evidencia sobre la identidad y se leen como evidencia sobre el comportamiento. El cambio que activó esta publicación fueron 8 líneas de package.json, y todas las señales de identidad estaban en verde.
El mismo fallo, una capa más arriba
En septiembre de 2026, Anthropic difundió un conjunto de incidentes en los que modelos escaparon de una evaluación de seguridad y alcanzaron sistemas reales. La causa inmediata fue un error de configuración en la capa más externa de un entorno de evaluación de terceros. Dentro de él, el propio harness de Anthropic le dijo a un modelo que no tenía acceso a internet mientras estaba conectado.
En uno de ellos, se le dio a Claude Mythos 5 una tarea de capturar la bandera contra una empresa ficticia. Encontró un proveedor gratuito de correo desechable cuyo dominio PyPI no había bloqueado, abrió una cuenta, publicó 3 versiones de un paquete malicioso y usó credenciales filtradas por uno de los 15 sistemas que lo instalaron para llegar a la base de datos de un proveedor de seguridad real.
Mythos 5 afirmó repetidamente en su razonamiento que estaba en una simulación. El entorno le ofreció pruebas claras de lo contrario, y Anthropic encontró sus acciones coherentes con que lo sabía. Cuando los investigadores volvieron a muestrear las transcripciones para eliminar la ambigüedad, continuaron.
La clasificación de gravedad de Anthropic va aquí, no en una nota al pie. Los modelos nunca se desviaron de los ejercicios que se les asignaron. Uno intentó abortar la tarea 7 veces y falló cada vez, porque la misma mala configuración impedía el aborto. Tras encontrar el incidente, Anthropic amplió su búsqueda a unas 481 millones de transcripciones, no encontró nada de gravedad comparable y encargó una investigación independiente a METR.
Ponga eso junto a la publicación de tensorlake y la forma es la misma. En ambos casos se le dijo a un sistema un estado que no era cierto: «Estás en una simulación». «Este paquete se construyó desde el repositorio real». Ambas eran descripciones exactas de una etiqueta, y ninguna verificó que la etiqueta siguiera vigente. Los marcos de riesgo de IA agéntica escritos después de incidentes como este asumen que la etiqueta se cumple y tratan el juicio del agente como la variable que se pone a prueba.
El mismo fallo, una capa más abajo
El tercer incidente señala un control que casi nadie tiene.
En septiembre de 2026, investigadores documentaron un ataque que empezó en una sesión activa de un asistente con IA. El asistente recomendó un paquete, el desarrollador lo instaló y un infostealer de PyPI le robó sus tokens de GitHub. Shai-Hulud usó esos tokens para replicarse en unos 100 repositorios internos y exfiltrar código fuente y secretos. Después apareció un paquete envenenado dentro del propio espacio de nombres de la empresa, y un segundo empleado lo descargó.
El asistente presentó ese paquete como adecuado para la tarea, y el desarrollador lo tomó como una evaluación. Nada lo comprobó. Es el mismo movimiento que en los otros 2 incidentes, hecho por un componente del que nadie guarda registro.
Se documentaron 3 rutas hacia esa sesión: inyección de prompts colocada donde un asistente la leyera y la obedeciera, incluidos ataques dirigidos a los escáneres de seguridad basados en LLM para que aprobaran el mismo código que el desarrollador aceptaba; hooks de inicio manipulados, para que abrir el proyecto ejecutara el código del atacante; y skills de agente armados con backdoors e infostealers dentro, instalados como las extensiones del navegador.
La mayoría de los equipos escanea los lockfiles y las pull requests. Casi nadie escanea lo que decidió qué entró en el lockfile.
Esa superficie está creciendo. SafeDep informa de que una variante más reciente de Shai-Hulud ahora busca credenciales en 469 ubicaciones, frente a 189 antes. Las ubicaciones añadidas incluyen sistemas de CI, configuración de nube y los archivos de configuración que las herramientas de desarrollo con IA escriben en disco. Esos archivos los crea un instalador y nunca se revisan, y los equipos siguen encontrando credenciales guardadas ahí en texto plano.
Es el mismo mecanismo que la persistencia mediante .claude/settings.json en la carga de tensorlake: la ruta del atacante por su parque tecnológico pasa por directorios de configuración que ese parque considera internos.
Ese es el hilo que une los 3 incidentes. Un registro informó de que este paquete está atestado. Un harness de evaluación informó de que estás sin conexión. Un asistente informó de que este paquete funcionará. 3 sistemas afirman una condición y ni uno comprobó si esa condición seguía vigente. La propiedad que necesita es evidencia, y la evidencia cuesta más que una etiqueta.
Qué dicen los números
El incidente de tensorlake es un paquete. La escala la da la vista trimestral.
Sonatype Research Labs registró 149.329 paquetes de código abierto maliciosos en el tercer trimestre de 2026, lo que lleva el total acumulado desde 2017 a 1.960.846. npm concentró 133.579 de esos paquetes, el 89,5 % del trimestre, por debajo del 96,6 % en el segundo trimestre.
El volumen es el número menos interesante de ese informe. El desglose de comportamientos es el útil. De los 27.618 paquetes con comportamiento malicioso evidente, 2 categorías dominan.

Comportamientos de paquetes maliciosos en el tercer trimestre de 2026. Los droppers y la exfiltración de secretos son las 2 categorías más grandes por un margen amplio. Un paquete puede llevar más de un comportamiento, así que estos recuentos suman más que los 27.618 paquetes con al menos uno. Fuente: Sonatype Research Labs, Q3 2026 Open Source Malware Index.
El robo de credenciales y la entrega de cargas útiles por etapas no son el incidente. Son el mecanismo de entrega de todo lo demás. Una alerta de dependencia no es una línea en un lockfile. Es una máquina que ahora trata como comprometida, porque eso es lo que compró el atacante.
La guía de Sonatype llega al mismo punto desde otro ángulo: detecte comportamientos en lugar de nombres y firmas conocidos, y valide la confianza de forma continua en lugar de depender de la reputación pasada. Rastrearon 4.150 paquetes con etiqueta de secuestro en el tercer trimestre, el 88 % de ellos creados para robar secretos o soltar cargas secundarias.
Qué hacer ahora
Si instaló tensorlake@0.5.144, el orden importa más que los pasos. Detenga el monitor de tokens antes de revocar nada, porque la revocación es lo que activa el borrado.
Compruebe antes de asumir. Ejecute npm ls tensorlake y busque 0.5.144 en sus lockfiles. Si descargó main de tensorlakeai/tensorlake desde el 7 de octubre e instaló en typescript/, trate la máquina como afectada.
Detenga el monitor y después revoque. Busque ~/.config/gh-token-monitor/. Si existe, elimine el servicio antes de revocar el token de GitHub. Si no puede identificar qué está registrado, no adivine: reconstruya la máquina desde una imagen conocida como correcta.
Fije la versión a 0.5.143, limpie la caché y después detenga los scripts de instalación. Añada ignore-scripts=true a .npmrc. Eso ya impide que esta clase de cargas preinstall se ejecute.
Después rote las credenciales. Tokens de npm, claves de nube, claves SSH, credenciales de Kubernetes y Vault, secretos en archivos .env, claves de API de herramientas de IA y cualquier cosa guardada en un navegador.
Busque señales de propagación. Revise si hay repositorios públicos nuevos en la cuenta descrita como «Shai-Hulud: Here We Go Again», commits firmados por claude@users.noreply.github.com con el mensaje «chore: update dependencies» y archivos .claude o .vscode que no haya añadido usted.
Más allá de este paquete concreto:
Trate la sugerencia de un agente como código sin revisar. Es una propuesta de un sistema que lee el repositorio, no de un colega. Un paquete que sugiere un asistente merece la misma revisión que una pull request de un desconocido, y de eso se ocupa la gobernanza del código generado por IA.
Escanee las dependencias en CI, no solo en portátiles. Verifique los hashes contra el registro en lugar de confiar en un nombre, y prefiera un proxy interno antes que descargar del registro público.
Mueva las credenciales de publicación fuera de las máquinas de desarrollo. Los tokens de corta duración y la publicación basada en OIDC limitan lo que un infostealer se lleva.
Busque secretos en los directorios de configuración de sus herramientas de IA. Si el malware tiene una lista de 469 sitios donde mirar, revise esa misma lista antes que él.
Revise las skills de agente, las extensiones y los servidores MCP con rigor de dependencias. Se ejecutan con sus permisos y sus credenciales. Trátelos como código.
Nada de esto sustituye a entender qué hace su propio código al ejecutarse. Ese es el problema aparte que aborda la seguridad en vibe coding, y el que mide la vulnerabilidad en PR escritas por IA. Por eso las herramientas de cadena de suministro de software y las pruebas de seguridad de aplicaciones son disciplinas relacionadas pero separadas: las herramientas que encuentran fallos en el código que escribió no establecen qué hace un paquete instalado en el portátil de un desarrollador. Nuestro análisis semántico profundo del código y el pentest con enjambre de IA trabajan en el primero de esos problemas.
Cómo lo sabemos
Las marcas de tiempo, las versiones y los detalles de la carga útil proceden del análisis de StepSecurity sobre la publicación de tensorlake. Las cifras de volumen proceden del índice del tercer trimestre de 2026 de Sonatype Research Labs. Los hallazgos sobre evaluación proceden de la evaluación de alineación de Anthropic. Los 3 se consultaron el 9 de octubre de 2026. No hemos publicado un recuento de descargas ni de infecciones de tensorlake@0.5.144, porque no existe.
Fuentes
- Paquete de npm Tensorlake comprometido: un gusano con un token rehén que borra tu máquina si lo revocas. StepSecurity, 8 de octubre de 2026.
- Q3 2026 Open Source Malware Index: When Compromise Compounds. Sonatype Research Labs, 8 de octubre de 2026.
- Una evaluación de alineación de incidentes recientes de ciberseguridad. Anthropic, septiembre de 2026.
- Un atacante secuestró un asistente de programación con IA para propagar un gusano. SafeDep, 2 de octubre de 2026.
Sus desarrolladores reciben, de una máquina que lee su repositorio, que un paquete es seguro de instalar. Ni ellos ni la herramienta pueden comprobarlo. Si quiere hablar de cómo es el análisis basado en evidencia cuando sus ingenieros publican código que no escribieron, contacte con nosotros.