FlawOpen

flawopen.com/AI Security/langroid-neo4j-cypher-injection-cve-2026-55615

● CVE-2026-55615 · CVSS v4 9.2[1] · 严重
安全研究 · FlawOpen

Langroid CVE-2026-55615:提示词到 Cypher 注入

Langroid 未验证就将模型生成的 Cypher 传给 Neo4j。请升级到 0.65.5;数据库权限仍是安全边界。[1], [2], [4]

CVSS 向量CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N[1]
💡 通俗易懂的原理解析 (ELI5)

图书管理员收到普通问题后,把生成的数据库指令直接交给权限很高的职员。即使恶意便条改变了问题,职员仍会执行指令。CVE-2026-55615 允许不可信内容影响 Langroid 发往 Neo4j 的 Cypher。[1]

核心概念与专有名词

Cypher
Neo4j 用于读取和修改图数据的查询语言。其他过程能否调用取决于服务器设置和账户权限。[1]
Neo4jChatAgent
Langroid 智能体将自然语言任务转成 Cypher,并通过读取或创建工具发送到 Neo4j。[1], [3]
Prompt injection
不可信输入会影响模型行为。模型生成的查询必须视为不可信输入。[1]
Least-privilege database role
仅能访问所需数据和操作的数据库身份。即使应用验证查询,这个权限边界仍然重要。[1], [5]
Cypher 查询验证器
Langroid 0.65.5 验证器会检查关键词和模式。文档警告,这些检查本身可能被绕过,因此只能作为纵深防御,不能充当授权边界。访问控制应由 Neo4j 角色权限强制执行。[6], [3]

框架映射

  • 本指南所述弱点的 CWE 参考: CWE-74

攻击执行流程分解

步骤 1

易受攻击的图智能体接收模型查询

Langroid 0.65.4 及更早版本受影响。攻击需要直接或通过检索内容影响提示词,并让模型调用 Neo4jChatAgent 工具。公告列出 CWE-74 和 CVSS 4.0 9.2(严重)。[1], [2]

步骤 2

内容影响智能体发送的 Cypher

易受攻击路径中,cypher_retrieval_tool 将 msg.cypher_query 传给 read_query,cypher_creation_tool 将查询传给 write_query。公告指出它们会到达 session.run(query, parameters) 和 tx.run(query, parameters),中间没有验证。[1], [3]

步骤 3

数据库权限决定直接影响

读取工具可泄露连接账户能访问的数据;创建工具可在账户权限内修改或删除数据。公告还指出 LOAD CSV 可远程获取数据。主机文件或命令访问取决于启用的过程和数据库授权。[1]

步骤 4

0.65.5 在工具边界添加检查

维护者说明 0.65.5 默认关闭 allow_dangerous_operations、限制读取为只读,并在工具处理程序检查部分危险操作。这些检查属于纵深防御,不是授权机制。维护者的修复说明和 Langroid 的 SQL 智能体指南都指出,最小权限数据库角色才是安全边界。[1], [3], [4], [5]

步骤 5

升级并限制数据库侧权限

升级到 Langroid 0.65.5 或更高版本,核对部署镜像版本并保持危险选项关闭。为智能体提供最小权限 Neo4j 角色,禁用不需要的过程并限制主机权限。[4], [5]

源代码对比:漏洞与安全实现

易受攻击代码遵循公告的调用路径;修复示例概括 0.65.5 的行为,并非逐字补丁。修复在工具边界验证、限制读取并控制危险操作。应将查询检查视为纵深防御,而非授权机制。维护者的修复说明和 Langroid 的 SQL 智能体指南都指出,最小权限 Neo4j 角色才是安全边界;同时隔离智能体进程。 Langroid 文档指出,这些关键词和模式检查可能被绕过;访问控制仍应由 Neo4j 权限强制执行。[1], [3], [4], [6]

存在漏洞的实现
# Neo4jChatAgent 的易受攻击路径(Langroid <= 0.65.4)。
def cypher_retrieval_tool(self, msg: CypherRetrievalTool):
    query = msg.cypher_query
    return self.read_query(query)

def read_query(self, query: str):
    with self.driver.session() as session:
        return session.run(query, parameters=None)
加固后的安全修复
# 0.65.5 版本的行为:在 LLM 可访问的工具边界进行验证。
def cypher_retrieval_tool(self, msg: CypherRetrievalTool):
    query = msg.cypher_query
    rejection = validate_cypher_query(
        query, is_write=False,
        allow_dangerous=self.config.allow_dangerous_operations,
    )
    if rejection is not None:
        return rejection
    return self.read_query(query)

工程与系统安全加固清单

参考来源

← AI Security Directory →