大模型安全:模型加载过程的代码执行
威胁描述
许多大模型文件采用序列化格式存储,加载过程中需进行反序列化操作。若代码实现中使用了不安全的反序列化方法,且攻击者能够控制模型文件内容,则可能触发反序列化漏洞,导致远程代码执行(RCE),严重危害AI系统安全。
以 PyTorch 为例:
- 使用
torch.load()加载模型时,若未采取安全措施,攻击者可构造恶意.pth文件。 - 当受害者加载该文件时,将触发任意代码执行。
- PyTorch 官方文档早已明确警告:
torch.load()仅应加载可信来源的模型文件。 - 新版本(≥2.6.0)已默认启用更安全的加载机制,但开发人员仍可能因疏忽或兼容性考虑误用不安全方式,引入风险。
威胁场景
- 模型上传/转换服务:AI平台支持用户上传模型进行预训练、微调或格式转换(如
.pth→.safetensors)。 - 不可信模型加载:用户从第三方(如 Hugging Face、开源社区)下载未经验证的预训练模型并直接加载。
威胁触发条件
- 攻击者可控制或篡改模型文件内容(如构造恶意序列化载荷);
- 模型加载代码使用了不安全的反序列化函数(如未设置安全参数的
torch.load())。
缓解措施
1. 安全加载模型(首选方案)
- PyTorch 推荐用法:
python
state_dict = torch.load('model.pth', weights_only=True, map_location='cpu') - 重要说明:
- 即使加载自研可信模型,也应使用
weights_only=True,因基于pickle的模型文件存在固有 RCE 风险。 - CVE-2025-32434:PyTorch ≤2.5.1 版本中,
weights_only=True无法防御 TAR 格式模型的绕过攻击(因早期默认使用 TAR 而非 ZIP)。 - 修复建议:升级至 PyTorch ≥2.6.0,此版本在加载 TAR 模型时若启用
weights_only=True将直接报错,阻断攻击。
- 即使加载自研可信模型,也应使用
2. 采用更安全的模型格式
- 在条件允许时,将模型转换为 Safetensors 格式(无代码执行能力,仅存储张量数据)。
3. 验证模型来源可信性
- 仅从官方或可信渠道获取模型;
- 使用 哈希校验(SHA-256) 或 数字签名 确保模型完整性与真实性。
4. 特殊场景下的补充措施
- 若无法使用
weights_only=True且无法转换格式:- 使用 PyTorch 内置安全选项(谨慎使用):
python
model = torch.load( 'model.pth', map_location='cpu', pickle_module=torch.serialization._get_default_restore_pickle_module(), pickle_load_args={'strict': True} ) - 实施 反序列化白名单机制,限制可加载的类或模块。
- 使用 PyTorch 内置安全选项(谨慎使用):
5. 其他纵深防御措施
- 模型文件 漏洞/后门扫描(如 Picklescan);
- 在 沙箱或隔离环境 中加载不可信模型;
- 遵循 最小权限原则,限制模型加载进程的系统权限。
威胁案例
1. Hugging Face Hub 上的 “nullifAI” 恶意模型(2025年2月)
- 攻击者上传两个含隐藏恶意代码的模型,利用 “broken pickle” 技巧绕过 Picklescan 扫描;
- 加载时触发反向 Shell,但属 PoC 性质,未造成实际破坏;
- Hugging Face 随后全面升级 Picklescan 检测能力。
2. NVIDIA TensorRT-LLM Python 执行器漏洞(CVE-2025-23254,2025年4月)
- 框架在进程间通信中使用不安全的
pickle反序列化; - 本地攻击者可构造恶意数据,实现 任意代码执行、信息泄露、数据篡改。
3. Hugging Face 平台模型加载 RCE 漏洞(2024年)
- JFrog 安全团队发现部分模型在加载时执行恶意代码(如反弹 Shell);
- 根源为
torch.load()对.pkl文件的不安全反序列化。
4. Hugging Face 模型格式转换服务 RCE(2024年)
- 转换服务使用
torch.load()处理用户提交的.pth文件; - 攻击者通过提交恶意模型,在转换过程中执行任意代码,实现 供应链攻击。

浙公网安备 33010602011771号