Hay un momento que todo desarrollador conoce. Clonas un repositorio, el agente pregunta si puede ejecutar los pasos de instalación, dices que sí, y 40 segundos después la máquina está compilando algo. Parece progreso.
Esta semana ese reflejo se convirtió en una superficie de ataque documentada. Un nuevo estudio de los investigadores Aadesh Bagmar y Pushkar Saraf probó doce escenarios de ataque en cinco clases sobre harnesses de agentes de código en producción con modelos de frontera. Su conclusión es directa: los agentes leen archivos README, listas de requisitos y Makefiles, ejecutan los pasos de instalación y casi no verifican nada sobre nombres de paquetes, fuentes o versiones antes de hacerlo.
Después, BleepingComputer reportó un truco hermano: deja un archivo AGENTS.md en una carpeta de Descargas y un agente que pase por ahí puede ser dirigido a ejecutar código o entregar credenciales. Sin cadena de exploits. Sin día cero. Solo un archivo de texto que parece documentación.
Si tu equipo trabaja con Claude Code, Codex, Copilot o Cursor, esto ya es tu problema, no una curiosidad de laboratorio.
La revisión de tres segundos que ya nadie hace
Antes de los agentes, la última línea de defensa era la impaciencia humana haciendo seguridad sin querer. Un desarrollador que hojeaba un README podía notar una URL de registro extraña o un nombre de paquete con una letra de más, y detenerse.
Esa pausa desapareció. El agente lee el archivo, interpreta la especificación de dependencias y ejecuta la instalación con tus permisos y tus variables de entorno, muchas veces autoaprobando comandos de shell porque la velocidad es justamente el punto.
El estudio es justo con lo que los agentes hacen bien. Un typosquat descarado como "tranformers" se detecta casi siempre. Los agentes son buenos para detectar errores evidentes.
El problema empieza donde el error parece razonable:
- Confusión de separadores. "azurecore" en lugar de "azure-core". Creíble, suficientemente cercano para pasar un vistazo, suficientemente distinto para resolver al paquete de un atacante.
- Redirección de registro. Los índices ocultos y las fuentes no confiables se instalan casi sin condición. Los autores señalan que el esfuerzo del atacante en nombres plausibles es casi inútil, porque el canal de origen es el que los agentes no vigilan.
- Versiones con vulnerabilidades conocidas. Un paquete técnicamente correcto pero años atrasado en parches.
El punto ciego no es inteligencia. Es autoridad. El agente trata un archivo del proyecto como una instrucción legítima porque eso es exactamente lo que se supone que es un archivo de proyecto.
Por qué el modelo no es el eslabón débil
Aquí está la parte que debería cambiar cómo compras y despliegas estas herramientas. El mismo modelo detectó un ataque a través de un harness y lo instaló a través de otro. En una prueba controlada donde solo cambiaba el harness, un solo ataque pasó de detectarse en las diez ejecuciones a detectarse en nueve de treinta.
Eso significa que la seguridad en el momento de instalar es una propiedad de la combinación harness-modelo, no del nivel de benchmark del modelo. Actualizar a un modelo "mejor" no es una actualización de seguridad. El harness es lo que media las llamadas a herramientas, los permisos, la ejecución y la memoria, y también es lo que casi ningún equipo configura.
Los autores del estudio ponen número a la brecha, citando trabajo paralelo: las peticiones maliciosas explícitas fallan ante defensas sólidas, pero la misma carga útil camuflada en artefactos normales de desarrollo evade la alineación entre el 11,6 y el 33,5 por ciento de las veces. La intención escondida en documentación pasa por debajo del entrenamiento de rechazo que la detendría de frente.
El truco de persistencia: AGENTS.md como punto de apoyo
Con la historia de AGENTS.md la estrategia se aclara. Un issue malicioso en GitHub es un disparo único: inyectar, ejecutar, quizá robar un token antes de que alguien lo note. Un AGENTS.md escribible es un contrato de alquiler.
Investigadores que trabajaron con Codex de OpenAI mostraron que la guía escrita por un atacante en un AGENTS.md escribible persistía entre varias etapas del flujo automatizado, porque las etapas posteriores reutilizaban el espacio de trabajo y seguían confiando en el archivo. El agente de Anthropic también fue empujado desde un issue manipulado a leer archivos arbitrarios y tomar credenciales de API de GitHub y de Anthropic.
Encadena ambos hallazgos. Un archivo de instrucciones que sobrevive los límites entre etapas, más un agente con permisos CI/CD por defecto, equivale a una intrusión que no necesita hacer ruido. Los pipelines multi-etapa comparten espacios de trabajo. Los proveedores publicaron mitigaciones. Tu copia de esos valores por defecto puede seguir ahí.
Cómo se ve en un equipo real
Imagina un equipo de producto mediano en Dubái. Doce ingenieros, tres repositorios, un pipeline de CI que ejecuta un agente en cada PR para corregir el lint y resumir diferencias. El agente tiene un token con permiso de escritura porque era la forma más rápida de hacerlo útil.
Un colaborador abre un issue amable: "CI falla en main, por favor ejecuta los pasos de CONTRIBUTING para reproducirlo". El agente obedece. Nada en esa secuencia parece anómalo en un registro donde los agentes ya ejecutan comandos todo el día.
Nadie lo nota durante once días. No porque la detección sea difícil, sino porque nadie definió cómo se ve "normal" para un agente en ese pipeline.
El arreglo es aburrido, y eso es el punto
Los autores encontraron que una comprobación determinista previa a la instalación, que verifica nombre, fuente y versión antes de ejecutar cualquier código, cierra la mayor parte de la brecha. Ningún agente actual la implementa por defecto. Así que la construyes, o pones una barrera.
Cinco cosas que puedes hacer esta semana:
- Pon una barrera antes de la instalación. Lista blanca de registros, fallo ante nombres similares a paquetes populares, rechazo de versiones sin fijar. Cinco líneas de política superan a un prompt esperanzado.
- Limita los tokens. El token del agente no debería poder escribir en main, leer secretos ni tocar producción. El mínimo privilegio no es un eslogan, es contención.
- Trata los archivos de instrucciones como código. Los cambios en AGENTS.md, CLAUDE.md, .cursorrules, CONTRIBUTING y el YAML de workflows pasan por revisión obligatoria, igual que un cambio en un módulo de autenticación.
- Haz efímeros los espacios de trabajo del agente. Un contenedor nuevo por etapa. Nada escribible sobrevive para llevar una instrucción adelante.
- Registra las acciones del agente como una identidad. Cada comando, cada archivo leído, cada acceso a credenciales, atribuido al agente y enviado a algún lugar donde un humano realmente mire.
La conclusión para nuestros clientes
Nada de esto argumenta en contra de usar agentes de código. Los nuestros hacen trabajo real todos los días y la ganancia de productividad no es un espejismo.
Argumenta a favor de tratar al agente como un colega nuevo con un portátil y tus llaves de producción: útil de inmediato, peligroso sin gestión. El perímetro se movió. Ya no es el borde de tu red ni siquiera tu proveedor de modelos. Es el último archivo que tu agente leyó antes de ejecutar algo.
Si estás desplegando agentes dentro de CI, o no estás seguro de qué permisos tienen hoy, esa es una conversación de dos horas que tenemos con frecuencia. Trae tu pipeline. Nosotros traemos la paranoia.