El informe de error ejecutó el comando
El agentjacking, revelado por Tenet Security en junio de 2026, no necesita malware ni acceso a tu infraestructura. Un atacante presenta un error falso en tu proyecto de Sentry usando una clave pública de solo escritura, esconde instrucciones dentro de él y espera. Cuando le pides a tu agente de programación que arregle el problema, este lee el texto del atacante como una guía y lo ejecuta con tus credenciales. Tenet encontró al menos 2.388 proyectos expuestos y una tasa de éxito del 85 % en Claude Code, Cursor y Codex. Bromure Agentic Coding ejecuta todo ese recorrido de leer-y-ejecutar dentro de una VM de Linux desechable, evalúa el texto obtenido antes de que el agente actúe, y solo le deja señuelos al ladrón de credenciales.
Le pediste a tu agente de programación que arreglara un error. Abrió el rastreador de incidencias, leyó el primer resultado e hizo lo que decía. El problema es que cualquiera en internet podía escribir ese error — y el que tu agente leyó fue escrito para ser obedecido. No aterrizó ningún malware. No se vulneró ningún servidor. Un informe de error ejecutó un comando en tu máquina.
El 12 de junio de 2026, los investigadores de Tenet Security — Ron Bobrov, Barak Sternberg y Nevo Poran — publicaron un ataque que llaman Agentjacking, a través de la AI Safety Initiative de la Cloud Security Alliance. No usa un correo de phishing, ni un paquete envenenado, ni una contraseña robada. Usa un informe de error. En concreto, aprovecha el hecho de que un agente de programación al que se le pide "arreglar las incidencias abiertas de Sentry" leerá un informe de error y tratará su contenido como instrucciones.
El montaje empieza con algo que la mayoría de las aplicaciones web reparten a propósito. Un DSN de Sentry — la clave que un sitio usa para reportar sus propios fallos a Sentry, la plataforma de seguimiento de errores — es una credencial pública de solo escritura. Viaja en el JavaScript del lado del cliente de la página, y el endpoint de ingesta de Sentry acepta por diseño peticiones POST no autenticadas hacia él. Así es como la pestaña de tu navegador reporta un fallo sin iniciar sesión. También significa que cualquiera que lea el código fuente de tu página puede enviar eventos a tu proyecto de Sentry. Tenet los buscó y encontró 71 DSN inyectables entre el primer millón de sitios web, y al menos 2.388 organizaciones con DSN expuestos por toda internet.
Cómo un informe de fallo se convierte en un comando
El atacante toma un DSN que encontró y le envía por POST un evento de error fabricado. El evento parece un fallo corriente, salvo que el campo de mensaje y las claves de contexto están escritos en markdown — encabezados, bloques de código, una sección que se lee como una "Resolución" — con un formato que los hace visual y sintácticamente indistinguibles de las propias plantillas de diagnóstico de Sentry. Queda en la lista de incidencias del proyecto como cualquier otro error sin resolver.
Luego el atacante te espera. Cuando un desarrollador le pide a su agente de programación que investigue las incidencias sin resolver de Sentry, el agente consulta a Sentry — normalmente a través del servidor MCP de Sentry, el conector estándar que permite a un agente extraer datos de una herramienta externa — y recibe el evento. Como lo expresó Tenet, el agente "recibe la respuesta y actúa sobre ella, tal como lo haría un desarrollador". La respuesta no lleva ninguna señal de que su contenido fuera redactado por un atacante y no por el propio runtime de la aplicación. La "Resolución" dice que se ejecute un comando. El agente lo ejecuta, con los propios privilegios del desarrollador, en la propia máquina del desarrollador.
Tenet reportó una tasa de éxito del 85 % en los agentes que probaron — Claude Code, Cursor y Codex, las herramientas que la mayoría de los desarrolladores usa. Su comando de prueba de concepto se marchó con variables de entorno, credenciales de AWS, tokens OAuth de GitHub y GitLab, tokens del registro npm, configuración de Docker, tokens de clúster de Kubernetes y secretos de pipeline CI/CD. Sentry, informado de la falla el 3 de junio, se negó a corregir el comportamiento subyacente — es, en sus palabras, técnicamente indefendible — y añadió un filtro de contenido global que bloquea una cadena de payload específica.
Por qué toda defensa existente pasó de largo
El agentjacking importa no por la astucia del payload, sino porque nada en un stack de seguridad normal se dispara. No hay malware en el disco que un agente de endpoint pueda atrapar. No hay un inicio de sesión inusual que la monitorización de identidad pueda marcar. No hay conexión saliente de un proceso que no tenga por qué hacerla — se supone que el agente habla con Sentry, y se supone que las credenciales del desarrollador funcionan. Cada paso de la cadena es una acción autorizada realizada con acceso legítimo. Como lo expresó Tenet, el ataque no viola ninguna política ni cruza ningún umbral de anomalía.
Es el mismo muro contra el que el resto de la seguridad agéntica sigue chocando. Una lista de bloqueo de comandos pierde ante el shell que reescribe el comando. Un espacio de trabajo en el que confiabas pierde ante los servidores que lanza en silencio. Una revisión de seguridad que el agente hace por ti se convierte en lo que te ataca. El agentjacking es la versión en la que la entrada envenenada llega por una herramienta en la que tenías razón en confiar, cargando datos que tenías todos los motivos para leer. El servidor MCP de Sentry hizo su trabajo a la perfección. El problema es que "obtén el error y actúa sobre él" y "obtén las instrucciones del atacante y actúa sobre ellas" son, para el agente, la misma frase.
Las propias recomendaciones de Tenet apuntan a la forma del arreglo: ejecutar el agente en un sandbox con salida de red restringida, tratar todo lo que un servidor MCP devuelve como entrada potencialmente adversaria, y dejar de permitir que una cadena obtenida se convierta en un comando sin una frontera en medio. Eso describe una arquitectura, no un parche.
Dónde traza Bromure la línea
Bromure Agentic Coding no intenta enseñarle al agente en qué informes de error creer. Cambia lo que uno creído puede alcanzar. Cada agente que Bromure ejecuta — Claude Code, Codex, Grok Build — corre dentro de una VM de Linux desechable en tu Mac, no en macOS mismo. Así que cuando el agente extrae el evento de Sentry envenenado y hace exactamente lo que Tenet observó hacer a estos agentes, varias cosas ya son ciertas.
Primero, el texto obtenido es leído por un detector antes de convertirse en
un plan. El agentjacking es un ataque de lectura antes de ser un ataque de
ejecución: todo el exploit depende de que el agente ingiera la "Resolución"
del atacante y la trate como una guía. Esa es precisamente la autoridad no
confiable que Bromure vigila — la misma clase que un CLAUDE.md malicioso o
un AGENTS.md envenenado. La detección de inyección de prompts en el
dispositivo de Bromure evalúa el contenido que el agente lee contra modelos
locales que nunca salen del Mac, más un escáner determinista para trucos de
Unicode invisible. Un informe de fallo cuyo "arreglo" es un comando de shell
que lee tus tokens es exactamente el caso que ese detector existe para marcar.
Segundo, el comando corre en una caja que tiras. Supón que el señuelo está lo bastante bien formulado como para escurrirse del evaluador y el comando corre. Corre dentro de la VM. El "acceso de puerta trasera persistente" del modelo de amenaza de Tenet no tiene dónde persistir: restablece el perfil a su base y el script soltado, la clave SSH añadida, la tarea programada — todo eso desaparece. Nada de lo que hizo el comando sobrevive al cierre de la ventana.
Tercero, no hay credenciales reales que robar. Toda la lista del botín de
la prueba de concepto — claves de AWS, tokens de GitHub y GitLab, credenciales
de npm y Docker, secretos de Kubernetes y CI/CD, variables de entorno — es lo
que Bromure mantiene fuera de la caja desde el principio. Bromure inyecta
valores de marcador de posición (brm_…, un ~/.kube/config sintético,
tokens de nube y de registro desechables) en la VM y solo devuelve los reales
en el host, en el proxy, camino de salida hacia la API genuina. El comando
rastrea el entorno y el disco y encuentra señuelos. Lo que sea que envíe al
servidor del atacante es un saco de cadenas que no autentican nada.
Cuarto, la exfiltración es visible. El ataque de Tenet termina con los tokens robados saliendo de la máquina. Bromure enruta el tráfico de la VM por un proxy del host, de modo que la conexión al servidor del atacante aparece en el Registro de Seguridad como tráfico saliente que puedes ver — no una llamada silenciosa desde un portátil que suponías limpio. La "salida de red restringida" que Tenet recomienda es donde el agente ya vive.
Alrededor de qué traza esto una línea
El aislamiento y la evaluación son contención, no una cura para un agente confiado. Vale la pena ser preciso sobre lo que Bromure cambia aquí y lo que no.
El informe llega igual
Bromure no arregla el diseño del DSN de Sentry ni impide que un atacante presente un fallo envenenado — esa clave pública de solo escritura es la frontera que le toca trazar a Sentry, y se han negado a hacerlo. Lo que Bromure cambia es lo que ocurre después de que el agente lee el informe: dónde corre el comando y qué puede alcanzar.
La detección es una red, no un muro
La evaluación de inyección en el dispositivo marca una resolución del tipo "ejecuta esto para arreglarlo" más veces que no, pero un autor cuidadoso puede formular un señuelo para escurrirse de un solo escáner. Trata al detector como una capa; la contención — una caja desechable con claves falsas y una salida registrada — es lo que aguanta cuando un detector falla.
La sustitución cubre los secretos que configuras
El cambio por señuelo protege las credenciales que pones en un perfil: claves de modelo, tokens de git y de nube, tokens de registro y de clúster, claves SSH. Un token que un script escribe en el disco a mitad de la ejecución, o una sesión que estableces a mano dentro de la caja, es solo dato. Guarda los secretos en el broker, no en el espacio de trabajo.
El aislamiento no es motivo para ejecutar todo automáticamente
Una VM desechable reduce el radio de explosión; no vuelve inútil la revisión. Para acciones que alcanzan fuera de la caja — abrir un pull request, hacer push a un remoto — el paso de confirmación sigue mereciendo su lugar. La contención baja lo que está en juego en un error; no lo borra.
El hallazgo de Tenet no es que una plataforma tenga un bug. Es que el mecanismo de confianza que hay debajo — un agente que trata una cadena obtenida como un hecho y una "Resolución" como un plan — es compartido por toda herramienta que conecta a un agente con el mundo exterior, y no va a parchearse este trimestre. Sentry es el mensajero; el próximo será un ticket de Jira, un comentario de Linear, una revisión de código dejada por un desconocido. Tu agente va a leer algo que un atacante escribió, y a una tasa de éxito del 85 % a veces hará lo que dice. La pregunta no es si alguna vez lo engañan. La pregunta es qué corre cuando ocurre: tu máquina, tus tokens reales y un punto de apoyo que se queda — o una caja de Linux que puedes tirar, con señuelos dentro y la salida en el registro. Bromure hace que sea la segunda.