PyTorch 漏洞检测拦截阻碍本地模型加载?一招动态热补丁彻底搞定 transformers 中的 CVE-2025-32434 限制
PyTorch 漏洞检测拦截阻碍本地模型加载?一招动态热补丁彻底搞定 transformers 中的 CVE-2025-32434 限制
1. 背景介绍与痛点
最近很多玩 AI 数字人(如 OpenTalking、LiveTalking、Wav2Lip、MuseTalk 等)或大模型本地私有化部署的开发者,在更新了 Hugging Face 的 transformers 库后,可能会在启动时遇到如下令人崩溃的报错:
failed to prewarm local quicktalk: Due to a serious vulnerability issue in `torch.load`, even with `weights_only=True`, we now require users to upgrade torch to at least v2.6 in order to use the function. This version restriction does not apply when loading files with safetensors.
See the vulnerability report here https://nvd.nist.gov/vuln/detail/CVE-2025-32434
为什么会这样?
由于近期 PyTorch 爆出了高危漏洞 CVE-2025-32434(反序列化任意代码执行),Hugging Face 的 transformers 团队在较新版本的代码库中加入了一项硬性限制:
- 如果您本地安装的 PyTorch 版本低于 2.6,只要尝试使用
transformers加载包含.bin或.pth格式的 PyTorch 权重文件,程序就会强行中断并抛出上述异常。
痛点所在:
对于很多使用嵌入式 Python 绿色版或特定依赖版本的整合包项目,为了兼容现有的 CUDA 工具链和其它 C++ 编译插件,不得不锁定在 torch==2.5.1 或更低版本。
直接升级 PyTorch 到 2.6 可能会:
- 产生巨大的下载流量(CUDA 版 PyTorch 动辄数 GB);
- 导致现有的 CUDA 算子或其它 C 编译包(如
onnx2torch等)直接失效或版本冲突。
既然我们加载的是本地已经审核过的安全模型,不需要拦截,有没有不升级 Torch 就能完美解决的方案?
2. 核心原理:Python 动态热补丁 (Monkeypatch)
既然报错是由 transformers.utils.import_utils.check_torch_load_is_safe() 函数强行抛出的, we 完全可以在 Python 解释器启动的瞬间,通过**猴子补丁(Monkeypatch)**技术,将该校验函数动态替换为一个空函数(No-op)。
难点解析 (避坑指南):
传统的替换方式如下:
import transformers.utils.import_utils as import_utils
import_utils.check_torch_load_is_safe = lambda *args, **kwargs: None
在实际项目中,这通常会失效!因为 Hugging Face 采用了懒加载机制(Lazy Import)。许多模型(如 HubertModel 等)在载入时,内部已经通过 from .utils import check_torch_load_is_safe 完成了本地名绑定,此时只替换 import_utils 下的引用无法覆盖已经载入内存的模块级引用。
终极解决方案:
我们需要遍历 sys.modules,对所有已经载入的、以 transformers 开头且包含了该函数的子模块,进行全量扫描并动态覆写。
3. 具体实现代码
请将以下代码直接粘贴到您项目的入口文件(例如 main.py、app.py 或包的 __init__.py)的最顶部(必须在导入任何 transformers 或 torch 模型之前执行):
# =====================================================================
# 绕过 transformers 低版本 PyTorch CVE-2025-32434 限制的动态热补丁
# 作者:B站UP @云樱梦海 (https://space.bilibili.com/385101157)
# =====================================================================
try:
import sys
# 1. 优先载入并直接修改源头定义
import transformers.utils.import_utils as import_utils
import_utils.check_torch_load_is_safe = lambda *args, **kwargs: None
# 2. 遍历已载入的模块,防止因 lazy import 导致的引用缓存未更新问题
for module_name, module in list(sys.modules.items()):
if module_name.startswith("transformers"):
if hasattr(module, "check_torch_load_is_safe"):
setattr(module, "check_torch_load_is_safe", lambda *args, **kwargs: None)
except Exception as e:
# 保证若环境无 transformers 库时程序不会报错闪退
pass
# =====================================================================
4. 实施效果
引入该热补丁后,再次启动程序:
- 控制台输出:原本会弹出
ValueError的地方,现在直接成功越过限制,输出类似如下的模型加载成功日志:INFO: Loading ckpt: D:\models\hubert\model.pt, status: <All keys matched successfully> INFO: Hubert model initialized successfully! - 速度与兼容性:完全免去了下载数 GB 升级包的麻烦,1秒内直接进入业务逻辑,项目稳定性保持 100%。
5. 总结
在开发私有化本地部署的整合包时,安全策略与便携性之间往往会有冲突。利用 Python 动态反射机制进行热补丁,不仅优雅、快速,而且对用户环境无侵入。
更多推荐


所有评论(0)