pickle文件的持续威胁
在AI/ML生态系统中,pickle文件仍然是一个严重的安全问题。主流机器学习框架广泛使用pickle文件,这不仅增加了模型托管方的远程代码执行风险,还使用户面临间接攻击威胁。当用户从Hugging Face等公共平台下载模型时,他们几乎无法防范下载文件中可能包含的恶意文件。
虽然存在Picklescan、ModelScan和model-unpickler等工具可以扫描模型文件并检查危险导入,其中一些甚至直接集成到Hugging Face平台中,通过在小标签上标记不安全文件来警告用户。但遗憾的是,目前的扫描器仍然容易被绕过。我们通过在Hugging Face的测试仓库上传一个未被检测到的恶意pickle文件证实了这一点。
Fickling过滤ML pickle文件的新方法
现有扫描器都依赖于检查pickle文件中是否存在已知的不安全导入来确定其安全性。这种方法本质上存在局限性,因为要真正有效,需要列出几乎所有现有Python库的所有可能导入,这在实际中是不可能的。
为了克服这一限制,我们的团队实施了一种检测不安全pickle文件的替代方法。Fickling的新扫描器不使用危险导入列表来检查ML pickle文件,而是使用明确的导入白名单,包含pickle文件中可以安全允许的导入。这种方法的核心思想不是直接检测恶意导入,而是只允许一组已知的安全导入并阻止其余导入。
这一方法基于两个关键研究支撑:
首先,我们确认白名单方法足以过滤掉所有危险导入并阻止所有已知的pickle利用技术。通过研究现有的pickle安全论文和独立博客文章,并结合我们团队自身的知识和能力,我们发现当pickle文件仅包含"安全"导入时,无法携带漏洞利用。
其次,我们确认白名单方法可以在实践中用于ML pickle文件。我们下载并分析了Hugging Face上热门公共模型的pickle文件,注意到它们大多使用相同的几个导入。这意味着可以构建一个小的导入白名单,足以覆盖流行公共模型仓库中的大多数文件。
我们使用来自顶级Hugging Face仓库的3,000个pickle文件实现了Fickling的ML白名单,检查它们的导入并包含无害的导入。为了验证实现,我们构建了一个基准测试,在两个pickle文件集上运行Fickling:一个干净集包含来自公共Hugging Face仓库的pickle文件,第二个合成数据集包含通过向第一个集合中的文件注入payload获得的恶意pickle文件。Fickling捕获了100%的恶意文件,并正确分类了99%的安全文件。
如何使用Fickling的新扫描器
在测试和验证Fickling的ML白名单后,我们希望让尽可能多的人能够轻松使用它。为此,我们实现了一个面向用户的自动pickle验证功能,只需一行代码即可启用。
使用Fickling保护非常简单。只需在Python程序的最开始运行以下代码:
|
|
通过将pickle验证功能打包成单行代码,我们希望促进AI/ML开发者和安全团队系统性地采用Fickling。我们的团队也意识到没有一刀切的解决方案,因此也为用户提供了极大的灵活性:
- 如果需要,可以在代码库的不同位置随意启用和禁用保护
- 如果Fickling因为文件包含未经授权的导入而发出警报,但您确信该文件实际上可以安全加载,您可以轻松自定义白名单一次,使该文件将来能够通过您的流水线
请查看Fickling在GitHub上的文档了解更多详情!
尽可能避免使用pickle
我们的努力旨在帮助开发者保护他们的系统和AI/ML流水线,我们渴望获得社区对Fickling的AI/ML安全功能的反馈。如果您目前正在使用基于pickle的模型,那么绝对应该尝试一下——如果您有任何想法,请在Fickling的仓库中提出问题。
但请记住,避免pickle漏洞利用的最佳方法是完全避免使用pickle,并优先选择基于更安全格式(如SafeTensors)的模型。