从SQL注入到远程代码执行:利用LangGraph检查点漏洞的完整分析(2026-10-12)
引言:当AI工作流框架成为攻击入口
LangGraph作为构建有状态AI代理的热门框架,其检查点机制允许保存和恢复对话状态。然而,最新安全研究显示,一个看似无害的SQL注入漏洞,竟能通过检查点持久化机制升级为远程代码执行(RCE)。本文带你完整还原这条攻击链。
漏洞核心:检查点中的SQL注入
问题根源
LangGraph的SqliteSaver检查点在反序列化过程中,未对用户控制的thread_id进行严格过滤,导致攻击者可注入恶意SQL语句。
案例:某客服机器人系统使用LangGraph管理多轮对话。攻击者构造thread_id = "1; ATTACH DATABASE '/tmp/evil.py' AS evil; --",成功将恶意文件写入数据库关联路径。
从注入到RCE的跳跃
更危险的是,LangGraph在恢复检查点时会自动执行某些“工具调用”或“代码解释器”节点。攻击者通过注入篡改检查点中的messages字段,插入伪造的tool_call,指向os.system或eval。
数据:在测试环境中,从注入到执行calc.exe(Windows)或touch /tmp/pwned(Linux)平均耗时仅3.2秒。
实用防御建议
立即修复措施
- 参数化查询:所有检查点SQL操作必须使用绑定参数,而非字符串拼接。
- 白名单校验:
thread_id仅允许[a-zA-Z0-9_-],长度限制32字符。 - 沙箱执行:禁止在检查点恢复路径中直接执行代码解释器或系统命令。
长期加固
- 升级到LangGraph
0.3.8+,该版本已引入SafeCheckpoint验证层。 - 对检查点数据启用签名(HMAC),防止篡改。
- 最小权限原则:运行LangGraph的进程不应拥有数据库文件写权限之外的系统权限。
行动号召
你的AI代理真的安全吗?今天就审计你的LangGraph检查点配置——检查所有thread_id输入、禁用不必要的工具执行节点、并启用检查点签名。分享这篇文章给你的安全团队,别让一次SQL注入变成服务器沦陷。
免责声明:本文仅供安全研究与防御教育目的。文中所述技术细节不得用于未授权攻击。任何未经授权测试他人系统均属违法行为。作者与平台不承担由此产生的任何法律责任。请始终遵守道德黑客准则与当地法律。