Fickling新型AI/ML pickle文件扫描器
持续存在的pickle文件危险
Python pickle文件本质不安全,但大多数机器学习模型文件格式仍在使用它们。如果您的代码从外部源加载ML模型,可能会面临安全风险。我们刚刚发布了Fickling(我们的pickle文件扫描器和反编译器)的新改进功能。Fickling可轻松集成到AI/ML环境中,捕获可能危害ML模型或托管基础设施的恶意pickle文件。
通过简单的一行代码,Fickling可以在加载pickle文件时强制执行安全导入的白名单,有效阻止隐藏在AI模型中的恶意负载。这满足了AI/ML开发者在pickle文件使用仍是普遍安全问题的生态系统中对更好供应链安全的需求。
Fickling过滤ML pickle文件的新方法
现有扫描器都依赖检查pickle文件中是否存在已知硬编码的不安全导入来确定其安全性。这种方法本质上是有限的,因为要真正有效,需要列出几乎所有现有Python库的所有可能导入,这在实际中是不可能的。
为了克服这一限制,我们团队实现了检测不安全pickle文件的替代方法。Fickling的新扫描器不使用检查ML pickle文件中危险导入的列表,而是使用包含可在pickle文件中安全允许的导入的显式导入白名单。其理念不是直接检测恶意导入,而是仅允许一组已知的安全导入并阻止其余导入。
这种方法得到两个关键研究的支持:
首先,我们确认白名单方法足以过滤掉所有危险导入并阻止所有已知的pickle利用技术。通过研究现有的pickle安全论文和独立博客文章,并依托我们团队自身的知识和能力,我们发现当pickle文件仅包含"安全"导入时无法携带漏洞利用,这意味着导入的对象必须满足以下所有标准:
- 它们不能执行代码或导致代码执行,无论格式如何
- 它们不能获取或设置对象属性或项
- 它们不能导入其他Python对象或从pickle VM中获取对已加载Python对象的引用
- 它们不能调用后续的反序列化例程
其次,我们确认白名单方法可以实际应用于ML pickle文件。通过下载和分析Hugging Face上顶级公开模型的pickle文件,我们注意到大多数文件在其pickle文件中使用相同的少量导入。这意味着可以构建一个小的导入白名单,足以覆盖流行公共模型存储库中的大多数文件。
我们使用来自顶级Hugging Face存储库的3,000个pickle文件实现了Fickling的ML白名单,检查它们的导入并包含无害的导入。为了验证我们的实现,我们构建了一个基准测试,在两组pickle文件上运行Fickling:一组包含来自公共Hugging Face存储库的pickle文件的干净集,第二组是通过向第一组文件注入负载获得的恶意pickle文件的合成数据集。Fickling捕获了100%的恶意文件,并正确将99%的安全文件分类为安全。
如何使用Fickling的新扫描器
在测试和验证Fickling的ML白名单后,我们希望让尽可能多的人轻松使用它。为此,我们实现了一个面向用户的自动pickle验证功能,只需一行代码即可启用。它挂钩pickle模块以使用Fickling的自定义unpickler,该unpickler在加载pickle文件时动态检查每个导入。自定义unpickler在尝试进行未经白名单授权的导入时会引发异常,允许用户捕获可能不安全的文件并根据需要处理它们。
使用Fickling保护非常简单。只需在Python程序的最开始运行以下代码:
|
|
通过将pickle验证功能打包成一行代码,我们希望促进AI/ML开发者和安全团队系统性地采用Fickling。
记住:尽可能避免使用pickle
我们的努力旨在帮助开发者保护他们的系统和AI/ML流水线,我们渴望获得社区对Fickling的AI/ML安全功能的反馈。如果您当前使用基于pickle的模型,那么绝对应该尝试一下——如果您有任何想法,请在Fickling的repo中提出问题。但请记住,避免pickle漏洞利用的最佳方法是完全避免使用pickle,并优先选择基于更安全格式(如SafeTensors)的模型。