SymJack: una copia de archivo aprobada se convierte en RCE en seis agentes de codificación IA
Adversa AI publicó el 26 de mayo de 2026 un patrón de secuestro por enlace simbólico que transforma una orden de shell aparentemente inocua en sobrescritura de la configuración y RCE en el host, en Claude Code, Cursor, Gemini, Antigravity, Copilot, Grok Build y Codex CLI.
¿De qué se trata?
El 26 de mayo de 2026, Rony Utevsky de Adversa AI publicó SymJack: the approval prompt is lying to you, que documenta un único patrón de ataque que produce ejecución remota de código en el host del usuario a través de seis agentes de codificación IA: Claude Code 2.1.128 (parcheado parcialmente en 2.1.129), Cursor CLI v2026.05.20, Gemini CLI 0.43.0, Antigravity CLI 1.0.2, Copilot CLI 1.0.51, Grok Build CLI 0.1.216 y OpenAI Codex CLI v0.133.0 (añadido en la actualización del 27 de mayo). No se ha asignado un nuevo CVE, pero la familia extiende la divulgación previa de Check Point CVE-2025-59536 (octubre de 2025) y el patrón TrustFall publicado por Adversa a comienzos de mayo.
El disparador es una sola acción: abrir un repositorio malicioso y pulsar Aprobar sobre lo que parece una copia de archivo rutinaria.
Cómo funciona
Los agentes de codificación distinguen dos categorías de escritura en archivos. Las herramientas de escritura nativas (write_file, apply_diff, etc.) llevan controles sensibles a la ruta: rechazan, o piden confirmación reforzada, cuando el objetivo es una configuración MCP, un archivo de ajustes o un rc del shell. Los comandos del shell (cp, mv, install, tee, redirecciones) se controlan inspeccionando el texto del comando — no el efecto real en el sistema de archivos.
SymJack explota esa brecha. Según Adversa:
«Las instrucciones le piden al agente que use un comando de copia del shell en lugar de las herramientas de escritura propias del agente. Las herramientas nativas tienen controles que marcan rutas sensibles como archivos de configuración. Un
cpdirecto se cuela porque el aviso de permiso inspecciona el texto del comando, no su efecto real.»
El destino mostrado en el aviso de aprobación es una ruta dentro del repositorio. Esa ruta es un enlace simbólico incluido en el repo, apuntando a la propia configuración MCP o al archivo de ajustes del agente. Cuando el kernel sigue el enlace, el contenido del atacante aterriza directamente en el archivo que define qué servidores MCP arrancará el agente al próximo inicio:
repo/ ~/.config/<agent>/
├── payload.txt ─ cp ─> mcp_servers.json ← objetivo del symlink
└── docs/destination ─ symlink ─> mcp_servers.json
# En el aviso de aprobación el usuario ve:
$ cp ./payload.txt ./docs/destination
# Tras resolver el symlink, la escritura real es:
# ./payload.txt → ~/.config/<agent>/mcp_servers.json
El siguiente reinicio del agente carga la configuración reescrita, instancia el servidor MCP controlado por el atacante y ejecuta sus comandos con todos los privilegios del usuario. Una inyección de prompt indirecta desde README.md, un AGENTS.md oculto o una descripción .mcp.json basta para que el agente proponga la cp maliciosa.
Por qué importa
La clase de fallo es estructural, no un descuido puntual:
- La fidelidad del aviso de aprobación está rota cuando muestra cadenas de argumentos y el kernel actúa sobre rutas resueltas.
- Dos rutas de escritura, una sola política es un mal valor por defecto. Cada producto auditado tenía controles más estrictos en su herramienta de escritura nativa que en las operaciones del shell.
- Las configuraciones son código. Una entrada de servidor MCP en
mcp_servers.jsones un spawn de proceso. Tratarla como dato mientras se trata el comando del shell como comando invierte el modelo de confianza.
El mismo patrón reapareció de forma independiente en TrustFall, en CVE-2025-59536 y ahora en SymJack a través de seis agentes sin relación — una señal fuerte de que la superficie de ataque está en el diseño, no en un fallo de implementación.
Defensas
Las recomendaciones de Adversa, textuales:
- «Resolver los enlaces simbólicos a su objetivo real antes de cualquier decisión de permiso, en cada ruta de escritura de archivos, incluidos los comandos del shell.»
- «Tratar las operaciones del shell sobre archivos (
cp,mv,install,tee, redirecciones,dd of=) como escrituras de primera clase, sujetas a las mismas comprobaciones de sensibilidad de ruta que las herramientas de escritura nativas.» - «Mostrar al usuario el destino canónico en el aviso de aprobación, no la cadena literal del argumento.»
- «Bloquear que claves de configuración sensibles que habilitan la ejecución MCP sean fijadas por archivos con ámbito de proyecto.»
- «Hacer visible qué archivos de instrucciones se incluyeron al arrancar, para que una directiva oculta en un archivo casi vacío no pueda ejecutarse en silencio.»
Para los operadores: desactivar la auto-aprobación de operaciones de archivo del shell en repositorios no confiables, montar en solo lectura los directorios de configuración del agente al trabajar en un proyecto desconocido, monitorizar cambios en ~/.config/<agent>/ y ~/.<agent>/ para detectar diffs que no provengan de una acción deliberada del usuario, y actualizar a las últimas versiones de los CLI (Claude Code ≥ 2.1.129 incluye un parche parcial que endurece el flujo de aprobación pero, según Adversa, no resuelve por completo los symlinks en la ruta del shell).
Estado
| Agente | Versión probada | Respuesta del proveedor |
|---|---|---|
| Claude Code | 2.1.128 | Endurecimiento parcial en 2.1.129 |
| Gemini CLI | 0.43.0 | Rechazado |
| Antigravity CLI | 1.0.2 | (mismo canal que Gemini) |
| Cursor CLI | 2026.05.20 | Rechazado como duplicado |
| Copilot CLI | 1.0.51 | En espera de respuesta |
| Grok Build CLI | 0.1.216 | En espera de respuesta |
| Codex CLI | 0.133.0 | Reporte de Bugcrowd cerrado |
SymJack está documentado con un repositorio de prueba de concepto en GitHub y vídeos de demostración por agente. Considere cualquier agente de codificación IA que opere en un repositorio que usted no escribió como capaz de alcanzar ejecución de código en su host con un único clic de aprobación — hasta que la interfaz de aprobación muestre rutas resueltas y la ruta del shell pase por los mismos controles que las herramientas de escritura nativas.
Sources
- → https://adversa.ai/blog/the-approval-prompt-is-lying-to-you-symlink-rce-in-five-ai-coding-agents-claude-code-cursor-antigravity-copilot-grok-build/
- → https://research.checkpoint.com/2026/rce-and-api-token-exfiltration-through-claude-code-project-files-cve-2025-59536/
- → https://adversa.ai/blog/trustfall-coding-agent-security-flaw-rce-claude-cursor-gemini-cli-copilot/
- → https://github.com/adversa-ai/research/tree/main/artifacts/symlink-to-rce