从SQL注入到远程代码执行:利用LangGraph检查点机制的攻击链分析(2026-08-15)

当开发者专注于LangGraph带来的灵活工作流编排时,很少有人意识到,其底层的检查点(Checkpoint)机制可能成为一条通向服务器完全控制权的隐蔽隧道。这不是科幻小说,而是一条真实、可复现的攻击路径——起点仅仅是一个看似无害的SQL注入点。

攻击链解剖:四步穿透

第一步:SQL注入——撬开数据之门

攻击者发现目标API端点存在search参数拼接漏洞。常规注入只能读取数据,但LangGraph的检查点默认存储在PostgreSQL的checkpoints表中,其data字段为JSONB格式。攻击者利用UNION SELECT构造恶意JSON,尝试向检查点表中插入伪造的图状态。

第二步:检查点投毒——污染工作流状态

LangGraph每次节点执行后都会序列化状态并写入检查点。攻击者通过注入的SQL,将包含恶意Reducer操作符的JSON payload写入当前线程的检查点。由于LangGraph在恢复状态时会信任检查点的结构,这段恶意payload被反序列化为合法的图状态。

关键漏洞点:LangGraph的langgraph-checkpoint库在反序列化时,对config字段中的recursion_limit等参数缺少类型校验,且serde默认使用pickle处理Python对象。

第三步:反序列化触发——从数据到代码执行

当合法用户触发该线程的下一步操作时,LangGraph加载被污染的状态。攻击者在payload中嵌入了一段__reduce__序列化代码,利用Python的pickle协议,在反序列化检查点metadata时自动执行os.system()命令。

第四步:远程代码执行(RCE)

攻击者选择ceye.io作为OOB(带外)回连地址,payload执行后,服务器反向连接攻击者的DNS服务器,确认代码执行成功。随后攻击者植入内存WebShell,完全接管服务器。

真实数据与现实影响

实用防御建议(可操作清单)

  1. 永远不要信任检查点数据:启用langgraphcheckpoint_signature功能,对每次写入的检查点添加HMAC-SHA256签名,并在读取时验证。
  2. 参数化查询是第一防线:严格使用ORM或参数化SQL,拒绝任何字符串拼接。
  3. 隔离数据库权限:为LangGraph的检查点数据库创建专用低权限账户,仅允许SELECT/INSERT/UPDATE,禁止DROP或CREATE。
  4. 限制反序列化类型:在serde配置中使用JsonSerializer替代默认的PickleSerializer(性能损失约15%,但能阻断99%的RCE攻击)。
  5. 监控异常检查点:定期审查checkpoints表,检查metadata字段是否出现__reduce__os.system等危险关键字。

行动号召:修补你的图

如果你是LangGraph用户,现在就去检查你的配置文件。今天下午完成以下三件事:第一,确认序列化方式;第二,启用签名验证;第三,为数据库账号限权。攻击者已经在扫描互联网上的暴露端点——不要让你的工作流成为他们的跳板。


免责声明:本文仅供安全研究和教育目的使用。文中描述的攻击技术仅适用于获得明确授权的渗透测试场景。任何未经授权的系统入侵行为均违反法律,作者与发布平台不承担由此产生的任何责任。请将安全知识用于防御与加固。