sistema: OPERATIVO
← volver a todos los hacks
SUPPLY CHAIN CRITICAL NEW

Su agente de código ejecuta git antes de que usted escriba — y el repositorio elige el comando

Manifold Security divulgó el 1 de septiembre de 2026 ocho fallos en siete agentes CLI: la configuración git de un repositorio recibido nombra un programa que el agente ejecuta al arrancar, fuera del sandbox.

2026-09-08 // 6 min affects: claude-code, openai-codex, cursor-cli, goose, qwen-code, grok-build, hermes-agent

¿De qué se trata?

El 1 de septiembre de 2026, Manifold Security publicó GitSpawn: ocho hallazgos repartidos en siete agentes de código de línea de comandos, en los que un repositorio que a usted le enviaron puede nombrar un comando que el agente ejecuta en su máquina. Cuatro seguían sin corregir en el momento de la publicación, reconfirmados sobre versiones actuales. The Hacker News lo cubrió al día siguiente y señaló que OpenAI publicó ese mismo día tres avisos propios sobre la misma clase de fallo en Codex, acreditados a tres grupos de investigación no relacionados entre sí.

Los productos afectados no son marginales. Claude Code, OpenAI Codex, Cursor CLI, goose, Qwen Code, Grok Build y Hermes Agent — cerca de medio millón de estrellas de GitHub sumadas entre los proyectos de código abierto, y más de 77 millones de descargas mensuales de npm solo para Claude Code, según la cifra de la API de npm que cita Manifold.

Lo destacable es que nada de esto involucra al modelo. Sin prompt, sin inyección, sin jailbreak. Es el subproceso que el agente lanza antes de haber dicho una sola palabra.

Cómo funciona

Todo agente de código CLI recopila contexto al abrir una carpeta: qué rama, qué archivos cambiaron, qué rutas están bajo seguimiento. Todos recurren a git para ello — en algunos agentes ya al arrancar, antes del aviso de confianza del espacio de trabajo, y en uno de ellos antes incluso de que el usuario se haya autenticado.

El problema está en lo que heredan esas llamadas.

El agente arranca en ./proyecto-recibido

   ├─ lanza:   git status --porcelain=2 --branch
   │           (o git diff --name-only HEAD — la elección da igual)

   ├─ git refresca el índice antes de responder

   ├─ ese refresco consulta core.fsmonitor
   │           …que git lee de ./proyecto-recibido/.git/config

   └─ ese valor es un PROGRAMA. Git lo ejecuta.
              → se ejecuta con la identidad del usuario
              → fuera del sandbox del agente
              → sin solicitud de aprobación, sin nada en pantalla

core.fsmonitor es un ajuste de rendimiento legítimo para repositorios grandes: en lugar de consultar cada archivo, git le pregunta a un programa auxiliar qué ha cambiado. Comportamiento documentado, intencionado, y leído del propio archivo de configuración del repositorio. Como escribió Cobalt en un informe de red team el pasado diciembre, se trata de abuso de una funcionalidad, no de un bug — la flexibilidad de git combinada con la automatización de un IDE moderno. Manifold confirmó además una segunda vía en Claude Code, alcanzada mediante un comando de revisión, que se apoya en una clave de configuración distinta del mismo tipo; los investigadores han omitido deliberadamente esa clave mientras el fallo siga abierto.

La forma de entrega es la restricción que hace esto manejable. Clonar una URL hostil no produce nada. git clone, fetch y pull no arrastran la configuración local de un repositorio. El repositorio tiene que llegar como archivos, con su directorio .git ya dentro: un .zip compartido, una carpeta sincronizada, una unidad de red, una memoria USB. Es decir, exactamente la forma en que los colegas se pasan proyectos y en que los consultores entregan trabajo a sus clientes.

Ejemplo de prompt

Un prompt defensivo para dar a su agente antes de dejarle abrir una carpeta que llegó como archivos. Inspecciona la configuración en lugar de confiar en ella, y el valor hostil está censurado — lo que importa es la forma del ajuste, no una carga funcional.

# Defensive check — before opening a repo you RECEIVED as files
Read ./received-project/.git/config. Do not open the folder with an agent yet.
List every key whose value is a program:
  core.fsmonitor, core.hooksPath, filter.*.clean, filter.*.process, attr.tree
For each, report the key, its value, and whether that path is executable.
Never run a value you find. A hostile entry looks like:
  [core]
      fsmonitor = [REDACTED payload path]
Then re-check with a config-stripped call:
  git -c core.fsmonitor=false status --porcelain

Observe lo que no hace: nunca ejecuta el valor que encuentra, y la llamada final neutraliza la configuración del repositorio en lugar de leerla. Es el mismo invariante que se pide a los fabricantes adoptar en el propio harness.

Por qué importa

El radio de impacto es la cuenta del desarrollador, no la sesión del agente. El código del atacante se ejecuta con los privilegios del usuario: claves SSH, credenciales de nube presentes en el entorno, tokens en la configuración del shell, todos los repositorios en disco. El modelo de permisos del agente nunca ve la llamada, porque fue el propio código del agente quien la emitió.

Tres puntos estructurales merecen retenerse.

El sandbox nunca estuvo en la ruta. Se ha dedicado un esfuerzo de ingeniería considerable a los avisos de aprobación y a los sandbox de herramientas para lo que el modelo decide hacer. Aquí todo ocurre antes de que el modelo sea siquiera contactado. Un control que solo cubre las acciones iniciadas por el modelo deja desprotegidos los subprocesos del propio arnés.

Los avisos de confianza llegan demasiado tarde. En Claude Code y Hermes Agent la carga se ejecuta antes de que se acepte el aviso de confianza; en Qwen Code, antes de la autenticación; en Grok Build, con la primera pulsación de tecla. Un diálogo de confianza que aparece después de la recopilación de contexto es decorativo.

Es una clase conocida, redescubierta. Sonar reportó el mismo punto de ejecución en abril de 2026 e identificó la misma elusión del diálogo de confianza en Visual Studio Code y en los IDE de JetBrains años antes. Anthropic desplazó la secuencia de arranque en la 2.0.34 (noviembre de 2025) para cerrarlo; Manifold constata ese mismo comportamiento de arranque de nuevo presente en la 2.1.193 (junio de 2026). La regresión es el resultado esperable cuando la corrección consiste en un cambio de orden en lugar de en un invariante.

Cinco de los ocho reportes de Manifold volvieron marcados como duplicados de hallazgos presentados de forma independiente por otros investigadores, uno de ellos el mismo día. Varios equipos están convergiendo a la vez sobre esta superficie.

Defensas

Si recibe un repositorio como archivos — cualquier cosa que no haya llegado mediante git clone:

  • Inspeccione .git/config antes de abrir el directorio con un agente. Busque core.fsmonitor, core.hooksPath y attr.tree junto a un filtro clean o process — cualquier ajuste cuyo valor sea un programa.
  • Verifique directamente un repositorio sospechoso: git config --get core.fsmonitor.
  • Audite su configuración global: git config --global --list | grep fsmonitor.
  • Desactive el ajuste por defecto: git config --global core.fsmonitor false. Pierde una optimización de rendimiento que la mayoría de repositorios nunca necesitó.
  • Prefiera clonar antes que descomprimir. Si le envían un archivo comprimido, súbalo a un remoto y clónelo, o elimine .git y reinicialice.

Si usted desarrolla un agente — la corrección que recomiendan tanto Manifold como OpenAI:

  • Neutralice la configuración del repositorio en cada llamada en segundo plano: git -c core.fsmonitor=false status. Establezca una lista blanca de las claves de configuración que transmite, en lugar de una lista negra de las que conoce, porque core.fsmonitor no es el único punto de ejecución.
  • Traslade la recopilación de contexto a después del aviso de confianza del espacio de trabajo, y trate ese orden como un invariante verificado, no como un arreglo puntual — esta secuencia exacta ya ha sufrido una regresión.
  • Ejecute los subprocesos de segundo plano dentro del mismo sandbox que las llamadas de herramientas iniciadas por el modelo. La separación actual, en la que las llamadas propias del arnés escapan de la frontera, es la causa raíz.

En el plano organizativo: fije y haga seguimiento de las versiones de sus agentes (una instalación que se quede por debajo de la versión corregida sigue expuesta, independientemente de lo que haya publicado el fabricante), y trate «abrir una carpeta recibida con un agente» como un evento de ejecución en su modelo de amenazas, no como una lectura.

Estado

AgenteReportadoEstado en la reprueba de Manifold del 1 sep.Referencia
goose13 jul. 2026Corregido en 1.44.0CVE-2026-72718, puntuación base CVSS 4.0: 7.0
Claude Code (core.fsmonitor)26 jun. 2026Corregido en 2.1.196Sin aviso publicado por el fabricante
Claude Code (vía de revisión)15 jul. 2026Sin corregir — confirmado en 2.1.252Clave de configuración omitida por los investigadores
OpenAI Codex20 jul. 2026Corregido — CLI 0.131.0, Desktop 26.519.xCVE-2026-19592 y otros dos
Cursor CLI8 jul. 2026CorregidoDuplicado de un reporte anterior
Qwen Code7 jul. 2026Sin corregir — confirmado en 0.22.3Aceptado por el SRC de Alibaba
Grok Build14 jul. 2026Sin corregir — confirmado en 1.0.13Reporte anterior cerrado como «informativo»
Hermes Agent20 jul. 2026Sin corregir — confirmado en 0.21.0CVE-2026-71963, asignado por VulnCheck
ExplotaciónNinguna fuente reporta explotación activa; ninguno de estos identificadores figura en el catálogo CISA KEV al 2 sep. 2026

Las versiones, fechas y desenlaces de divulgación indicados arriba son los reportados por Manifold Security y The Hacker News en las publicaciones enlazadas. Manifold afirma haber encontrado el mismo patrón en agentes que no nombra, y retuvo tanto un repositorio listo para usar como la segunda clave de configuración de Claude Code. Compruebe la versión que tiene realmente instalada en lugar de asumir que un parche del fabricante le ha llegado.

Sources