El stealer se llevó los sustitutos
El 15 de octubre, Symantec informó de que Aoki, un infostealer visto por primera vez este año, ahora va tras las credenciales de los agentes de código: .claude.json, el config.toml y los archivos .env de Codex, tokens de GitHub Copilot, Cursor, Gemini, JetBrains AI Assistant y Kiro, y claves de AWS. En Bromure Agentic Coding, cada uno de esos archivos contiene un sustituto, los inicios de sesión y las claves siguen cifrados en el Mac, y un sustituto enviado al servidor de un stealer pausa la máquina.
La lista del stealer ahora empieza por tu agente de código. Quiere el .claude.json, la configuración de Codex y los archivos .env de al lado.
Un infostealer solía ir a por las cookies del navegador, las contraseñas guardadas, los monederos de criptomonedas y los tokens de Discord. Aoki sigue llevándose todo eso. Sus versiones recientes buscan además los archivos que tu agente de código guarda en tu carpeta personal.
El Threat Hunter Team de Symantec describió el cambio el miércoles 15 de octubre, en Aoki: Infostealer Targets AI Coding Assistant Credentials. Infosecurity Magazine lo publicó ese mismo día. Aoki, también llamado Aokigahara por una cadena de su rutina de descifrado, apareció a principios de este año. Symantec escribe que “las versiones anteriores del malware no apuntaban a archivos relacionados con la IA”. La muestra más reciente, sí.
Lo que se lleva Aoki
Symantec enumera los archivos de agente de la muestra más reciente:
.claude.jsony las cookies de Claude desktop.- Las cookies de ChatGPT.
- El
config.tomly los archivos.envde Codex. - La base de datos de estado local de Cursor, que “puede almacenar en caché el contexto de los chats y fragmentos de código”.
- Tokens de GitHub Copilot, Cursor, Google Gemini, JetBrains AI Assistant y Kiro.
- Credenciales de AWS.
El resto de la lista es el botín habitual de un infostealer: más de cuarenta
navegadores, unas noventa extensiones de monedero, monederos de escritorio,
gestores de contraseñas, Telegram, Discord y clientes FTP y VPN. Aoki
también busca cualquier archivo cuyo nombre contenga secret, privatekey,
keystore, mnemonic, passphrase o backup. Symantec señala que “el
malware no tiene una lista de comandos de puerta trasera”. Recoge lo que
encuentra y lo envía por POST a un endpoint /gate de su servidor de mando
y control.
Symantec explica por qué los archivos de agente merecen la pena: “Como los datos de tarjetas, una clave de IA robada puede convertirse directamente en dinero.” El comprador consume uso a costa de tu cuenta, la práctica conocida como LLMjacking. Esos mismos tokens “pueden permitir a los atacantes actuar bajo la identidad de un usuario legítimo” y llegan a los repositorios, las cuentas en la nube y los pipelines de CI/CD conectados a la cuenta.
Symantec no dice cómo llega Aoki a una máquina. En el portátil de un
desarrollador con un agente de código, la vía de entrada obvia es un
paquete. El agente instala decenas cada día por su cuenta, y una dependencia
maliciosa con un script postinstall se ejecuta con los permisos del agente
en cuanto termina npm install.
La misma lista en una máquina Bromure
En Bromure Agentic Coding, el agente se ejecuta en una VM Linux en tu Mac. Las credenciales reales nunca entran en esa VM. El Mac las guarda en una bóveda cifrada y escribe sustitutos en la VM, con la misma forma que los reales para que todas las herramientas los acepten. Un proxy en el Mac cambia cada sustituto por el valor real en la red, y solo en las peticiones al host al que pertenece la credencial.
Mete un stealer con la lista de Aoki en esa VM y recorre con él su lista, punto por punto.
.claude.json y la clave de Claude
Claude Code en la VM funciona con sk-ant-api03-brm-…, una clave
sustituta. Si iniciaste sesión con una suscripción de Claude, los tokens
OAuth se capturaron en el Mac durante el inicio de sesión y se guardaron,
cifrados, en claude-subscription.enc. El host renueva el token de acceso
unos cinco minutos antes de que caduque y lo inyecta en las peticiones
dirigidas a Anthropic. La VM nunca tiene un refresh token, así que ni
.claude.json ni ningún otro archivo de la carpeta personal contiene una
credencial de Claude válida que el stealer pueda llevarse.
config.toml, auth.json y .env de Codex
Codex recibe un ~/.codex/auth.json precargado con un JWT falso cuya
caducidad queda muy lejos, para que el cliente no intente renovarlo. El
inicio de sesión real de ChatGPT está en el Mac, en
codex-subscription.enc. Una clave de API de OpenAI aparece en la VM como
sk-brm-….
Un .env de proyecto importado con Import env file… en el panel
Credentials de la máquina vuelve con los mismos nombres de variables, y
cada valor es un sustituto brm_… limitado a los hosts que elijas. Tu
código lee STRIPE_KEY como siempre, y el stealer lee brm_….
GitHub, AWS y SSH
~/.git-credentials y GH_TOKEN contienen un sustituto ghp_ de
40 caracteres, como el real. No existe ~/.aws/credentials.
~/.aws/config apunta a un helper credential_process que entrega al SDK de
AWS el ID real de la clave de acceso con una clave secreta falsa de
40 caracteres, y el Mac vuelve a firmar cada petición de camino a AWS. Un
stealer que copie la salida del helper obtiene una clave secreta que solo
produce InvalidSignatureException.
La búsqueda por palabra clave de privatekey o id_ed25519 no encuentra
nada. SSH_AUTH_SOCK en la VM es un puente hacia un agente de firma en el
Mac, y los bytes de la clave privada nunca lo cruzan.
Cookies
Aoki quiere las cookies de Claude desktop y de ChatGPT. La VM de la máquina no tiene aplicación de escritorio ni perfil de navegador que leer. Cuando inicias sesión en Claude o ChatGPT para Bromure, la página de inicio de sesión se abre en el navegador de tu Mac y los tokens van a la bóveda. El agente navega con un Chromium que se ejecuta en su propia VM auxiliar desechable, separada de la VM de la máquina, así que un stealer en la VM del agente no puede llegar al perfil del navegador.
La subida a /gate
Aoki termina enviando su botín por POST a /gate. Symantec cita
dobeqnesmot[.]cc, hjazfioe[.]surf y neihite[.]cc. En una máquina
Bromure, esa petición tiene que salir por el proxy del Mac, porque el proxy
es la única ruta de la VM hacia la red.
El proxy examina cada petición saliente, cabeceras y cuerpo, en busca de
sustitutos que vayan a cualquier sitio que no sea el host para el que se
emitieron. Un valor sk-ant-api03-brm-… tiene una sola familia de destinos
legítima, Anthropic. Un sustituto ghp_ pertenece a GitHub. Dentro de un
POST a un dominio .cc, solo pueden significar exfiltración. El proxy
responde HTTP 451 y no reenvía nada. La VM se pausa en el acto, y el Mac
muestra This environment may have been compromised, con una línea por
cada sustituto filtrado: una vista previa del token, el nombre de la
credencial, el host al que pertenece y el host al que lo intentó enviar el
stealer.
Tú decides qué pasa después. Save for Investigation exporta el disco de la VM, su carpeta personal y las carpetas compartidas a una carpeta que elijas, y luego apaga la máquina. Shut down la detiene y la marca como comprometida. Una máquina comprometida solo vuelve a arrancar después de Wipe and Launch, que sustituye el disco y la carpeta personal y conserva tus tokens, claves SSH y ajustes. Tu inicio de sesión de Claude, tu token de GitHub y tus claves de AWS nunca estuvieron en la VM, así que el stealer no copió nada que haya que rotar.
También puedes frenar la subida antes del escaneo. En el panel
Guardrails de la máquina, pon Unmatched traffic en Deny dentro
de Outbound connections y enumera los hosts que necesita la máquina. Una
conexión a un dominio .cc desconocido se rechaza entonces, y la Security
Timeline muestra una fila roja Firewall para ella.
Si el stealer empaqueta su botín de forma que el escaneo no pueda leer los sustitutos, el servidor del otro lado recibe igualmente valores que no se autentican en ningún sitio. Un sustituto solo funciona cuando pasa por el proxy de tu Mac de camino al host para el que se emitió.
Antes de que se ejecute el stealer
La vía de entrada más probable a la VM de un agente es un paquete que instaló el agente. El panel Supply Chain de la máquina revisa cada descarga en el Mac antes de que la VM la vea:
- La barrera de antigüedad, activada por defecto con un mínimo de dos
días, oculta las versiones de paquetes más recientes que el límite. Una
versión secuestrada que se retira en cuestión de horas nunca llega a
npm install. - La eliminación de scripts de instalación, si la activas, quita los
hooks
preinstall,install,postinstallypreparede cada tarball de npm en tránsito, la forma habitual en que el malware de npm se ejecuta al instalarse. - OSV, socket.dev o Depi bloquean versiones con avisos de seguridad conocidos y paquetes marcados como malware o typosquats, con un 451 cuyo motivo el gestor de paquetes muestra tal cual.
Cada descarga aparece en la Security Timeline, así que tras un incidente puedes encontrar el paquete que trajo el stealer.
Si el stealer se ejecuta en el Mac
La lista de archivos de Aoki también indica lo que un stealer encuentra en
el propio Mac, y una instalación de Bromure no le añade nada. Bromure no
importa los inicios de sesión de las CLI de Claude o Codex de tu Mac ni los
necesita: los agentes se ejecutan en la VM, y sus inicios de sesión viven en
la bóveda. Todo lo que hay bajo ~/Library/Application Support/BromureAC/
y contiene un secreto es texto cifrado AES-GCM. La clave maestra está en el
Data Protection Keychain, limitada a la identidad de firma de Bromure, y
nunca se sincroniza. Un stealer que copie la carpeta se lleva blobs
cifrados.
Symantec destaca la base de datos local de Cursor porque guarda en caché el contexto de los chats y el código. El registro de Bromure de lo que hizo el agente, la traza de sesión, está cifrado en reposo con la misma clave de la bóveda, y guarda los intercambios de tokens solo como vistas previas del primer y el último carácter. Ningún secreto real aparece en una traza, cifrada o no.
Cada archivo de la lista contiene un sustituto
.claude.json, el auth.json y el config.toml de Codex, los valores .env importados, las credenciales de git y la configuración de AWS llevan sustitutos. Los refresh tokens y las claves privadas SSH nunca entran en la VM.
La subida detiene la máquina
El proxy detecta sustitutos dirigidos a un host para el que no se emitieron, responde 451, pausa la VM y nombra cada credencial filtrada.
Nada que rotar
Wipe and Launch sustituye el disco y la carpeta personal y conserva tus claves. El stealer se llevó valores que solo funcionan a través del proxy de tu Mac.
La puerta está vigilada
La barrera de antigüedad, la eliminación de scripts de instalación y las comprobaciones de reputación se ejecutan en el Mac antes de que un paquete llegue a la VM, y cada descarga queda registrada.
La lista crecerá
Symantec dice que las capacidades de Aoki “todavía parecen estar en desarrollo activo”, y otros stealers copiarán su lista. Aoki añadió los archivos de agente porque las claves y los inicios de sesión de agentes robados se venden. Ejecuta tus agentes en una máquina Bromure y el comprador recibe un lote de sustitutos que ningún servidor fuera del proxy de tu Mac aceptará.
Para la versión cotidiana del mismo problema, en la que el propio agente copia un secreto en su transcripción, lee La transcripción se quedó con el token. Para un gusano que fue a por los mismos archivos desde un paquete npm comprometido, lee Revocar el token era el detonante.