严重性: 高危,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
CNA: VulnCheck
发布时间: 2026 年 8 月 27 日
SpeechBrain 在 1.1.1 之前的版本中,于检查点恢复期间解析 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.yaml 的名为 CKPT* 的子目录。每个候选元数据文件在最终检查点选择之前被解析。
不安全的解析发生在 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