从SQL注入到远程代码执行:利用LangGraph检查点漏洞(2026-07-11)

当AI工作流成为攻击面

2026年6月,一个隐藏在LangGraph检查点(Checkpoint)机制中的高危漏洞被公开。攻击者只需一个精心构造的SQL语句,就能从数据库渗透一路拿到服务器控制权。这不是科幻电影——安全研究员在GitHub上公布的POC,让所有使用LangGraph构建AI Agents的团队后背发凉。

漏洞解剖:SQL注入+反序列化=RCE

检查点机制的两重陷阱

LangGraph允许开发者保存Agent的“中间状态”到数据库,以便断点续跑。然而,默认的PostgreSQL检查点实现存在两个致命弱点:

  1. SQL注入逃逸:检查点ID参数未经严格校验直接拼接SQL,攻击者可注入' OR 1=1 --等语句,无权限读取所有Agent状态数据。
  2. Pickle反序列化漏洞:保存状态时使用Python内置的pickle序列化,攻击者若将恶意payload写入状态字段,当系统恢复检查点时自动触发远程代码执行。

真实案例:某金融科技公司的自动化交易Agent,因检查点ID参数暴露在API路由/restore?id={user_input}中,攻击者利用盲注提取了3000条客户交易记录,并植入后门监听市场数据。

攻击链速览:从1个字符串到root权限

  1. 信息收集:向Agent的“继续执行”接口发送' OR 1=1; --,利用错误信息泄露数据库表结构。
  2. 状态劫持:使用UNION查询将恶意pickle字节码注入到“agent_state”列,内容为反弹shell脚本。
  3. 触发执行:调用restore_checkpoint API加载被篡改的状态,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模式。

你的安全清单

行动号召

立即行动:今天下午花30分钟运行以下命令扫描您的API端点:

# 用sqlmap自动检测检查点接口SQL注入
sqlmap -u "https://your.domain/api/agent/restore?id=1" --batch

如果发现任何可疑返回(如“UNION”正常执行),立即隔离该服务器并回滚数据库快照。

免责声明

本文所述漏洞实例基于已公开的CVE-2026-1507(已修复版本≥v0.2.18)及通用安全研究。文中的攻击链仅供安全防御研究使用。未经授权对他人系统进行渗透测试属于违法行为,作者不承担任何因模仿操作导致的法律责任。安全防护,从守住每一条SQL开始。