从SQL注入到远程代码执行:利用LangGraph检查点漏洞(2026-07-11)
当AI工作流成为攻击面
2026年6月,一个隐藏在LangGraph检查点(Checkpoint)机制中的高危漏洞被公开。攻击者只需一个精心构造的SQL语句,就能从数据库渗透一路拿到服务器控制权。这不是科幻电影——安全研究员在GitHub上公布的POC,让所有使用LangGraph构建AI Agents的团队后背发凉。
漏洞解剖:SQL注入+反序列化=RCE
检查点机制的两重陷阱
LangGraph允许开发者保存Agent的“中间状态”到数据库,以便断点续跑。然而,默认的PostgreSQL检查点实现存在两个致命弱点:
- SQL注入逃逸:检查点ID参数未经严格校验直接拼接SQL,攻击者可注入
' OR 1=1 --等语句,无权限读取所有Agent状态数据。 - Pickle反序列化漏洞:保存状态时使用Python内置的
pickle序列化,攻击者若将恶意payload写入状态字段,当系统恢复检查点时自动触发远程代码执行。
真实案例:某金融科技公司的自动化交易Agent,因检查点ID参数暴露在API路由
/restore?id={user_input}中,攻击者利用盲注提取了3000条客户交易记录,并植入后门监听市场数据。
攻击链速览:从1个字符串到root权限
- 信息收集:向Agent的“继续执行”接口发送
' OR 1=1; --,利用错误信息泄露数据库表结构。 - 状态劫持:使用UNION查询将恶意pickle字节码注入到“agent_state”列,内容为反弹shell脚本。
- 触发执行:调用
restore_checkpointAPI加载被篡改的状态,Python自动反序列化pickle,攻击者获得服务器shell。
防御地图:三个必须锁死的出口
1. 输入过滤:白名单比黑名单可靠
# 错误示范:仅过滤单引号
# 正确做法:使用参数化查询
cursor.execute("SELECT * FROM checkpoints WHERE id = %s", (checkpoint_id,))
2. 序列化选型:JSON是安全底线
禁止使用pickle、cPickle、yaml.Loader。替换为json.dumps() + json.loads(),复杂对象需自定义序列化类。
3. 最小权限原则
数据库账户仅授予SELECT, INSERT, UPDATE基本操作,绝不用superuser。隔离Agent执行环境为无网络容器的sidecar模式。
你的安全清单
- [ ] 检查所有LangGraph接口中用户可控的参数,是否使用了参数化查询
- [ ] 确认检查点存储未使用
pickle、marshal等二进制序列化库 - [ ] 数据库账户权限限制在单表操作内
行动号召
立即行动:今天下午花30分钟运行以下命令扫描您的API端点:
# 用sqlmap自动检测检查点接口SQL注入
sqlmap -u "https://your.domain/api/agent/restore?id=1" --batch
如果发现任何可疑返回(如“UNION”正常执行),立即隔离该服务器并回滚数据库快照。
免责声明
本文所述漏洞实例基于已公开的CVE-2026-1507(已修复版本≥v0.2.18)及通用安全研究。文中的攻击链仅供安全防御研究使用。未经授权对他人系统进行渗透测试属于违法行为,作者不承担任何因模仿操作导致的法律责任。安全防护,从守住每一条SQL开始。