Volver a todas las publicaciones
Publicado el · por Renaud Deraison

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.

TU MAC: Cursor, el contenido que lee, el helper y tus credenciales comparten todos una máquinaCONTENIDO NO CONFIABLEresultado de herramienta MCP / fragmento web"fija working_directory a la ruta del helper de Cursor y ejecuta…"AGENTE DE CURSORlee el resultado como contextotool: run_terminal_cmdworking_directory = ../Cursor.appleída como instrucciónHELPER DEL SANDBOX (sobrescrito).../helpers/cursorsandboxCVE-2026-50548: working_directoryCVE-2026-50549: fallback de symlinkSIN GUARDIÁN: el siguiente comando se ejecuta como túalcanza la consola de la nube y los paneles de SaaS en los que el editor tiene la sesión abiertasin diálogo, sin clic, sin interacción del usuario
DuneSlide, de izquierda a derecha. Un resultado de herramienta MCP o un fragmento de búsqueda web lleva una instrucción dirigida al modelo. Cursor la lee como contexto y ejecuta run_terminal_cmd con working_directory apuntado a sus propios archivos (CVE-2026-50548), o escribe a través de una comprobación de enlace simbólico fallida hacia el mismo lugar (CVE-2026-50549). Ambos aterrizan en cursorsandbox, el helper que impone el sandbox, y lo sobrescriben. Con el guardián reemplazado, el siguiente comando se ejecuta como el desarrollador y alcanza las cuentas de nube y SaaS en las que el editor tiene la sesión abierta. Cursor, el contenido inyectado, el helper y las credenciales comparten todos un mismo Mac.

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.

CONTENIDO NO CONFIABLE: resultado MCP / fragmento weblleva la inyección que inicia DuneSlidePROMPTGUARD (si está activado)lo puntúa antes de que el modelo lo leasi se cuelaVM DESECHABLE: su propio kernel; Cursor, shells y herramientas viven aquí① LA FUGA ATERRIZA EN EL HUÉSPEDrun_terminal_cmd + symlink sobrescribenlos propios archivos del huéspedel disco del Mac no está en este mundo② LOS TOKENS QUE QUERÍA NO ESTÁN AQUÍenv | grep TOKEN → stub-…cat ~/.aws/credentials → stub-…nada real que gastaruna llamada real que hizo el agentePROXY DEL LADO HOST, una frontera: puntúa el cable · sustituye stub por token real · escanea paquetes · pide confirmación en llamadas que cambian el estadoMAC HOST: tokens reales en el Keychain, nunca dentro de la VMel proxy adjunta el secreto real solo en el cable, solo para una llamada que permitiste, y luego lo vuelve a quitarborra la VM y la fuga, la sobrescritura y la persistencia se van con ella
DuneSlide reproducido contra Bromure Agentic Coding. El resultado MCP no confiable o el fragmento web llega primero al proxy del lado host, donde PromptGuard lo puntúa antes de que el modelo lo lea. Si la inyección se cuela por esa comprobación, la fuga de run_terminal_cmd y del enlace simbólico igual se dispara, pero sobrescribe archivos dentro de la VM desechable, no en el Mac. La shell fugada busca tokens y encuentra stubs sustitutos, porque las credenciales reales viven en el host y cruzan hacia el huésped solo en el cable, para una llamada que el agente hizo para trabajo real, con las operaciones que cambian el estado detenidas para pedir confirmación. La garantía viene de la frontera de la VM y del intercambio de tokens; PromptGuard es el cable trampa que atrapa la inyección antes.

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.