PyTorch 模型安全危机:Pickle 炸弹的供应链威胁
在 AI 模型供应链日益复杂的今天,PyTorch 作为最流行的机器学习框架之一,却隐藏着一个致命的安全漏洞:pickle 序列化格式。PyTorch 默认使用 Python 的 pickle 格式保存和加载模型,这种设计虽然灵活,却允许在反序列化过程中执行任意 Python 代码。这意味着,加载一个看似无害的.pt或.pkl文件,实际上可能是在执行攻击者精心构造的恶意代码。
根据 JFrog 安全研究团队在 2025 年 12 月 2 日披露的报告,这种威胁已经演变为系统性的供应链风险。攻击者可以通过 Hugging Face 等模型共享平台分发恶意模型,当开发者下载并加载这些模型时,攻击代码就会在目标系统上执行,可能导致数据泄露、后门安装甚至完全的系统控制。
PickleScan 漏洞暴露的检测引擎缺陷
作为行业标准的 pickle 扫描工具,PickleScan 被 Hugging Face 等平台广泛采用,负责检测模型中的恶意内容。然而,JFrog 发现的三个零日漏洞(CVSS 评分均为 9.3)揭示了当前检测方法的根本缺陷:
-
CVE-2025-10155 - 文件扩展名绕过:攻击者只需将恶意 pickle 文件重命名为
.bin或.pt等 PyTorch 相关扩展名,PickleScan 就会错误地将其交给 PyTorch 专用解析逻辑处理,导致扫描失败而 PyTorch 仍能正常加载执行。 -
CVE-2025-10156 - ZIP CRC 错误处理差异:PickleScan 使用 Python 的 zipfile 模块处理 ZIP 归档,遇到 CRC 校验错误时会抛出异常终止扫描。而 PyTorch 在构建时默认禁用 CRC 检查(
-DMINIZ_DISABLE_ZIP_READER_CRC32_CHECKS),使得包含 CRC 错误的恶意归档能够绕过检测。 -
CVE-2025-10157 - 危险导入黑名单绕过:PickleScan 通过黑名单匹配危险模块,但攻击者可以使用危险模块的子类来绕过检测。例如,使用
asyncio.unix_events._UnixSubprocessTransport而非直接的os.system调用,PickleScan 只会标记为 "Suspicious" 而非 "Dangerous"。
这些漏洞的核心问题在于检测工具与实际加载器之间的处理差异。当扫描逻辑与 PyTorch 的加载逻辑不一致时,就为攻击者创造了可乘之机。
aisbom 的 Pickle 炸弹检测引擎架构设计
基于对现有工具缺陷的分析,我们设计了一个更健壮的 pickle 炸弹检测引擎,作为 aisbom(AI Software Bill of Materials)工具的核心组件。该引擎采用多层防御架构,确保检测的准确性和可靠性。
1. 统一文件类型识别层
首先解决文件扩展名绕过问题。检测引擎必须基于文件内容而非扩展名进行类型识别:
def identify_file_type(file_path):
"""基于魔数(magic number)和文件结构识别文件类型"""
with open(file_path, 'rb') as f:
header = f.read(1024)
# 检查ZIP归档签名
if header.startswith(b'PK\x03\x04'):
return 'zip_archive'
# 检查pickle协议版本
if header.startswith(b'\x80'):
return 'pickle'
# 检查safetensors格式
if b'safetensors' in header[:100]:
return 'safetensors'
return 'unknown'
关键参数:
- 魔数检测缓冲区大小:1024 字节(覆盖常见格式签名)
- 支持格式:ZIP 归档、pickle 协议、safetensors
- 优先级:内容分析 > 扩展名匹配
2. 容错 ZIP 解析器
针对 CRC 校验差异问题,实现与 PyTorch 行为一致的 ZIP 解析器:
class PyTorchCompatibleZipParser:
def __init__(self, file_path, ignore_crc_errors=True):
self.file_path = file_path
self.ignore_crc_errors = ignore_crc_errors
def extract_metadata(self):
"""提取ZIP归档中的模型元数据,不加载权重"""
metadata = {}
# 使用与PyTorch相同的miniz库配置
# 当ignore_crc_errors=True时,跳过CRC验证
with zipfile.ZipFile(self.file_path, 'r') as zip_ref:
for name in zip_ref.namelist():
if name.endswith('.pkl') or name.endswith('.pickle'):
# 仅提取pickle文件进行静态分析
with zip_ref.open(name) as f:
metadata[name] = self.analyze_pickle(f.read())
return metadata
监控要点:
- CRC 错误处理模式:必须与 PyTorch 配置一致
- 内存使用限制:仅提取元数据,不加载完整权重
- 异常处理:记录但继续处理非关键错误
3. 深度字节码静态分析引擎
核心的恶意代码检测采用静态分析 pickle 字节码的方法:
class PickleBytecodeAnalyzer:
# 扩展的危险操作检测规则
DANGEROUS_PATTERNS = {
# 直接危险导入
'os.system', 'posix.system', 'subprocess.call',
'builtins.eval', 'builtins.exec',
# 间接危险模式(子类、内部类)
'asyncio.*._*', # asyncio内部类
'subprocess.*._*', # subprocess内部实现
'os.*._*', # os模块内部实现
# 网络相关危险操作
'socket.socket', 'urllib.request.urlopen',
}
def analyze(self, pickle_data):
"""深度分析pickle字节码"""
findings = {
'dangerous_imports': [],
'suspicious_patterns': [],
'risk_level': 'low'
}
# 反汇编pickle字节码
opcodes = self.disassemble(pickle_data)
# 多模式匹配
for opcode in opcodes:
if self.is_direct_dangerous(opcode):
findings['dangerous_imports'].append(opcode)
findings['risk_level'] = 'critical'
elif self.is_indirect_dangerous(opcode):
findings['suspicious_patterns'].append(opcode)
if findings['risk_level'] != 'critical':
findings['risk_level'] = 'high'
return findings
def is_indirect_dangerous(self, opcode):
"""检测间接危险模式(子类、内部实现)"""
import_pattern = opcode.get('import_path', '')
# 使用正则表达式匹配危险模式
import re
for pattern in self.DANGEROUS_PATTERNS:
if re.match(pattern.replace('*', '.*'), import_pattern):
return True
return False
检测规则配置:
- 直接危险导入:精确匹配黑名单
- 间接危险模式:正则表达式匹配(覆盖子类、内部类)
- 风险等级:critical(直接危险)、high(间接危险)、low(安全)
4. 模型完整性验证层
在检测恶意代码的同时,验证模型的结构完整性:
class ModelIntegrityValidator:
def validate(self, model_path):
"""验证模型文件完整性"""
checks = {
'file_structure': self.check_file_structure(model_path),
'metadata_consistency': self.check_metadata_consistency(model_path),
'weight_format': self.check_weight_format(model_path),
'license_compliance': self.check_license_compliance(model_path),
}
# 计算完整性分数
integrity_score = sum(1 for check in checks.values() if check['passed'])
integrity_score /= len(checks)
return {
'checks': checks,
'integrity_score': integrity_score,
'recommendation': self.generate_recommendation(checks)
}
完整性检查项:
- 文件结构:ZIP 归档完整性、pickle 协议版本
- 元数据一致性:模型配置与权重维度匹配
- 权重格式:数据类型、形状验证
- 许可证合规性:提取并验证许可证信息
可落地的安全参数与监控清单
1. CLI 工具配置参数
aisbom 检测引擎应提供细粒度的配置选项:
# 基本扫描
aisbom scan ./models --format json --output scan_report.json
# 深度分析模式(启用所有检测)
aisbom scan ./models --deep --ignore-crc-errors --check-licenses
# 自定义风险阈值
aisbom scan ./models --risk-threshold high --fail-on-critical
# 生成测试用例
aisbom generate-test-artifacts --malware --restricted-license
关键参数说明:
--deep:启用深度字节码分析和间接危险模式检测--ignore-crc-errors:与 PyTorch 行为保持一致--risk-threshold:设置风险阈值(low/medium/high/critical)--fail-on-critical:发现 critical 风险时立即失败
2. CI/CD 集成配置
在持续集成流水线中集成模型安全检查:
# GitHub Actions配置示例
name: AI Model Security Scan
on: [pull_request]
jobs:
aisbom-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install aisbom
run: pip install aisbom-cli
- name: Scan AI Models
run: |
aisbom scan . \
--deep \
--risk-threshold high \
--fail-on-critical \
--output sbom.json
- name: Upload SBOM
uses: actions/upload-artifact@v3
with:
name: sbom-report
path: sbom.json
- name: Check for Critical Risks
run: |
if grep -q '"risk_level": "critical"' sbom.json; then
echo "Critical security risk detected!"
exit 1
fi
监控指标:
- 扫描覆盖率:模型文件检测比例
- 风险分布:各风险等级的数量统计
- 检测时间:平均扫描时间(应 < 1 秒 / GB)
- 误报率:安全文件被误判的比例
3. 企业级部署架构
对于大规模部署,建议采用分层架构:
企业模型仓库
│
▼
[aisbom代理层] ← 实时扫描上传的模型
│
▼
[风险分析引擎] ← 聚合风险数据,生成合规报告
│
▼
[策略执行器] ← 根据风险等级执行相应策略
│
▼
[监控仪表板] ← 可视化风险态势
部署要点:
- 代理层:轻量级,部署在模型仓库入口
- 分析引擎:集中式,处理复杂分析任务
- 策略执行:自动化,根据风险等级采取不同措施
- 监控告警:实时,关键风险立即通知
4. 应急响应清单
当检测到高风险模型时,应执行以下应急流程:
-
立即隔离
- 将受影响模型移至隔离区
- 撤销相关访问权限
- 通知所有可能受影响的用户
-
深度分析
- 使用沙箱环境加载分析
- 提取完整的攻击载荷
- 分析攻击意图和潜在影响
-
影响评估
- 确定受影响系统范围
- 评估数据泄露风险
- 制定修复和恢复计划
-
修复措施
- 清除恶意模型
- 更新检测规则
- 加强访问控制
-
事后复盘
- 分析攻击路径
- 改进检测能力
- 更新安全策略
未来发展方向
基于当前的设计,aisbom 检测引擎还可以在以下方向继续演进:
-
机器学习增强检测:使用 ML 模型识别未知的攻击模式,减少对规则库的依赖。
-
运行时行为监控:在沙箱环境中动态执行模型,监控实际行为而非仅静态分析。
-
供应链溯源:建立模型来源的可信链,验证模型从训练到部署的完整路径。
-
标准化集成:支持更多安全标准和框架,如 CycloneDX、SPDX 等。
-
自动化修复:对于检测到的风险,提供自动修复建议或转换工具(如 pickle 转 safetensors)。
结论
PyTorch 模型的 pickle 炸弹威胁是 AI 供应链安全的重要挑战。通过分析 PickleScan 等现有工具的漏洞,我们设计了一个更健壮的检测引擎架构,解决了文件类型识别、ZIP 解析差异、危险模式检测等关键问题。
aisbom 的实现不仅提供了技术解决方案,更重要的是建立了一套完整的工程实践:从 CLI 工具配置到 CI/CD 集成,从企业部署架构到应急响应流程。这种系统化的方法确保了安全检测的可靠性和可操作性。
在 AI 模型日益成为关键基础设施的今天,构建可靠的模型安全检测能力不再是可选项,而是必需品。通过本文提供的架构设计和实践指南,组织可以建立有效的防御体系,在享受 AI 技术红利的同时,确保系统的安全可靠。
资料来源:
- aisbom GitHub 仓库:https://github.com/lab700xorg/aisbom
- JFrog 安全研究报告:https://jfrog.com/blog/unveiling-3-zero-day-vulnerabilities-in-picklescan/