LangGraph 检查点:从 SQL 注入到自托管智能体的远程代码执行
Check Point Research 将 LangGraph 检查点中的 SQL 注入与不安全的 msgpack 反序列化串联,最终实现远程代码执行。已于 2026 年 6 月 11 日披露,三个 CVE 均已修复。
这是什么?
2026 年 6 月 11 日,Check Point Research(Yarden Porat)发布了对 LangGraph 的分析。LangGraph 是 LangChain 为有状态、多智能体工作流提供的开源框架,PyPI 月下载量约 4650 万次。这并非提示注入技巧,而是一条潜伏在智能体框架中的经典 Web 漏洞链:持久化层中的 SQL 注入,串联不安全的反序列化,最终在主机上实现远程代码执行(RCE)。
共分配了三个 CVE,目前均已修复:
- CVE-2025-67644 — SQLite 检查点中的 SQL 注入。
- CVE-2026-28277 — 检查点加载器中不安全的 msgpack 反序列化。
- CVE-2026-27022 — Redis 检查点中的同类注入。
托管平台 LangSmith Deployment(基于 PostgreSQL)不受影响。该风险专门针对使用 SQLite 或 Redis 检查点自托管 LangGraph 的团队。
工作原理
*检查点(checkpointer)*是 LangGraph 的记忆:它在每一步保存智能体的执行状态,以便日后恢复。易受攻击的入口是 get_state_history() API,它在内部调用检查点的 list() 方法,并接受一个用于查询检查点元数据的 filter 字典。
漏洞在于该过滤器被转换为 SQL 的方式。元数据谓词构造器将攻击者可控的字典键直接插入 json_extract(...) 表达式,而不是将其作为参数绑定:
# 概念性示意 —— 键被字符串插值,而非参数化
f"json_extract(CAST(metadata AS TEXT), '$.{query_key}') {operator}"
如果应用程序将用户输入传入该 filter,攻击者便可控制该键,逃逸出 JSON 路径字符串并注入 SQL。由此,攻击链分为两个阶段:
阶段一 —— SQL 注入(CVE-2025-67644 / CVE-2026-27022)
在 WHERE 子句中注入 UNION SELECT,使查询返回一行由攻击者构造的
检查点记录,其 `checkpoint` BLOB 和 `type` 被设置为加载器将会
反序列化的值。[payload 已编辑删除]
阶段二 —— 不安全的反序列化(CVE-2026-28277)
list() 将每一返回行交给 serde.loads_typed()。对于 "msgpack"
类型,LangGraph 的 ext_hook 会重建任意对象:
importlib.import_module(mod), getattr(name)(arg)
精心构造的扩展可解析为 (os, system, <命令>) → RCE。
使该漏洞比教科书式 SQL 注入更严重的,是第二阶段。msgpack 扩展处理器原本用于重建自定义 Python 对象,因此攻击者可控的字节会变成 os.system(<命令>)。这两个缺陷单独看都不新鲜——UNION SELECT 和不安全反序列化已存在数十年。新颖之处在于它们位于持有生产凭据的自主智能体的执行路径上。本文不复现任何 payload;权威说明请参阅 Check Point 的文章,且漏洞已修复。
为何重要
被攻陷的 LangGraph 服务器不像提示注入那样仅局限于单个会话。据 Check Point 称,在该主机上实现完整代码执行会让攻击者获得:智能体的 LLM API 密钥(可直接计费)、其全部对话历史、所有连接的 CRM/工单/计费数据与 PII,以及凭借智能体所继承权限横向移动进入内部系统的跳板。
更深层的教训是 LLM Hacking 反复强调的一点:智能体框架继承了所有经典漏洞类别,并将其放大。 在 CRUD 应用中仅属中危数据访问缺陷的 SQL 注入,一旦同一代码路径还会反序列化数据并运行在特权自动化之中,便升级为严重漏洞。此外,自托管 LangGraph 不自带身份验证:暴露的实例会进一步扩大影响范围。
防御措施
漏洞已修复——升级是第一步,也是最重要的一步。
- 立即打补丁。 升级到
langgraph-checkpoint-sqlite 3.0.1+(CVE-2025-67644)、langgraph 1.0.10+/langgraph-checkpoint 4.0.1+(CVE-2026-28277)以及langgraph-checkpoint-redis 1.0.2+(CVE-2026-27022)。低于上述版本的应作为当务之急处理。 - 切勿将用户输入传入
get_state_history()的过滤器。 审计应用中任何使请求数据抵达检查点filter的路径。将值作为参数绑定;通过白名单限制可过滤的键。 - 为 LangGraph 服务器添加身份验证。 自托管 LangGraph 没有自带认证。在其前方部署反向代理或 API 网关,并使其远离不可信网络——将其视为严格的内部服务。
- 将智能体运行时视为特权身份。 它持有 API 密钥、数据库凭据和 SaaS 令牌;被攻陷的智能体主机应享有与被攻陷特权账户同等的响应级别。
- 最小权限与短时效凭据。 精简智能体持有的每一项凭据,优先采用凭据代理而非长期静态密钥,并将持久化层(SQLite/Redis)与网络其余部分隔离。
- 针对整条链而非单个组件进行红队演练。 严重性来自串联,而单点扫描器只能发现孤立缺陷、漏掉组合。请以对手视角端到端地演练智能体技术栈。
状态
| 项目 | 参考 | 日期 | 备注 |
|---|---|---|---|
| 向 LangChain 披露 | Check Point Research | 2025-11-19 | 报告三个问题 |
| CVE-2025-67644(SQLite SQLi) | langgraph-checkpoint-sqlite 3.0.1 | 2025-12-10 | 补丁切断 RCE 链 |
| CVE-2026-27022(Redis SQLi) | langgraph-checkpoint-redis 1.0.2 | 2026-02-20 | 同类注入 |
| CVE-2026-28277(msgpack 反序列化) | langgraph-checkpoint 4.0.1 / langgraph 1.0.10 | 2026-03-05 | 反序列化 → RCE |
| 公开披露 | Check Point Research / Check Point Blog | 2026-06-11 | 协同披露完成 |
| 托管 LangSmith Deployment | LangChain | — | PostgreSQL 后端,不受影响 |
恰当的定性不是「LangGraph 不安全」,而是有状态的智能体框架存在一大片尚未充分测试的基础设施攻击面,而持久化层——智能体的记忆——正是其中一部分。请升级、添加认证,并停止将「来自框架内部」的数据当作可信数据。