系统:运行中
← 返回所有攻击
AGENTS CRITICAL NEW

Langroid 的 Neo4j 智能体未经检查执行 LLM 生成的 Cypher——SQL 漏洞的孪生体

Langroid 的图数据库智能体将模型生成的 Cypher 未经验证直接交给 Neo4j。一次提示注入即可清空图数据,若启用 APOC 还能触及主机——正是已在 SQL 智能体中修复、却在 Neo4j 模块中留存的同一缺陷。

2026-07-16 // 6 min affects: langroid<0.65.5, neo4j

这是什么?

Langroid 是一个用于构建多智能体 LLM 应用的开源 Python 框架。它的一个辅助智能体 Neo4jChatAgent 允许用户用自然语言查询图数据库:模型将请求翻译为 Cypher——Neo4j 的查询语言——执行它,然后解释结果。2026 年 7 月 6 日,一份安全公告(GitLab GLADGitHub GHSA-2pq5-3q89-j7cc)披露,该智能体将模型生成的 Cypher 未经验证、无语句类型白名单、也无关闭开关,直接交给 Neo4j 驱动执行。该问题评级为 9.8(严重),归类为注入类缺陷(CWE-74)。

值得报道的关键并非漏洞本身,而是它的来历。它与 Langroid 的 SQLChatAgent 中”提示到 SQL”的问题属于同一缺陷类别、同一威胁模型;后者早在 0.63.0 版本就已修复。那次修复从未延伸到 Neo4j 模块,因此同一个漏洞在一个”兄弟”智能体中又敞开了六周。0.65.5 之前的所有版本均受影响,0.65.5 提供了修复。

工作原理

其机制是一条缺失信任边界的”文本到查询”流水线。用户的提问——或者更糟,智能体通过检索(RAG)读回的内容——决定了模型生成何种 Cypher,而该 Cypher 会被原样执行。

# 易受攻击的模式(0.65.5 之前),已简化:
cypher = llm.generate(user_question)   # 可被攻击者影响的文本
session.run(cypher)                    # 无只读闸门,无语句白名单

由于查询文本可被提示注入影响——无论是直接的(敌意用户与智能体对话)还是间接的(智能体经由 RAG 摄入的被投毒文档、网页或节点)——能够触及提示的攻击者即可控制查询。由此产生两级升级:

  • 数据层。 Cypher 并非只读。注入的指令可迫使模型生成写入或删除语句:攻击者可读取图中每个节点,或将其整体销毁(对所有匹配执行 DETACH DELETE)。此处省略具体载荷——[REDACTED]——但类别很简单:驱动接受的任何变更类语句。
  • 主机层。 Neo4j 附带可选的过程库。当服务器启用了 APOCdbms.security 过程时,Cypher 可触及操作系统与文件系统。此时,一次”提示到 Cypher”的注入便升级为命令与文件访问——一种由服务器配置(而非 Langroid 的额外缺陷)所决定的远程代码执行。

与 SQL 变体的对应关系是精确的。在那里,COPY ... FROM PROGRAM 等方言原语把聊天框变成了数据库主机上的代码执行;在这里,APOC 过程对图存储做了同样的事。查询语言不同,形态一致。

为何重要

“文本到查询”智能体如今已是常见构件——SQL、Cypher、SPARQL、MongoDB 过滤器、Elasticsearch DSL。每个后端都是各自独立的注入面,且每一个都在信任一段由 LLM 在不可信输入影响下写出的字符串。Langroid 案例清晰地展示了防御者应内化的两点。

第一,修复一种查询语言并不能修复其他语言。 SQL 智能体在 6 月得到加固;结构完全相同的 Neo4j 智能体却仍然脆弱,因为那次修复被写成了针对单点的补丁,而非应用于所有生成查询的智能体的策略。如果你的代码库有一个”文本到查询”面,它很可能有好几个。

第二,初始输入未必是恶意用户。 间接路径——一个图节点、一份被检索的文档,或一个携带指令、被智能体随后读回的抓取页面——意味着攻击面包含了智能体摄入的一切内容。这是最难推理、也最容易被忽视的向量。

防御

上游修复与通用模式相互印证:

  1. 升级到 Langroid 0.65.5 或更高版本,以关闭这一具体缺口。随后审计你技术栈中每一个生成查询的智能体是否存在同一缺陷,而不要认为修好一个模块就已高枕无忧。
  2. 将 LLM 生成的查询视为不可信输出。 将智能体的数据库会话默认设为只读,并强制执行语句类型白名单,除非特定用例需要,否则拒绝写入、模式变更与过程调用。
  3. 以最小权限的数据库账户运行。 为智能体分配一个仅限其所需数据的 Neo4j 角色。除非确有必要,否则禁用 APOC 与 dbms.security 过程;若确需,则用 dbms.security.procedures.allowlist 将其限制在最小集合。即便数据层被触及,这也能消除主机层。
  4. 让变更类操作经过人工复核。 破坏性查询应要求显式确认,而非从一次对话轮次中自动触发。
  5. 隔离图存储。 在网络上进行分段,并确保运行 Neo4j 的主机不暴露逃逸查询可滥用的环境凭据或命令面。
  6. 记录生成的查询。 保存模型实际生成的 Cypher,可把一次不透明的事件变为可审计的事件,并尽早暴露注入尝试。

状态

项目参考日期备注
Neo4j 智能体 Cypher 注入GHSA-2pq5-3q89-j7cc / CVE-2026-556152026-07-06CVSS 9.8;影响 langroid < 0.65.5;已在 0.65.5 修复
SQL 智能体提示到 SQL 的 RCE(镜像)CVE-2026-258792026-06-01同类缺陷;已在 0.63.0 修复;修复未覆盖 Neo4j
主机层升级APOC / dbms.security 过程RCE 取决于服务器配置,并非独立缺陷

正确的解读不是”一个图智能体出了 bug”,而是一个已知且已修复的注入缺陷类别,在一个兄弟智能体中未经修复地再次出现——它提醒我们:文本到查询的整改是一项需要处处落实的策略,而非只交付一次的补丁。

Sources