Volver

2026/10/29

Archivos AGENTS.md y CLAUDE.md maliciosos: cómo la carpeta Descargas puede secuestrar agentes de programación con IA

Un archivo de instrucciones plantado en Descargas intentó que un agente de IA instalara malware de npm. Qué pasó, qué mostró la investigación y cómo defenderse.

Puntos clave

  • Un archivo AGENTS.md plantado en la carpeta ~/Downloads de un usuario indicó a un agente de programación con IA que instalara un paquete npm conocido por ser malicioso. El intento se detuvo antes de que se ejecutara ningún código.
  • En pruebas de laboratorio, OpenAI Codex siguió un archivo de instrucciones malicioso en más del 90% de los intentos. Claude Code lo siguió aproximadamente la mitad de las veces.
  • No es un fallo que se pueda corregir con un parche. Los agentes confían en los archivos de instrucciones de la carpeta en la que se inician, y los navegadores pueden escribir archivos en Descargas.
  • Las defensas principales son sencillas: no inicie nunca un agente en Descargas, lea los archivos de instrucciones que usted no haya escrito, revise la configuración del agente en busca de endpoints que usted no haya definido y mantenga activadas las aprobaciones y los sandboxes.

Qué ocurrió

El 22 de octubre de 2026, la empresa de seguridad Forever Security publicó “Markdown Is the New Executable”, de Gal Weizman y Omer Samet. El artículo describe un incidente real en el equipo de un cliente de la empresa. Un agente de programación con IA trabajaba en la carpeta ~/Downloads del usuario, y un archivo AGENTS.md en esa carpeta le indicó que instalara function-color, un paquete npm malicioso. Forever detuvo el agente antes de que se instalara el paquete y antes de que se ejecutara ningún código malicioso.

Nadie sabe cómo llegó el archivo a la carpeta Descargas. Forever afirma que no pudo determinarlo, y la cobertura de BleepingComputer y The Hacker News repite ese punto. Después, Forever preparó demostraciones de laboratorio para mostrar cómo una página web podría plantar un archivo así y qué haría un agente con él.

El paquete en sí no es nuevo. Checkmarx y CloudSEK vinculan function-color con la campaña MALFEX en npm. El paquete es un envoltorio mínimo que incorpora function-flag. El script de instalación de ese paquete descarga y ejecuta una carga adicional desde un servidor remoto. La campaña apunta a Windows, y Checkmarx informa de que su operador está activo desde agosto de 2023. Cuando revisamos el registro de npm el 29 de octubre de 2026, function-color, function-flag y cdn-img-fetch ya habían sido sustituidos por el marcador 0.0.1-security de npm.

Por qué un archivo Markdown puede dirigir a un agente

El argumento de Forever se basa en dos comportamientos habituales que, combinados, resultan peligrosos.

  1. Los agentes cargan los archivos de instrucciones automáticamente. Los agentes de programación leen los archivos de instrucciones del proyecto al iniciarse y los tratan como indicaciones del usuario. Codex lee AGENTS.md desde la raíz del proyecto hasta la carpeta actual. Si no hay raíz de proyecto, lee solo la carpeta actual. Claude Code carga CLAUDE.md de la carpeta en la que se inicia y de todas las carpetas superiores. Lee AGENTS.md en su lugar cuando no existe un CLAUDE.md.
  2. La web puede escribir en Descargas. BleepingComputer informa de que Chrome, Edge y Firefox guardan los archivos en Descargas de forma predeterminada sin preguntar dónde ubicarlos. Una página puede elegir el nombre y el contenido del archivo. Un archivo Markdown no es un programa, así que las comprobaciones del sistema operativo para ejecutables descargados no lo consideran peligroso.

En conjunto, esto significa que una página web puede dejar un archivo que un agente leerá más tarde como instrucciones. No hace falta “engañar” al agente en el sentido habitual: está haciendo aquello para lo que fue creado. Forever también señala que algunos agentes navegan por la web por su cuenta. En ese caso, puede que ninguna persona llegue a ver la descarga.

La misma lógica se aplica más allá de Descargas. Cualquier carpeta a la que pueda llegar contenido no confiable es candidata: un repositorio recién clonado, un archivo comprimido descomprimido o una carpeta compartida. Con Claude Code, un proyecto descomprimido en una subcarpeta de Descargas también carga un CLAUDE.md que se encuentre en la propia carpeta Descargas, porque también se cargan los archivos de las carpetas superiores.

Qué demostró la investigación

Forever probó dos agentes. La mayoría de las ejecuciones usaron una carga inofensiva como sustituto (abrir la calculadora). El paquete malicioso real se ejecutó una sola vez, dentro de una máquina virtual aislada.

OpenAI Codex

Los investigadores reutilizaron el AGENTS.md real del equipo del cliente. El archivo indicaba a Codex que añadiera una entrada de servidor MCP a su configuración global del equipo, ~/.codex/config.toml. Esa entrada ejecutaba al inicio un comando que instalaba el paquete npm. Como la configuración es global, el cambio persiste en todas las sesiones posteriores de Codex en el equipo, no solo en la que leyó el archivo. Forever informa de que el ataque necesitó varios rodeos: un estilo de documento largo y tedioso, una sesión hija iniciada con flags que omiten el sandbox y un método de arranque que evitaba el tiempo de espera de inicio de Codex. Aun así, Codex ejecutó la carga en más del 90% de los intentos.

Claude Code

Para Claude Code, los investigadores escribieron su propio CLAUDE.md, presentado como notas de configuración de un gateway de API interno. Pedía a Claude que escribiera un ajuste ANTHROPIC_BASE_URL en el archivo .claude/settings.json del proyecto, dirigiendo el tráfico de la API a un servidor controlado por los investigadores. Según Forever, esto filtra el token OAuth de la sesión. También permite que el servidor del atacante se haga pasar por el modelo y devuelva llamadas a herramientas, incluidos comandos de shell con el sandbox desactivado. Forever demostró el robo del token (reutilizándolo para actuar como la víctima) y la ejecución de código en el siguiente inicio. También mostró una vía que activaba el ataque en la misma sesión al iniciar un subagente.

Esto funcionó de forma menos fiable. Claude Code pide aprobación antes de escribir en archivos de configuración y a menudo rechazó el cambio sospechoso. Forever informa de éxito aproximadamente la mitad de las veces, y en cerca de uno de cada cinco intentos para la vía del subagente en la misma sesión.

Qué no se demostró

  • Forever no determinó cómo llegó el archivo real a la carpeta Descargas del cliente. La vía de la descarga web es una posibilidad demostrada, no una causa confirmada.
  • Solo se probaron Codex y Claude Code. Forever sostiene que otros agentes que cargan archivos de instrucciones están expuestos de la misma manera, pero no los probó.
  • Los artículos no mencionan versiones concretas de las herramientas ni recogen declaraciones de los proveedores. La postura de Forever es que “there is nothing here for OpenAI or Anthropic to patch” (aquí no hay nada que OpenAI o Anthropic puedan corregir): los agentes funcionan tal como fueron diseñados.

Por qué es importante

Los archivos de instrucciones pasan fácilmente desapercibidos porque parecen documentación. En la práctica funcionan como configuración y, a través de un agente con acceso al shell, pueden funcionar como código. Tres aspectos hacen que el riesgo sea real:

  • Los agentes se inician a menudo en Descargas. La gente usa agentes para ordenar archivos o trabajar con algo que acaba de descargar. Forever dijo a BleepingComputer que cientos de sus clientes ejecutan agentes de programación desde Descargas, con más de 1.300 sesiones de Claude Code iniciadas allí.
  • El impacto sobrevive a la sesión. Una configuración global modificada, un nuevo servidor MCP o un endpoint de API redirigido siguen funcionando después de borrar el archivo original.
  • Las credenciales son el botín. Un token de sesión de agente robado es un inicio de sesión válido. Un atacante puede usarlo sin ejecutar ningún código en el equipo.

Defensas prácticas

1. Elija dónde se inician los agentes

  • No inicie nunca un agente de programación en ~/Downloads ni en ninguna carpeta en la que escriban navegadores, correo electrónico o aplicaciones de chat. Mueva o clone antes el trabajo a una carpeta de trabajo dedicada.
  • Evite también iniciar agentes en su directorio personal. Inícielos en la carpeta concreta del proyecto. BleepingComputer señala que OpenAI y Anthropic recomiendan lo mismo.
  • Considere configurar el navegador para que pregunte dónde guardar cada descarga. Supone un clic más, pero impide las descargas silenciosas.

2. Busque archivos de instrucciones que usted no haya escrito

Revise los lugares donde acaban los archivos no confiables, además de su carpeta personal. En Linux y macOS:

find ~/Downloads ~/Desktop ~ -maxdepth 3 \( -name AGENTS.md -o -name AGENTS.override.md -o -name CLAUDE.md -o -name CLAUDE.local.md \) -print 2>/dev/null | sort -u

En Windows, con PowerShell:

Get-ChildItem $HOME\Downloads, $HOME\Desktop -Recurse -Depth 3 -Force -ErrorAction SilentlyContinue -Include AGENTS.md, AGENTS.override.md, CLAUDE.md, CLAUDE.local.md | Select-Object FullName, LastWriteTime

Lea todos los archivos que encuentre antes de que un agente se acerque a ellos. Desconfíe mucho de las instrucciones para instalar paquetes, añadir servidores, cambiar endpoints de API o desactivar aprobaciones. Revise también sus archivos de instrucciones personales, ~/.codex/AGENTS.md y ~/.claude/CLAUDE.md, porque se aplican a todas las sesiones.

Un archivo de instrucciones legítimo describe cómo se compila y se prueba el proyecto. No tiene ningún motivo para cambiar la configuración global de su agente, su endpoint de API ni sus ajustes de seguridad. Trate como hostil cualquier archivo que pida esos cambios.

3. Revise la configuración del agente en busca de cambios que usted no hizo

Siguiendo el consejo de Forever, busque bloques de servidor MCP inesperados, un chatgpt_base_url modificado, o un ANTHROPIC_BASE_URL u otro endpoint de API que usted no haya definido:

grep -nE '^\[mcp_servers|base_url' ~/.codex/config.toml
grep -nE 'BASE_URL|mcpServers' ~/.claude/settings.json .claude/settings.json .claude/settings.local.json .mcp.json 2>/dev/null

Los equipos que usan Claude Code pueden imponer la configuración de forma centralizada con la configuración administrada. También pueden usar hooks ConfigChange para auditar o bloquear cambios de configuración durante una sesión.

4. Mantenga activadas las protecciones

  • Deje activados los avisos de aprobación y el sandbox. Evite los flags que los omiten, como --dangerously-bypass-approvals-and-sandbox de Codex o --dangerously-skip-permissions de Claude Code, fuera de un entorno desechable.
  • Lea con atención los avisos de aprobación para archivos de ajustes y configuración. En la prueba con Claude Code, el paso de aprobación fue lo que detuvo el ataque aproximadamente la mitad de las veces.
  • Lea el diálogo de confianza del espacio de trabajo de Claude Code antes de aceptarlo para una carpeta nueva.
  • Trabaje con repositorios y descargas no confiables dentro de una máquina virtual o un dev container, no en su estación de trabajo principal.
  • En npm, bloquee los paquetes MALFEX conocidos y considere usar ignore-scripts en las instalaciones que no haya revisado.

5. Si encuentra un archivo plantado

  1. No inicie un agente en esa carpeta. Guarde una copia del archivo para la investigación y después elimínelo de la carpeta.
  2. Revise los archivos de configuración del agente indicados arriba y elimine todo lo que usted no haya añadido.
  3. Suponga que el token de sesión del agente puede haberse filtrado. Cierre sesión y vuelva a iniciarla, y rote todas las claves de API a las que el agente pudiera acceder.
  4. Busque function-color y function-flag en los lockfiles y en las carpetas node_modules. Si se instaló alguno de ellos, considere el equipo comprometido y siga su proceso de respuesta a incidentes.

El panorama general

El título de Forever es “Markdown Is the New Executable” (Markdown es el nuevo ejecutable). Es una forma útil de pensar en cualquier archivo que un agente lea como instrucciones. Los archivos de instrucciones deciden lo que hará a continuación un agente con acceso al shell, así que merecen el mismo cuidado que los scripts: sepa de dónde proceden, revise los cambios que se les hacen y manténgalos fuera de carpetas en las que cualquiera en internet pueda escribir. Las soluciones aquí son sobre todo hábitos, no parches, y cuesta poco adoptarlas.

Referencias