PickleScan发现允许通过恶意PyTorch模型执行任意代码的零日漏洞
JFrog安全研究团队在PickleScan中发现了三个关键零日漏洞。PickleScan是一种被广泛采用的行业标准工具,用于扫描机器学习模型并检测恶意内容。
这些漏洞将使攻击者能够完全绕过PickleScan的恶意软件检测机制,可能通过分发包含无法检测代码的恶意ML模型,促成大规模的供应链攻击。这些发现凸显了AI安全生态系统依赖单一安全解决方案的根本性弱点。
PyTorch在机器学习领域的流行伴随着巨大的安全负担。该库在Hugging Face等平台上托管着超过20万个公开可用的模型,但它默认依赖Python的“pickle”序列化格式。虽然pickle的灵活性允许重构任何Python对象,但这一特性也带来了一个关键漏洞:pickle文件在反序列化过程中可以嵌入并执行任意Python代码。当用户加载不受信任的PyTorch模型时,他们面临着执行恶意代码的风险,这些代码可能窃取敏感数据、安装后门程序或危害整个系统。这种威胁并非理论上的,在Hugging Face上已经发现了恶意模型,它们用静默的后门程序来攻击毫无戒心的数据科学家。
PickleScan应运而生,成为行业的前沿防御,它通过解析pickle字节码在执行前检测危险操作。该工具在字节码级别分析文件,将结果与危险导入的阻止列表进行交叉引用,并支持多种PyTorch格式。然而,其安全模型基于一个关键假设:PickleScan解释文件的方式必须与PyTorch加载它们的方式完全相同。解析过程中的任何差异都会产生可利用的安全漏洞。
三个关键漏洞
第一个漏洞(CVE-2025-10155,CVSS 9.3)利用了PickleScan的文件类型检测逻辑。通过将恶意pickle文件重命名为PyTorch相关的扩展名(如.bin或.pt),攻击者可以导致PickleScan的PyTorch专用扫描器失败,而PyTorch本身通过分析文件内容(而非扩展名)成功加载该文件。恶意载荷得以在未被检测的情况下执行。
第二个漏洞(CVE-2025-10156,CVSS 9.3)涉及ZIP归档文件中的CRC(循环冗余校验)错误。PickleScan在遇到CRC不匹配时会完全失败,引发异常并中止扫描。然而,PyTorch的模型加载过程通常会绕过这些CRC检查,从而造成危险的不一致:PickleScan将文件标记为未扫描,而PyTorch则加载并成功执行其内容。
第三个漏洞(CVE-2025-10157,CVSS 9.3)揭示了PickleScan的不安全全局变量检查可以通过使用危险导入的子类而非确切模块名来绕过。例如,从黑名单库asyncio中导入内部类可以完全绕过检查,使攻击者能够在PickleScan将该威胁仅归类为“可疑”而非“危险”的同时,注入恶意载荷。
系统性安全影响
这些漏洞暴露了AI安全基础设施中更深层次的问题。生态系统围绕PickleScan存在单点故障,这意味着当该工具失效时,整个安全架构就会崩溃。依赖Hugging Face(该平台集成PickleScan来扫描数百万个上传的模型)的组织面临特定风险。这些漏洞证明了安全工具与目标应用程序之间的差异如何产生可利用的漏洞——这对AI安全专业人员来说是一个重要的教训。
组织应立即更新至PickleScan 0.0.31版本,该版本修复了所有三个漏洞。然而,仅靠这个补丁是不够的。实施分层防御,包括沙盒环境和JFrog Artifactory等安全模型存储库代理,可以提供额外保护。组织应优先迁移到更安全的ML模型格式,如Safetensors,同时实施对安全扫描失败的文件的自动移除。AI安全社区必须认识到,没有任何单一工具能够保证全面的保护,深度防御策略在这个不断演变的威胁格局中仍然至关重要。