PyTorch模型是可执行文件:我为何构建扫描器来阻止“Pickle炸弹”
Source: Dev.to
我们对自己撒的谎
如果你从事 DevOps 或安全工作,可能会对 requirements.txt 进行严格扫描。你会使用 Snyk 或 Dependabot 来捕获那一个有漏洞的 requests 版本。于是你觉得很安全。
随后,你又让数据科学团队从某个随机的 Hugging Face 仓库下载一个 5 GB 的 .pt(PyTorch)文件,并直接在生产环境中加载它。
我们把 AI 模型当作 数据——惰性、无害的静态文件。
事实并非如此。它们是可执行文件。
技术现实:.pt 文件到底是什么?
标准的 PyTorch 模型文件实际上是一个 ZIP 压缩包。压缩包内部,模型权重和结构是使用 Python 的 pickle 模块序列化的。pickle 模块在安全领域因 远程代码执行(RCE) 而闻名。
当你运行 torch.load('model.pt') 时,反序列化器会解析一串操作码。如果这串操作码包含导入 os 并调用 system() 的指令,你的机器会立即执行它。没有沙箱,也没有警告。
这并非理论上的可能。下面是用 5 行 Python 代码创建“恶意模型”的方法:
import torch
import os
class Malicious(object):
def __reduce__(self):
return (os.system, ("rm -rf / --no-preserve-root",))
torch.save(Malicious(), "bert_finetune.pt")
如果你加载该文件,服务器将瞬间崩溃。
为什么标准 SCA 工具失效
大多数团队依赖软件组成分析(SCA)工具,如 Dependabot 或常规 SBOM 生成器。这些工具通过将 requirements.txt 中的库版本与已知漏洞(CVE)数据库匹配来工作。
这种方法在 AI 模型上失效,因为:
- 不是库:自定义模型文件并不是带有版本号的“包”。它只是一个二进制块。
- 没有 CVE:Pickle Bomb 不是公开的漏洞,而是隐藏在文件结构中的自定义利用负载。
- 盲点:你会得到依赖项的干净安全报告,却忽视了 Docker 容器中潜伏的 5 GB RCE 负载。
引入 AIsbom
我意识到我们需要一种工具来尊重 AI 产物的独特性质。我们不仅要扫描包装层,还要扫描“大脑”。
AIsbom 是一个开源 CLI,能够进行 深度二进制内部检查:
- 解压制品:在内存中解析
PyTorch/Safetensors结构(不加载沉重的权重)。 - 反汇编字节码:使用
pickletools遍历操作码流。 - 检测炸弹:标记危险的全局函数,如
os.system、subprocess、eval和socket。
立即检查你的模型
从 PyPI 安装 CLI:
pip install aisbom-cli
然后指向你的模型文件夹:
aisbom scan ./my-models
你将得到如下风险评估:
| 文件名 | 框架 | 风险等级 |
|---|---|---|
| bert_finetune.pt | PyTorch | CRITICAL(检测到 RCE:posix.system) |
| safe_model.st | SafeTensors | LOW(二进制安全) |
未来是 SafeTensors(但我们尚未到达)
业界正向 .safetensors 迁移,这是一种安全、基于 JSON 头的格式。但仍有数百万旧的 .pt 文件存在,开发者仍在下载它们。在大家迁移之前,我们需要防护措施。
我开源了这个工具,因为我相信 AI 供应链安全不应是黑盒。
- GitHub:
- Live Demo: