GhostApproval: el ataque a agentes de programación con IA oculto tras 'Aprobar'

Vexlint Team · · 8 min de lectura
GhostApproval: el ataque a agentes de programación con IA oculto tras 'Aprobar'

Resumen: GhostApproval es un patrón de ataque recién divulgado que afecta a asistentes de programación con IA. Un repositorio malicioso disfraza un enlace simbólico como un archivo normal del proyecto. El agente pide permiso para editar esa ruta aparentemente inofensiva, pero la escritura puede terminar en un archivo sensible fuera del workspace. Actualiza tus herramientas, aísla repositorios desconocidos, revisa los symlinks y no trates un diálogo de aprobación como prueba de seguridad.


El diálogo de aprobación que no cuenta toda la historia

Los agentes de programación con IA ya no se limitan a sugerir una línea de código. Leen repositorios, editan archivos, ejecutan comandos, instalan dependencias y, en algunos casos, despliegan el resultado.

Por eso el límite de seguridad ha cambiado. Ya no basta con preguntar: “¿Es seguro el código generado?”. También hay que preguntar: “¿Pueden engañar al agente para que actúe fuera del proyecto que le he dado?”.

El 8 de julio de 2026, Wiz publicó GhostApproval, una debilidad de categoría detectada en seis herramientas: Amazon Q Developer, Claude Code, Augment, Cursor, Google Antigravity y Windsurf. El ataque combina dos ideas antiguas—las instrucciones maliciosas y los enlaces simbólicos—con un fallo moderno: la interfaz muestra una ruta al usuario mientras el sistema operativo escribe en otra. Investigación de Wiz sobre GhostApproval

No hay evidencia pública de que esta prueba de concepto concreta se haya explotado en ataques reales. Aun así, el fallo de diseño importa porque los agentes trabajan cada vez más con el mismo acceso al sistema de archivos que el desarrollador.


GhostApproval explicado de forma sencilla

Un enlace simbólico o symlink es un objeto del sistema de archivos que apunta a otro archivo. Resulta útil para compartir configuraciones, pero el software debe resolver su destino real antes de decidir si una operación es segura.

Imagina un repositorio clonado con este archivo:

project_settings.json -> ~/.ssh/authorized_keys

Dentro del proyecto, project_settings.json parece un archivo de configuración normal. En realidad apunta al archivo que decide qué claves SSH pueden acceder al equipo del desarrollador.

El README pide al agente “terminar la configuración” añadiendo una línea a project_settings.json. Si la herramienta valida únicamente la ruta visible, la escritura cruza el límite del workspace y llega a ~/.ssh/authorized_keys.

La misma técnica puede apuntar a archivos de inicio como ~/.zshrc, configuración de herramientas o credenciales cloud. El agente no necesita privilegios de administrador: hereda los permisos actuales del usuario.

La cadena de ataque

  1. El desarrollador clona o abre un repositorio no confiable.
  2. Un archivo del proyecto es en realidad un symlink a una ubicación sensible fuera del workspace.
  3. Las instrucciones del repositorio convencen al agente para editar el archivo local aparente.
  4. El agente o su sandbox comprueba la ruta mostrada y no el destino canónico resuelto.
  5. El usuario ve una aprobación inofensiva; en algunas herramientas, la escritura ocurre antes.
  6. El destino sensible se modifica con los permisos del desarrollador.

El peligro no es que existan los symlinks, sino la diferencia entre lo que el usuario cree aprobar y lo que el sistema realmente hace.


Por qué falló el “humano en el circuito”

Los diálogos de aprobación suelen presentarse como la última barrera de seguridad. GhostApproval demuestra que una persona puede estar técnicamente dentro del circuito y, aun así, no disponer de la información necesaria para decidir.

En las pruebas de Wiz, el razonamiento del agente podía reconocer que el archivo aparente apuntaba a un destino sensible, pero la confirmación mostrada al desarrollador solo nombraba la ruta inofensiva. Otros productos escribían el cambio en disco antes de mostrar Accept o Reject, convirtiendo la “aprobación” en un botón de deshacer.

Hay tres fallos diferentes:

  • Confusión de rutas: la interfaz muestra el symlink y no su destino canónico.
  • Fallo de límites: el sandbox permite una escritura que se resuelve fuera del workspace.
  • Fallo temporal: el producto ejecuta la acción antes de que el usuario la autorice.

Una aprobación real debe mostrar el destino final, explicar que se cruza un límite de confianza y bloquear la escritura hasta recibir permiso.


¿Qué herramientas se vieron afectadas?

El estado no era idéntico en los seis productos cuando se publicó la investigación:

HerramientaComportamiento observadoEstado al divulgarse
Amazon Q DeveloperPodía escribir mediante symlink antes de una aprobación efectivaCorregido en Language Server 1.69.0
CursorEl diff mostraba la ruta local mientras el backend seguía el enlaceCorregido en Cursor 3.0
Google AntigravityEl permiso mostraba el enlace y no el destino realCorregido
Claude CodeClasificación discutida; las versiones nuevas avisan sobre symlinksActualizar a la última versión
AugmentSe demostraron lecturas y escrituras silenciosas mediante symlinksReconocido al publicarse
WindsurfLos cambios podían escribirse antes de mostrar Accept/RejectReconocido al publicarse

AWS registró el problema como CVE-2026-12958, con una puntuación CVSS 4.0 de 8,5, y recomienda actualizar los plugins de Amazon Q Developer a versiones que incluyan Language Server 1.69.0. Boletín de seguridad de AWS

El aviso relacionado de Cursor, CVE-2026-50549, está clasificado como crítico, afecta a versiones anteriores a 3.0 y describe escrituras arbitrarias fuera del workspace cuando falla la canonicalización de la ruta. Aviso de seguridad de Cursor

Como el estado puede cambiar rápidamente, la regla práctica es sencilla: revisa las notas actuales del proveedor y utiliza la última versión estable antes de abrir un repositorio desconocido con un agente.


Qué deben hacer los desarrolladores hoy

1. Actualiza todas las herramientas de programación con IA

No actualices solo el editor. Extensiones, language servers, agentes CLI y procesos auxiliares pueden tener versiones separadas. Reinicia el IDE después para cargar el componente corregido.

En macOS o Linux, inspecciona los enlaces de un proyecto desconocido:

Terminal window
find . -type l -exec ls -la {} \;

Para comprobar el destino de un archivo concreto:

Terminal window
readlink project_settings.json

Investiga cualquier enlace que apunte fuera del repositorio, sobre todo si su destino es un archivo del shell, SSH, credenciales, configuración del editor o del agente.

3. Ejecuta repositorios no confiables en un entorno aislado

Un contenedor, una máquina virtual desechable, un entorno remoto o un sandbox estricto reduce el alcance de los permisos heredados. El aislamiento debe cubrir escrituras, red, credenciales y variables de entorno, no solo comandos de terminal.

4. Mantén los secretos fuera del alcance del agente

Usa credenciales breves y de mínimo privilegio. No abras un proyecto desconocido donde existan claves cloud de producción o identidades SSH amplias. Si una sesión sospechosa pudo tocar esos archivos, rota las credenciales.

5. Trata las instrucciones del proyecto como entrada no confiable

README, issues, reglas del agente, respuestas MCP, errores generados y configuraciones ocultas pueden dirigir su comportamiento. Revísalos antes de delegar tareas amplias como “sigue todas las instrucciones” o “corrige todo y ejecútalo”.

6. Revisa tanto el código como el comportamiento del agente

El análisis estático sigue siendo esencial para detectar vulnerabilidades introducidas en la aplicación. Pero GhostApproval sucede en la capa de ejecución del agente. Combina el escaneo de código con límites de sandbox, monitorización del sistema de archivos, registros de comandos y autorización explícita para operaciones sensibles.


Qué deben cambiar los fabricantes

  • Resolver y validar la ruta canónica justo antes de cada lectura o escritura.
  • Bloquear la operación si falla la canonicalización, sin volver a la ruta original.
  • Mostrar la ruta solicitada y el destino real.
  • Tratar cualquier escritura fuera del workspace como aprobación de alto riesgo.
  • Nunca escribir primero y preguntar después.
  • Probar symlinks, puntos de montaje y condiciones de carrera en el modelo de amenazas.
  • Conservar una auditoría que conecte intención, razonamiento, aprobación y efecto real.

OpenAI describe un modelo similar de defensa en profundidad para Codex: límites de sandbox, políticas de aprobación, red restringida, credenciales limitadas, reglas administradas y telemetría del agente funcionan en conjunto en vez de depender de un único diálogo. Cómo ejecutar Codex de forma segura en OpenAI


La lección mayor: un agente es software con privilegios

GhostApproval pertenece a la misma familia que la prompt injection, las instrucciones envenenadas, las herramientas MCP inseguras y los ataques a la cadena de suministro. El error común es tratar al asistente como un autocompletado inteligente, cuando en realidad es un actor de software con acceso a archivos, comandos, tokens y redes.

El nuevo modelo de amenazas debe asumir que:

  • Un repositorio contiene código y también instrucciones.
  • Una aprobación solo es segura si la interfaz representa el efecto real.
  • Un límite de workspace solo existe si el sistema operativo lo aplica.
  • El diff generado es solo una parte de la actividad del agente.

La programación con IA no se está volviendo menos útil. Se está volviendo tan potente que su plano de control merece el mismo escrutinio que CI/CD, IAM cloud y la automatización de producción.

La incómoda lección de GhostApproval es sencilla: “Hice clic en Aprobar” no significa “aprobé lo que realmente ocurrió”.


Vexlint ayuda a los desarrolladores a inspeccionar código de aplicación generado por IA en busca de problemas de seguridad. Los controles de ejecución—sandboxing, credenciales de mínimo privilegio y monitorización del agente—siguen siendo complementos esenciales del análisis de código.