PyTorch模型是可执行文件:我为何构建扫描器来阻止“Pickle炸弹”

发布: (2025年12月16日 GMT+8 23:58)
4 min read
原文: Dev.to

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.systemsubprocessevalsocket

立即检查你的模型

从 PyPI 安装 CLI:

pip install aisbom-cli

然后指向你的模型文件夹:

aisbom scan ./my-models

你将得到如下风险评估:

文件名框架风险等级
bert_finetune.ptPyTorchCRITICAL(检测到 RCE:posix.system
safe_model.stSafeTensorsLOW(二进制安全)

未来是 SafeTensors(但我们尚未到达)

业界正向 .safetensors 迁移,这是一种安全、基于 JSON 头的格式。但仍有数百万旧的 .pt 文件存在,开发者仍在下载它们。在大家迁移之前,我们需要防护措施。

我开源了这个工具,因为我相信 AI 供应链安全不应是黑盒。

  • GitHub:
  • Live Demo:
Back to Blog

相关文章

阅读更多 »