Volver a todas las publicaciones
Publicado el · por Renaud Deraison

El agente recomendó el malware

Island descubrió FakeGit: unos 7.600 repositorios de GitHub maliciosos, más de 800 de ellos haciéndose pasar por skills de IA y servidores MCP, que siembran un loader de Windows llamado SmartLoader que instala el infostealer StealC. Lo nuevo es la entrega: AgentBaiting — Claude Code, Gemini y ChatGPT descubren esos repositorios por su cuenta, leen el README del atacante como documentación y te entregan los pasos de instalación. En una prueba, Claude Code clonó un repositorio y ejecutó los archivos por sí mismo. Bromure Agentic Coding corre todo ese camino, de la recomendación a la ejecución, dentro de una VM Linux desechable, donde un loader de Windows queda inerte y las únicas credenciales que robar son señuelos.

Le pediste a tu agente de código que encontrara un skill. Buscó, leyó un README que parecía documentación y te dijo que descargaras un ZIP y lo ejecutaras. Nadie te envió un enlace malo. El agente encontró el malware por su cuenta y lo recomendó — y en una prueba, clonó el repositorio y ejecutó los archivos por ti.

El 21 de julio de 2026, Island publicó una investigación sobre una campaña que llama FakeGit — y una técnica de entrega que bautiza AgentBaiting. Las cifras son grandes: unos 7.600 repositorios de GitHub maliciosos repartidos en cerca de 6.600 cuentas, de los cuales más de 800 se hacen pasar por skills de IA o servidores MCP — integraciones de Gmail y WhatsApp, herramientas de Databricks, Jenkins y Docker, el tipo de capacidad que un desarrollador le pide a un agente de código que vaya a buscar. Más de 600 de ellos también figuraban en registros de IA públicos como LobeHub, Glama, MCP.so y MCP Market. Para julio, un subconjunto de unos 200 repositorios había registrado más de 14 millones de descargas de sus archivos de release.

La carga útil es un loader de Windows llamado SmartLoader que establece persistencia y descarga StealC, un ladrón de información. El malware es la parte corriente. Cómo llega hasta ti es la parte nueva.

AgentBaiting: el agente es el vector de entrega

Los ataques a la cadena de suministro solían necesitar un cebo — un enlace en un correo, un nombre de paquete tipografiado que tecleabas mal, un resultado de búsqueda en el que hacías clic. FakeGit elimina al humano de ese paso. La conclusión de Island, en sus palabras: «Un agente de IA no necesita que se le dé un enlace malicioso. Puede descubrir un repositorio FakeGit por su cuenta, tratar el README como documentación legítima y pasar las instrucciones del atacante al usuario».

Lo probaron contra agentes reales:

  • Pídele a Claude Code que «encuentre un skill gratuito de prompts cinematográficos» y sacó a la luz adlaiponderous700/claude-skill-cinematic-prompt y, en algunas ejecuciones, recomendó los pasos de descargar y ejecutar.
  • Pídele a Gemini un «servidor MCP gratuito de Walmart» y devolvió DomingosNgongo/walmart-mcp como primer resultado, con un enlace directo de GitHub.
  • ChatGPT listó el mismo repositorio entre sus opciones y lo señaló como «el mejor lugar para empezar».

A ninguno se le entregó un enlace. Los agentes fueron a buscar una capacidad, encontraron los repositorios de la campaña mediante búsqueda y navegación de registros ordinarias, y leyeron el README escrito por el atacante como leen cualquier documentación — como un hecho. Los repositorios están vestidos para exactamente ese lector: Mann1988/awesome-claude-skills copia el verdadero ComposioHQ/awesome-claude-skills (67.000+ estrellas) y se rellena con 63 estrellas y 18 forks para parecer establecido. Los nombres de usuario están a un carácter del de un mantenedor conocido. El README guía al lector por tres pasos: descargar el ZIP de GitHub Releases, ejecutarlo, ignorar cualquier advertencia de seguridad, seguir el asistente de instalación.

Y en al menos una ejecución, informa Island, Claude Code no se detuvo en la recomendación — «clonó repositorios maliciosos y descargó los archivos maliciosos en la máquina de prueba» antes de que algo en los indicadores lo hiciera detenerse. Esa es toda la superficie de ataque en una frase: el agente, haciendo una tarea rutinaria, bajó la carga útil al disco por sí mismo.

Qué aterriza en realidad

El ZIP no es código fuente. Island es tajante sobre la señal: «Un servidor MCP o Skill legítimo es código fuente con un manifiesto, no un ZIP de Windows que contiene un script de arranque, un runtime renombrado y una carga útil disfrazada de archivo de texto». Dentro de un release de FakeGit como server_databricks_mcp_1.6.zip obtienes un pequeño lanzador .cmd o .bat, un runtime tipo LuaJIT renombrado (luau.exe) y una carga útil Lua ofuscada de unos 300 KB con el nombre de un archivo de datos — ico64.txt. El lanzador ejecuta start luau.exe ico64.txt, la ventana de la consola se oculta, y SmartLoader:

  • resuelve su dirección de mando y control a partir de un valor almacenado en un contrato inteligente de Polygon — descentralizado, difícil de desmantelar;
  • registra tareas programadas bajo %LOCALAPPDATA% para sobrevivir a un reinicio;
  • descarga etapas cifradas de GitHub e inyecta StealC en otro proceso mediante un cryptor de PE.

StealC hace entonces lo que hacen los infostealers, y un poco peor: toma contraseñas y cookies del navegador, datos de extensiones, credenciales de correo y de acceso remoto, capturas de pantalla, detalles del host — y sesiones activas. La nota de Island sobre este último punto importa: «StealC toma sesiones en vivo, no solo contraseñas, así que restablecer las contraseñas por sí solo no basta». Un token de sesión robado ya está más allá de tu inicio de sesión.

El agente«busca un skill»buscaRepo FakeGitnombre gemelo · 63 estrellasREADME = «docs»lee como hechoRecomiendadescargar + ejecutaro lo clona él mismoTu máquinaluau.exe ico64.txt → SmartLoader → StealCcontraseñas · cookies · sesiones · tareaexfilC2vía PolygonNadie hizo clic. El agente lo halló, lo creyó y lo trajo a casa.
AgentBaiting cierra el ciclo sin ningún cebo humano. El agente busca una capacidad, encuentra un repositorio FakeGit por su cuenta, lee el README del atacante como documentación y, o bien recomienda los pasos de instalación, o los clona y ejecuta él mismo. En una configuración normal que corre en tu máquina: el loader de Windows se ejecuta, StealC raspa tus contraseñas reales y sesiones en vivo, y el botín se exfiltra.

Por qué verificar el repositorio nunca fue toda la respuesta

El instinto es atrapar el repositorio malo — marcar el nombre gemelo, puntuar el README, poner la cuenta en lista negra. El propio consejo de Island apunta a algo más difícil: «Vigila las rutas que usan los agentes, no solo las rutas que usan los usuarios. AgentBaiting significa que una descarga, un git clone o un comando de shell pueden originarse en un agente que completa una tarea rutinaria». La búsqueda del agente no es una ruta a la que puedas ponerle un punto de control humano. Corre a velocidad de máquina, a través de miles de repositorios casi idénticos, y trata lo que encuentra como documentación, porque ese es su trabajo.

Este es el mismo muro contra el que el resto de la seguridad agéntica sigue chocando. Una lista de bloqueo que lee el comando pierde ante el shell que lo reescribe. Un escáner que lee el paquete pierde ante la carga útil que no está en el paquete. Y una revisión pensada para encontrar malware ejecuta el malware que le enviaron a encontrar. FakeGit añade uno más: un motor de recomendación que trata el README de un atacante como verdad. Cada uno de ellos pone un filtro donde lo malo se describe y espera atraparlo antes de que lo malo se ejecute. La descripción es del atacante. La ejecución es el único lugar donde se decide el resultado.

Dónde traza Bromure la línea

Bromure Agentic Coding no intenta adivinar mejor que los resultados de búsqueda del agente. Cambia lo que ocurre en el único momento que importa — cuando lo recomendado se ejecuta. Cada agente que Bromure corre — Claude Code, Codex, Grok Build — corre dentro de una VM Linux desechable en tu Mac, no en el propio macOS. Así que cuando el agente clona el repositorio FakeGit y ejecuta el ZIP como Island vio hacer a Claude Code, tres cosas ya son ciertas.

Primero, la carga útil queda inerte. SmartLoader es un programa de Windows: un lanzador .bat, un runtime luau.exe, una inyección por cryptor de PE, tareas programadas bajo %LOCALAPPDATA%. El agente de Bromure corre en Linux. El lanzador .cmd no tiene intérprete, el luau.exe y el PE de StealC inyectado no se ejecutarán, y no hay %LOCALAPPDATA% ni Programador de Tareas de Windows al que la persistencia pueda engancharse. Un ataque compilado para un sistema operativo corre en el otro y no encuentra nada que sepa hacer.

Segundo, no hay credenciales reales que tomar. Supón que el atacante hubiera enviado una versión para Linux. El propósito entero de StealC es raspar los almacenes del navegador, las sesiones en vivo y las credenciales guardadas — y dentro de la VM no hay navegador con sesión iniciada, ni tarro de cookies, ni sesión que levantar. Los secretos que puede encontrar en el disco y en el entorno son señuelos: Bromure inyecta valores de relleno (brm_…, un ~/.kube/config sintético, tokens ssh y de nube desechables) en la VM y solo devuelve los reales en el host, en el proxy, de camino hacia la API real. Las claves genuinas nunca entran en la caja. Lo que sea que llegue al C2 resuelto por Polygon es un saco de cadenas que no autentica nada.

Tercero, la salida es visible y la caja es desechable. La resolución del C2, la descarga de la etapa cifrada desde GitHub, la baliza de exfiltración — todo eso aparece en el registro de seguridad de Bromure como tráfico saliente que puedes ver. Y como el home de la VM es desechable, la tarea programada y cualquier binario soltado desaparecen la próxima vez que restableces el perfil a su base. No hay host persistente en el que SmartLoader pueda mantener un punto de apoyo.

VM Linux desechableFakeGit clonadoel agente ejecutael ZIP aquíSmartLoader.bat + luau.exe = PEno corre en LinuxLo que StealC robaríasin navegador · sin sesionesANTHROPIC_API_KEY = brm_9f2a… (falsa)git / AWS / ssh = señuelosexfil (registrada)El C2 recibe señuelosno autentican nadaSecretos realesquedan en el proxy del hostinyectados en el cableEl agente aún lo recomienda y lo ejecuta. Solo que lejos de ti, con claves falsas.
Mismo repositorio, misma recomendación, mismo clon — máquina distinta. Dentro de Bromure el agente corre en una VM Linux desechable: el loader de Windows no puede ejecutarse, no hay sesión en vivo ni clave real que raspar, las credenciales en el disco son señuelos que se cambian por las reales solo en el proxy del host, y la baliza del C2 queda registrada. La recomendación sigue ocurriendo. El robo no tiene nada que llevarse.

Hay una cuarta capa, porque este ataque es un ataque de lectura antes de ser un ataque de ejecución. El README de FakeGit es exactamente el tipo de autoridad no confiable que Bromure vigila — la misma clase que un CLAUDE.md intruso, un AGENTS.md o un SKILL.md. La detección de inyección de prompt en el dispositivo de Bromure puntúa el contenido que el agente ingiere como documentación contra modelos locales que nunca salen del Mac, más un escáner determinista para trucos de Unicode invisible. Un README que le dice al agente «descarga este ZIP, ejecútalo, ignora la advertencia» es exactamente el caso que ese detector existe para marcar. No es un muro por sí solo — pero en Bromure se asienta encima del aislamiento, de modo que un fallo aún lo atrapa una caja sin nada real dentro.

En torno a qué traza esto una línea

El aislamiento es contención, no un filtro de recomendación. Vale la pena ser preciso sobre lo que Bromure cambia y lo que no cambia aquí.

El agente aún puede recomendar el repositorio

Bromure no verifica GitHub, ni los registros MCP, ni los resultados de búsqueda de un agente, y no impide que el agente saque a la luz un repositorio FakeGit o te entregue sus pasos de instalación. Su análisis de cadena de suministro cubre registros de paquetes — npm, PyPI, Cargo y el resto — no el README de un repositorio gemelo. Lo que cambia es dónde corre lo recomendado y qué puede alcanzar cuando lo hace.

Una carga de Windows la frena la frontera del SO, no una regla

SmartLoader falla porque el agente corre en Linux, no porque Bromure lo identificara. Un ladrón nativo de Linux se ejecutaría — y aun así saldría con las manos vacías, porque no hay navegador con sesión iniciada ni sesión en vivo en la VM, las credenciales son señuelos, y el home es desechable.

La sustitución cubre los secretos que configuras

El cambio por señuelo protege las credenciales que pones en un perfil: claves de modelo, tokens de git y de nube, endpoints de bases de datos gestionadas, claves ssh. Una sesión que estableces a mano dentro de la caja, o un secreto que un script escribe en un archivo a mitad de la ejecución, es solo dato. Guarda los secretos en el broker, no en el espacio de trabajo.

La detección es una red, no un muro

La puntuación de inyección en el dispositivo marca un README de instala-y-ejecuta más veces que no, pero un autor decidido puede formular un cebo para colarse por un solo escáner. Trata el detector como una capa; es la contención — una caja desechable con claves falsas y una salida registrada — la que aguanta cuando un detector falla.

La frase de cierre de Island es la que conviene meditar: «Las capacidades de IA se han convertido en una ruta por la que el software entra en la empresa, y FakeGit no será la última campaña en usarla». Tu agente va a buscar skills y servidores, y parte de lo que encuentre estará vestido para ser encontrado. La pregunta no es si alguna vez recomendará el repositorio equivocado — a 7.600 repositorios y 14 millones de descargas, a veces lo hará. La pregunta es qué corre cuando lo hace: tu máquina, tus sesiones de navegador y tus claves reales, o una caja Linux que puedes tirar con un puñado de señuelos dentro. Bromure hace que sea la segunda.