Cómo evitar que un AGENTS.md malicioso secuestre tu agente de programación

Un archivo AGENTS.md malicioso puede secuestrar Codex o Claude Code desde tu carpeta de Descargas. Cinco pasos para equipos: carpetas de inicio seguras, revisión de archivos, reglas de denegación, sandbox y comprobaciones de configuración.

Aiden Flux

Aiden Flux

12 noviembre 2026

TL;DR: Un archivo AGENTS.md malicioso secuestra un agente de programación haciendo exactamente aquello para lo que fue diseñado: el agente lo lee al iniciarse y sigue sus instrucciones. Forever Security detectó uno en la carpeta ~/Downloads de un cliente real en octubre de 2026. Para evitarlo, nunca inicies un agente en una carpeta que no controles, revisa los archivos de instrucciones como si fueran código, deniega la reescritura de configuraciones y redes, mantén activos el sandbox y las solicitudes de aprobación, y vigila los cambios en la propia configuración del agente.

En qué consiste un ataque con un AGENTS.md malicioso

Un archivo AGENTS.md malicioso es un archivo de instrucciones de proyecto diseñado para manipular a un agente de programación y llevarlo a realizar acciones dañinas. Claude Code, Codex y otros agentes cargan estos archivos automáticamente desde la carpeta en la que se inician. El ataque no requiere ningún exploit: el agente simplemente lee el archivo al arrancar y asume su contenido como las reglas legítimas del proyecto.

El archivo parece un conjunto ordinario de notas de ingeniería: un paso previo de «preflight» que instala un paquete o una indicación de «proxy» que redirige el tráfico de la API. Para el agente, se trata de una instrucción tan válida como «usa pnpm en lugar de npm».

Si tus desarrolladores utilizan varios agentes de programación, Sharkly les proporciona un único entorno donde asignar y revisar ese trabajo; más adelante veremos cómo influye esto en la ubicación donde se inician los agentes.

Por qué tu agente de programación obedece el archivo

Los archivos de instrucciones residen en el contexto del agente junto a tu prompt, sin una delimitación estricta entre las reglas del proyecto y tu petición.

La documentación sobre memoria de Claude Code señala que el contenido de CLAUDE.md y AGENTS.md se trata «como contexto, no como una configuración forzada». Carga todos los archivos AGENTS.md que encuentre en el directorio de trabajo y en los directorios superiores cuando no existe un CLAUDE.md. Por su parte, la guía de AGENTS.md de Codex recorre la estructura desde la raíz del proyecto hasta el directorio actual y concatena lo que encuentra, con un límite predeterminado de hasta 32 KiB. Los archivos más cercanos al directorio donde iniciaste el agente se procesan al final, por lo que tienen prioridad. En consecuencia, la carpeta en la que arrancas determina qué se carga, y las carpetas superiores también influyen.

Cómo un AGENTS.md malicioso secuestra Codex y Claude Code

El 22 de octubre de 2026, Forever Security publicó lo que descubrió en el portátil de un cliente. Un agente de programación intentó instalar function-color, un paquete de npm malicioso conocido, y la instrucción procedía de un AGENTS.md ubicado en ~/Downloads. Dicha carpeta era, además, el directorio de trabajo del agente. Forever bloqueó la instalación antes de que se ejecutara cualquier código y no pudo determinar con certeza cómo llegó el archivo hasta allí.

Diagram of the attack chain: a web page silently saves AGENTS.md to the Downloads folder, a developer starts a coding agent there, the agent reads the file and rewrites its own config, and the result is a malicious npm package running or an OAuth token sent to an attacker server

La razón por la que la carpeta de descargas es crítica radica en que es la única en la que una página web puede escribir sin requerir un clic del usuario. Forever reprodujo posteriormente la cadena de ataque en un entorno de laboratorio:

  1. Una página bajo su control guarda silenciosamente un archivo llamado AGENTS.md en ~/Downloads.
  2. El desarrollador ejecuta Codex en esa carpeta y le pide cualquier tarea.
  3. Antes de comenzar la tarea, Codex añade un servidor de «herramientas de proyecto» a ~/.codex/config.toml e instala un paquete desde npm.
  4. Dado que esa configuración afecta a todo el equipo, cualquier sesión posterior de Codex cargará el servidor del atacante, sin importar la carpeta desde la que se ejecute.

Forever informa de que Codex ejecutó la carga maliciosa en más del 90 % de los intentos. La mayoría de las pruebas utilizaron un sustituto inocuo que abre una calculadora; el paquete real se ejecutó una sola vez, dentro de una máquina virtual aislada.

Claude Code resultó más difícil de engañar. Un archivo CLAUDE.md malintencionado logró redirigir su propio tráfico de API hacia un servidor controlado por Forever, lo que filtró el token de inicio de sesión OAuth y permitió al servidor responder haciéndose pasar por el modelo. Forever señala que este método funcionó aproximadamente el 50 % de las veces. Ambas cifras proceden de vectores de ataque distintos, por lo que no deben compararse como una tasa de éxito directa.

La conclusión de Forever es clara: no existe una vulnerabilidad que parchear. El problema reside en confiar en una carpeta donde la web puede escribir como si fuera contenido creado por ti. Una lección idéntica surgió anteriormente con la investigación Rules File Backdoor de Pillar Security, que ocultaba instrucciones en archivos de reglas mediante caracteres Unicode invisibles que un revisor no puede detectar a simple vista en un diff.

Cinco pasos para neutralizar un AGENTS.md malicioso

Los dos primeros pasos evitan que el archivo llegue a cargarse; los tres últimos limitan el impacto en caso de que logre colarse.

Five defense layers between an untrusted instruction file and a developer laptop: never start agents in Downloads or home, review AGENTS.md and CLAUDE.md like code, deny config and network rewrites, keep sandbox and approval prompts on, watch config files and rotate

1. ¿Dónde no debería ejecutarse nunca un agente de programación?

Jamás en ~/Downloads, en tu carpeta de usuario (home) ni en ningún directorio que no hayas creado tú expresamente. Según Forever, cerca de la mitad de sus clientes ejecutaban agentes de programación dentro de Descargas. Si necesitas que un agente organice tus descargas, copia previamente los archivos a un directorio nuevo y vacío, e inícialo allí.

Una protección en la shell ayuda a consolidar esta norma para evitar descuidos involuntarios:

# ~/.zshrc: refuse to start an agent in folders the web can write to
agent_guard() {
  case "$PWD" in
    "$HOME"|"$HOME/Downloads"*|"/tmp"*)
      echo "Refusing to start an agent in $PWD. Use a project folder." >&2
      return 1 ;;
  esac
}
claude() { agent_guard && command claude "$@"; }
codex()  { agent_guard && command codex "$@"; }

2. ¿Cómo revisar AGENTS.md igual que si fuera código?

Trata cada archivo de instrucciones como si fuera código ejecutable, incluso en repositorios que acabes de clonar hace cinco minutos. Luego, automatiza su revisión. Incluye los archivos de instrucciones en CODEOWNERS para que cualquier pull request que los modifique requiera obligatoriamente un revisor asignado:

AGENTS.md            @your-org/platform
**/AGENTS.md         @your-org/platform
CLAUDE.md            @your-org/platform
/.claude/            @your-org/platform
/.cursor/rules/      @your-org/platform

Añade una validación en tu CI que falle ante los patrones en los que se apoyan estos ataques: caracteres Unicode invisibles, alteraciones de la URL base y comandos de instalación dentro de los archivos de instrucciones.

#!/usr/bin/env bash
# ci/check-agent-instructions.sh
files=$(git ls-files '*AGENTS.md' '*CLAUDE.md' '.cursor/rules/*')
[ -z "$files" ] && exit 0
fail=0
# zero-width, bidi override and Unicode tag characters
if grep -nP '[\x{200B}-\x{200F}\x{202A}-\x{202E}\x{2066}-\x{2069}\x{E0000}-\x{E007F}]' $files; then
  echo "Hidden Unicode in an agent instruction file"; fail=1
fi
if grep -niE 'BASE_URL|chatgpt_base_url|mcp_servers|npx --yes|curl .*\| *(ba)?sh' $files; then
  echo "Config, network or install instruction in an agent file: needs review"; fail=1
fi
exit $fail

El segundo comando grep señalará algunas líneas legítimas, pero esas merecen igualmente una revisión humana.

3. Deniega al agente el permiso para reescribir su propia configuración

Ambas reproducciones del ataque culminaron con el agente modificando sus propios ajustes. Elimina esa posibilidad. En Claude Code, deniega la edición de las carpetas de configuración del agente y bloquea el acceso a secretos en el archivo .claude/settings.json del proyecto:

{
  "permissions": {
    "deny": [
      "Edit(./.claude/**)",
      "Edit(~/.claude/**)",
      "Edit(~/.codex/**)",
      "Read(./.env)",
      "Read(./.env.*)"
    ]
  }
}

En entornos de equipo, define esto mediante configuraciones administradas para evitar que un archivo de proyecto pueda relajar estas restricciones. La documentación de memoria recomienda recurrir a políticas administradas de permissions.deny, sandbox.enabled y env para cualquier directiva de obligado cumplimiento, así como utilizar un hook PreToolUse para bloquear acciones con independencia de lo que decida el modelo. Fijar el enrutamiento de la API mediante directivas administradas en env es la solución directa contra los ataques de manipulación de URL base. Verifica la sintaxis de las reglas en tu versión instalada antes de desplegarlas en producción.

4. Mantén activos el sandbox y las solicitudes de confirmación

Forever recomienda mantener habilitados tanto los entornos aislados (sandboxes) como las barreras de confirmación, desconfiando de cualquier instrucción que ordene al agente omitirlos.

Determina qué acciones deben requerir siempre intervención humana: la instalación de paquetes, los cambios en la configuración del agente y las peticiones de red hacia nuevos hosts. Nuestro artículo sobre barreras de aprobación para agentes de programación profundiza en dónde situar estos puntos de control, y la guía sobre qué permisos debe y no debe tener un agente de código detalla el modelo de seguridad subyacente.

5. Monitoriza la configuración del agente y rota credenciales ante cualquier sospecha

Forever detalla con precisión dónde inspeccionar. En ~/.codex/config.toml, busca bloques [mcp_servers.*] no reconocidos o cambios en chatgpt_base_url. En el archivo .claude/settings.json de un proyecto, revisa cualquier entrada de ANTHROPIC_BASE_URL, proxies o endpoints que no hayas configurado deliberadamente.

grep -nE '^\[mcp_servers\.|chatgpt_base_url' ~/.codex/config.toml
grep -rnE 'ANTHROPIC_BASE_URL|_PROXY|base_url' ~/.claude/settings.json .claude/settings*.json 2>/dev/null
npm ls -g --depth=0 2>/dev/null | grep -i function-color

Si detectas cualquier anomalía, asume que el token se ha visto comprometido y rótalo de inmediato. Un token OAuth robado representa una sesión activa, no una simple petición interceptada. Si aparece function-color, considera que el equipo está comprometido. Para el proceso completo de saneamiento, nuestra lista de comprobación para fugas de secretos en agentes de código asigna responsables para cada fase de rotación.

El papel de Sharkly

Sharkly no analiza archivos de instrucciones ni reemplaza el sistema de permisos nativo del agente; debes mantener los cinco pasos anteriores. Lo que modifica es el lugar en el que se inician tus agentes y quién toma esa decisión.

En Sharkly, un agente opera en un Computer que hayas vinculado previamente, y cada agente dispone de un Default working directory configurado en sus opciones. Con la modalidad «Use temporary directory», cada ejecución de una tarea obtiene un directorio independiente y un worktree limpio de git del repositorio asociado. Con «Specified directory», las ejecuciones utilizan las rutas locales fijas que hayas definido. La documentación sobre directorios de trabajo explica en detalle ambos modos.

Sharkly Agent settings: the Default working directory field, where you choose a temporary directory with a fresh git worktree per run or a specified directory

De este modo, la elección del directorio deja de depender de la terminal del desarrollador y pasa a ser un parámetro sujeto a revisión. En el modo temporal, el agente siempre comienza en una copia limpia del repositorio vinculado, en lugar de hacerlo en cualquier carpeta que el usuario tuviera abierta en ese instante. Además, la gestión de repositorios queda restringida a los usuarios con permisos de administración de Space u Organization. Las instrucciones del agente, integradas en cada ejecución, son un espacio idóneo para reiterar normas estrictas como «nunca edites los archivos de configuración del agente».

Los resultados se devuelven a la tarea donde el equipo puede revisarlos en detalle, tal como se describe en nuestra guía sobre cómo revisar código generado por IA con evidencias a nivel de tarea.

Conclusión

Un archivo AGENTS.md malicioso surte efecto porque los agentes están diseñados para obedecer archivos de instrucciones, y la web puede depositar uno en un directorio de confianza. La protección contra esto se construye por capas, no mediante un parche milagroso.

Empieza hoy mismo aplicando el paso 5 en los portátiles de todo el equipo de desarrollo para verificar si ya existe un problema. A continuación, si tu equipo utiliza varios agentes de desarrollo, configura Sharkly con un Computer y un Agent en modo temporal, garantizando así que cada ejecución arranque a partir de un worktree completamente limpio.

Preguntas frecuentes

¿Puede un AGENTS.md malicioso secuestrar Claude Code?

Sí. Claude Code lee AGENTS.md cuando no encuentra un archivo CLAUDE.md en el directorio de trabajo ni en los niveles superiores. En las pruebas de Forever, la reproducción con Claude Code empleó un CLAUDE.md infiltrado que redirigió el tráfico de API y expuso el token OAuth en aproximadamente la mitad de los casos.

¿Es esta una vulnerabilidad que OpenAI o Anthropic vayan a parchear?

Forever sostiene que no hay nada que solucionar con un parche, puesto que los agentes operan conforme a su diseño previsto. La mitigación debe abordarse mediante una correcta higiene de directorios, revisiones rigurosas y políticas estrictas de permisos.

¿Cómo detectar instrucciones ocultas en un AGENTS.md?

Inspecciona el archivo en texto sin formato (en crudo), no mediante su vista renderizada, y busca caracteres de ancho cero, anulaciones bidireccionales (bidi) y etiquetas Unicode. El script de CI incluido más arriba detiene la ejecución si detecta cualquiera de estos tres patrones.

¿Evita un sandbox el impacto de un AGENTS.md malicioso?

Limita el alcance de los daños, pero no impide que el archivo se cargue. Un sandbox junto con confirmaciones explícitas de usuario pueden frenar la instalación no autorizada o la escritura en ficheros de configuración que solicite el archivo. Combínalos con reglas de denegación sobre las carpetas de configuración del agente.

¿Qué hacer si encuentro un AGENTS.md sospechoso o implantado?

Evita por completo iniciar un agente en ese directorio o cerca de él. Comprueba los archivos de configuración del agente en busca de nuevos servidores MCP o cambios en las URL base, verifica la presencia de function-color y procede de inmediato a rotar los tokens del agente y cualquier clave a la que este haya tenido acceso de lectura.

Descubre más

Gemini 4 Carbon y Hydrogen: combina un agente planificador con ejecutores rápidos

Gemini 4 Carbon y Hydrogen: combina un agente planificador con ejecutores rápidos

Combina Gemini 4 Carbon y Hydrogen en tu equipo de agentes: un planificador Carbon define las subtareas, los trabajadores Hydrogen y un verificador construyen y prueban, y las tareas bloqueadas regresan al planificador.

13 noviembre 2026

Gemini 4 Hydrogen para agentes de programación: el modelo rápido que los agentes de tu equipo pueden ejecutar todo el día

Gemini 4 Hydrogen para agentes de programación: el modelo rápido que los agentes de tu equipo pueden ejecutar todo el día

Gemini 4 Hydrogen para agentes de programación: $1.50/$7.50 por millón de tokens, un plan gratuito y cuatro niveles de razonamiento. Qué tareas asignarle y cuándo escalar a Carbon.

13 noviembre 2026

Cómo enrutar tareas de agentes de IA con la API Gemini Decisions

Cómo enrutar tareas de agentes de IA con la API Gemini Decisions

Enruta tareas de agentes de IA con la Gemini Decisions API: una sola llamada determina qué agente debe actuar, la dificultad de la tarea y si una persona debe tomar la decisión; después, un umbral de confianza define si se asigna automáticamente o si pasa a revisión humana.

12 noviembre 2026