严重性: 高,CVSS 4.0 8.7,CVSS 3.1 8.8(由 CNA 机构 VulnCheck 评定)
向量(v4.0): CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
向量(v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
受影响版本: SpeechBrain < 1.1.1
修复版本: 1.1.1 / 提交 22a6166
CWE: CWE-502(不可信数据的反序列化)
发现并报告者: Sai Teja Erukude
发布日期: 2026年8月27日
1.1.1 之前的 SpeechBrain 在检查点恢复期间解析 CKPT.yaml 检查点元数据时,使用了 PyYAML 的不安全加载器。
能够提供或修改 SpeechBrain 检查点目录的攻击者,可以在 CKPT* 检查点目录中放置一个恶意的 CKPT.yaml 文件。当受害者调用 Checkpointer.recover_if_possible() 时,SpeechBrain 会列出检查点候选,并使用以下方式解析每个候选的元数据文件:
yaml.load(fi, Loader=yaml.Loader)
因为 yaml.Loader 支持诸如 !!python/object/apply 之类的 Python 对象构造标签,攻击者控制的检查点元数据可以在检查点发现过程中执行 Python 代码。
恶意检查点无需被选中或恢复。代码执行发生在 SpeechBrain 枚举检查点候选时。
攻击者可以在运行 SpeechBrain 的 Python 进程上下文中执行任意 Python 代码。
这可能会影响用户从不受信任的检查点目录、模型工件或归档文件中下载、解包、恢复或运行训练/推理的工作流。
根据宿主进程的不同,这可能允许:
受影响的组件是 SpeechBrain 的检查点恢复/列出流程:
Checkpointer.recover_if_possible()
-> list_checkpoints()
-> _construct_checkpoint_objects()
在检查点列表过程中,SpeechBrain 会扫描名为 CKPT* 且包含 CKPT.yaml 的子目录。每个候选元数据文件都会在最终检查点选择之前被解析。
不安全的解析发生在 speechbrain.utils.checkpoints.checkpoints.py 中:
meta = yaml.load(fi, Loader=yaml.Loader)
PoC 会创建两个检查点:
CKPT+poisoned-metadata:一个较旧的恶意检查点,其 CKPT.yaml
包含一个 PyYAML 对象应用载荷。CKPT+benign-newer:一个较新的良性检查点,应当根据
新近程度被选中。良性检查点被选中,但恶意检查点的元数据在候选列表枚举期间 仍然被执行。这表明元数据解析时的代码执行独立于检查点恢复过程。
package_builder.py 创建由攻击者控制的
检查点布局。
run_poc.py 运行验证,调用
Checkpointer.recover_if_possible(),并打印执行证据。
仅在本地测试环境中运行:
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python -B run_poc.py
在易受攻击版本上预期的证据:
speechbrain_version: 1.1.0
installed_package: True
recovery_error: None
benign_checkpoint_selected: True
marker_before_recovery: False
marker_after_recovery: True
marker_contents:
speechbrain_checkpoint_yaml_loader_rce_triggered
success: True
重要证据是 benign_checkpoint_selected: True 和
marker_after_recovery: True 同时出现。这表明恶意的
旧检查点未被选中用于恢复,但其元数据在 SpeechBrain 列出检查点候选时
仍被解析并执行。
该载荷有意设计为无害。它仅写入以下本地标记字符串:
speechbrain_checkpoint_yaml_loader_rce_triggered
它不会生成 shell、连接网络服务、读取机密信息、删除数据,也不会修改 PoC 目录之外的文件。
升级到 SpeechBrain 1.1.1 或更高版本。
持久的代码修复方案是对检查点元数据使用 PyYAML 的安全加载器:
yaml.safe_load(fi)
或:
yaml.load(fi, Loader=yaml.SafeLoader)
检查点元数据只需要 unixtime 和 end-of-epoch 等标量值,因此不应为此解析路径启用 Python 对象构造。
如果无法立即获得补丁或升级:
CKPT.yaml 中的意外标签和字段。由 Sai Teja Erukude 发现并报告。
披露过程通过 VulnCheck 协调。
exploit_walkthrough.md