La inyección que apagó el sandbox de Cursor
El 1 de julio de 2026, Cato AI Labs reveló DuneSlide: dos fallos críticos en Cursor (CVE-2026-50548 y CVE-2026-50549, ambos con CVSS 9.8) donde una inyección de prompt que llega en el resultado de una herramienta MCP o en un fragmento de búsqueda web dirige la herramienta run_terminal_cmd y un fallback de enlace simbólico para sobrescribir el propio helper del sandbox de Cursor. El guardián se calla desde dentro, y el siguiente comando se ejecuta como el desarrollador, con alcance a cualquier nube o SaaS en la que el editor tenga la sesión abierta. Sin interacción del usuario, parcheado en Cursor 3.0. Esta es una historia sobre dónde debe estar una frontera: en Bromure Agentic Coding la misma fuga aterriza dentro de una VM desechable, la shell fugada encuentra stubs sustitutos donde deberían estar los tokens reales, y PromptGuard puntúa ese contenido no confiable en el cable antes de que el modelo actúe sobre él.
DuneSlide no se escapó del sandbox de Cursor. Convenció al propio agente de Cursor de sobrescribir el pequeño binario que imponía el sandbox, y el guardián enmudeció desde dentro. Una frontera que vive en el mismo proceso que el código que vigila es una frontera que el código puede alcanzar.
Un desarrollador le pide a Cursor que conecte una nueva integración y lo apunta a la documentación de un proveedor, o conecta un servidor Model Context Protocol para que el agente pueda extraer datos en vivo. MCP es el enchufe que permite a un agente de codificación llamar a herramientas externas y leer sus resultados. Cursor recupera la página, lee la salida de la herramienta y pliega ambas cosas en el contexto sobre el que razona. En algún punto de ese texto devuelto hay una frase que el desarrollador nunca escribió, dirigida al modelo en lugar de a un humano. El agente la lee como una instrucción y actúa.
El 1 de julio de 2026, Cato AI Labs reveló la cadena que esto pone en marcha, y The Hacker News lo cubrió el mismo día. Dos fallos, CVE-2026-50548 y CVE-2026-50549, ambos valorados en 9.8 sobre 10. El vector de entrega es contenido no confiable que el agente ya lee en tu nombre: el resultado de una herramienta MCP, un fragmento de una búsqueda web. Sin diálogo, sin clic, sin interacción del usuario.
Qué hace DuneSlide.
Cursor ejecuta los comandos que genera su agente dentro de un sandbox
local, y un binario helper decide qué permite ese sandbox. El primer fallo
vive en run_terminal_cmd, la herramienta que el agente usa para ejecutar
comandos de shell. Esa herramienta toma un parámetro working_directory,
y la inyección lo fija a una ruta que apunta a los propios archivos de
Cursor. El agente, siguiendo la instrucción de contrabando, escribe encima
del helper que se encuentra en
/Applications/Cursor.app/.../helpers/cursorsandbox. El segundo fallo es
un fallback en cómo Cursor resuelve los enlaces simbólicos: cuando la
comprobación del enlace simbólico falla, Cursor confía en la ruta
in-project del atajo y escribe fuera del proyecto de todos modos,
aterrizando en el mismo helper.
En cualquier caso el resultado es una sola cosa. El binario que decide si un comando está confinado queda reemplazado por uno que no confina nada. El siguiente comando que ejecuta el agente corre como el desarrollador, fuera del sandbox, con el alcance de quienquiera que tenga la sesión abierta en el editor: la consola de la nube, los paneles de SaaS, los repositorios que la sesión ya puede tocar. Cursor parcheó ambos fallos en la versión 3.0. Toda compilación anterior está expuesta.
La frontera estaba dentro de la sala que vigilaba.
Lee la cadena de nuevo y la parte afilada no es el truco del enlace
simbólico. Es la ubicación del guardián. El helper que decide si un
comando está confinado se encuentra en el mismo disco que el proyecto que
el agente edita, en el mismo dominio de confianza que el agente, alcanzable
por el mismo run_terminal_cmd que el agente usa para el trabajo
ordinario. El sandbox y el código que vigila corren como un mismo usuario,
en una misma máquina, con un mismo sistema de archivos entre ellos. Dale al
agente la capacidad de escribir un archivo, deja que un atacante elija qué
archivo, y el archivo que elige es el guardián.
Ese es el fallo recurrente en la seguridad de agentes de codificación este año, y lo hemos documentado en otras formas: una credencial que el agente puede leer es una credencial que una dependencia comprometida puede leer en el sandbox que guardaba la clave, y un control que el agente puede apagar nunca fue un control en por qué Bromure Agentic Coding no es un sandbox. DuneSlide es la misma lección al nivel del propio binario del sandbox. Un guardián in-process te protege hasta que el proceso en el que vive decide editarlo.
El mismo ataque, a un hipervisor de distancia.
Bromure Agentic Coding pone la frontera en algún lugar donde el agente no puede escribir. El agente, las shells que genera, las herramientas que llama y cualquier código que esas herramientas ejecuten viven dentro de una máquina virtual desechable con su propio kernel Linux. Cada byte que la VM envía o lee cruza un proxy que corre en el host macOS, por debajo del huésped, al otro lado del hipervisor. Ese proxy es un solo lugar, y hace varios trabajos. Reproduce DuneSlide contra él y cada paso topa con uno de ellos.
Empieza por la fuga. La inyección sigue llegando, el agente sigue
ejecutando run_terminal_cmd, y ambos CVE siguen disparándose. La
sobrescritura aterriza en los propios archivos del huésped. El disco del
Mac, su /Applications, su Keychain no están en el mundo de la VM, así que
no hay ruta desde un enlace simbólico dentro del huésped hasta un binario
en el host. El radio de explosión es una máquina que puedes borrar y
reconstruir en segundos.
Luego el paso del pago, el alcance a la nube y al SaaS. Ahí es donde el
ataque venía a por valor, y se queda con las manos vacías. Los tokens
reales se quedan en el host. La VM contiene stubs: archivos de credenciales
con la forma correcta y sin significado en la internet pública. Cuando el
agente hace una llamada que necesita un secreto real, el proxy del host
sustituye el stub por el token real en el cable y lo vuelve a sacar de la
respuesta. Una shell fugada que ejecuta env | grep TOKEN o lee
~/.aws/credentials encuentra marcadores de posición. El único momento en
que existe una credencial real es dentro de una petición que el agente hizo
para trabajo real, y una llamada que cambia el estado se detiene en la
frontera para pedir confirmación en el host antes de salir. Las descargas
de paquetes cruzan el mismo proxy y se escanean a la entrada. Una línea,
varios trabajos, todos ellos por debajo del agente.
La fuga aterriza en el huésped.
Ambos CVE siguen disparándose bajo Bromure. La sobrescritura golpea archivos dentro de una VM desechable con su propio kernel, y el hipervisor no le da al huésped ninguna syscall que alcance el host. Reconstruyes la VM y el daño se va con ella.
El token que quería nunca estuvo ahí.
El objetivo de DuneSlide es el acceso a la nube y al SaaS del desarrollador. Esos secretos están en el host, y la VM lleva stubs que no significan nada en internet. La shell fugada busca tokens con grep y lee marcadores de posición, así que el paso del pago falla.
PromptGuard lee el cable primero.
La garantía de arriba se sostiene sin ningún clasificador: la frontera de
la VM contiene la fuga y el intercambio de tokens deja sin alimento al
pago, haga lo que haga el modelo. Bromure añade una capa más en el mismo
proxy, apuntada al vector exacto que usa DuneSlide. La inyección viaja en
contenido que el agente ingiere, un resultado de herramienta MCP o un
fragmento de búsqueda web, y ese contenido cruza el proxy del host antes de
que el modelo lo lea. Si está activado, PromptGuard lo puntúa ahí. La
primera etapa es Llama Prompt Guard 2 de Meta, vigilando la salida de las
herramientas y las descargas web en busca de texto que se dirija al modelo
como una instrucción. Los archivos de reglas que un agente trata como
órdenes permanentes, CLAUDE.md y sus hermanos, reciben en cambio un
clasificador ModernBERT afinado, porque un archivo que está pensado para
ser todo instrucciones necesita un modelo que puntúe el daño en lugar de la
inyección.
Según el perfil, Bromure registra el impacto, te lo muestra para que decidas, o lo bloquea antes de que el modelo vea el tramo envenenado. La ubicación es la clave, y es el mismo argumento que las capas por debajo: un agente que ya se ha tragado la inyección no puede ser de fiar para reportarla, así que la comprobación corre al otro lado de la frontera, donde la persuasión del agente no llega. Documentamos el pipeline completo en cómo Bromure detecta prompts maliciosos, y vimos la misma clase de ataque colarse montada en la salida de un comando en la instrucción que no era mía.
DuneSlide está parcheado en Cursor 3.0, y actualizar es lo correcto hoy. El patrón que hay detrás no está parcheado, porque no es un único fallo. Cualquier agente de codificación que ejecute su propio confinamiento en su propio proceso está a una frase convincente de editar ese confinamiento. El movimiento que sobrevive al próximo CVE con otro nombre es mantener el guardián, las credenciales y el rastro de auditoría al otro lado de una línea a la que el agente no puede escribir. Bromure Agentic Coding traza esa línea en el hipervisor. Es gratis, de código abierto y disponible hoy.