利用机器学习泡菜文件

2021-03-18 22:21:10

许多机器学习(ML)模型是引擎盖下的Python泡菜文件,它有意义。使用酸洗保存记忆,启动启动模型培训,并使培训的型号便携式(以及由此,可共享)。酸洗易于实现,内置于Python,而无需其他依赖项,并支持自定义对象的序列化。对为什么选择康复的人有点疑问是Python程序员和ML从业者之间的流行练习。

预先训练的模型通常被视为ML的“免费”副产品,因为它们允许生产模型的算法和Corpora等算法,以保持私密的算法。这使许多人可以通过互联网分享模型的信心,特别是对于可重用的计算机视觉和自然语言处理分类器。像Pytorch Hub这样的网站促进了模型共享,并且某些库甚至为API提供自动从GitHub存储库下载模型。

在这里,我们讨论无法加载不受信任的泡菜文件或ML模型时发生的被削弱的滑轨。在此过程中,我们介绍了一个新的工具,即可以帮助您撤消工程师,测试,甚至创建恶意泡沫文件。如果您是ML从业者,您将了解标准ML实践中固有的安全风险。如果您是一个安全工程师,您将了解一个可以帮助您构建和取证泡沫文件的新工具。无论哪种方式,到本文结束时,酸洗将希望在嘴里留下酸味。

Python Pickles是编译的程序在一个名为泡菜机(PM)的唯一虚拟机中运行。 PM解释泡沫文件的操作码序列以构造任意复杂的Python对象。 Python Pickle也是一种流式格式,允许PM递增地构建生成的对象,因为通过网络下载泡块的部分或从文件读取。

PM使用哈佛架构,从可写数据存储器中分离程序操作码,从而防止自修改代码和内存损坏攻击。它还缺乏对条件,循环甚至算术的支持。在未划分期间,PM在泡菜程序中读取并执行一系列指令。它一旦到达停止OPODE,它就会停止,并且在该点处的堆栈顶部是一个对象是未划分的最终结果。

从本说明书来看,人们可能会合理地得出结论,PM不是图灵完整的。这种格式怎么可能不安全?腐蚀Mishima着名流行主义的话:

计算机程序是一种媒介,减少了对我们的原因进行传播的现实,并且在他们的权力中,腐蚀现实不可避免地潜伏了奇怪的机器的危险。

PM包含两个可以在PM之外执行任意Python代码的操作码,将结果推入PM的堆栈:Global并减少。 Global用于导入Python模块或类,并且减少用于将一组参数应用于可调用的,通常先前通过全局导入。即使泡菜文件不使用yey reduce操作码,单独导入模块的动作也可以在该模块中执行任意代码,因此单独的全局是危险的。

例如,人们可以使用全局从__builtins__导入exec函数,然后用包含python代码的任意字符串缩小到调用exec。同样,对于像OS.System和subprocess.call等其他敏感函数。 Python程序可以选择通过定义自定义unpickler来限制此行为;但是,我们检查的ML库都不是这样做。即使他们这样做,这些保护几乎总是被规避;没有保证安全的方法可以安全地加载不受信任的泡沫文件,从官方Python 3.9泡菜文档中突出显示,如此突出显示:

可以构建恶意泡菜数据,该数据将在未划分期间执行任意代码。从来没有解开可能来自不受信任的来源的数据,或者这可能被篡改。

如果需要确保它没有被篡改,请使用HMAC签名数据。

如果您正在处理不受信任的数据,更安全的序列化格式(如JSON)可能更合适。

我们不知道包含模型的校验和的任何ML文件格式,无论是Tensorflow等一些库都有能力验证下载校验和,默认情况下是否禁用验证,并基于嵌入文件名中的校验和可以轻松伪造..

电脑安全社区已知Python酸洗的危险是一段时间。

Fickling拥有自己的泡菜虚拟机(PM)的实现,并且在可能的恶意文件上运行是安全的,因为它象征性地执行代码而不是公开执行它。

让我们看,通过创建一个无数的泡菜,通过创建包含序列化的基本Python类型列表的无序泡菜来逆转工程师:

$ python3 -c"进口系统,泡菜; \ sys.stdout.buffer.write(pickle.dumps([1,'2',{3:4}])))" \> simple_list.pickle $ python3 -m pickle simple_list.pickle [1,'2',{3:4}]

在泡沫文件上运行Fickling将对它进行反编译,并生成相当于在反序列化期间由真实PM运行的代码的人类可读的Python程序:

在这种情况下,由于它是一个简单的序列化列表,代码既不令人惊讶也不是非常有趣的。通过将--trace选项传递到Fickling,我们可以追踪PM的执行:

$ fickling --trace simple_list.pickleprotoframempty_list推送[]备忘录Memoized 0 - > []标记推动的MarkBinInt1推动1short_binunicode推动' 2' Memoize Memoized 1 - > ' 2' empty_dict按{} Memoize Memoized 2 - > {} BinInt1按3binint1按下4触发4个POPPED 3 POPPED {}按{3:4}追加{3:4} POPPED' 2'弹出1个popped markstop结果= [1,' 2',{3:4}]弹出[1,' 2',{3:4}]

您可以通过传递--Check-Safety选项来运行Fickling的静态分析来检测某些类别的恶意泡菜:

$ fickling - 检查 - 安全simple_list.picklewarning:fickling无法检测到任何明显的不安全的代码,但泡沫文件可能仍然是不安全的。如果它来自不受信任的来源,则不会解开此文件!

如果泡菜文件是恶意的,它会看起来像什么?好吧,为什么不制作一个!我们可以通过将任意Python代码注入泡沫文件来实现:

$ fickling - '打印("你好世界!")' testpickle> testpickle.pwn3d $ python3-m pickle testpickle.pwn3dhello world![1,#39; 2',{3:4}]

$ fickling - 检查 - 安全testpickle.pwn3dcall到`eval('打印(" hello world!")`几乎肯定是一个恶意泡菜文件

Fickling也可以用作Python库,并具有分解,分析,修改和综合泡沫文件的程序化接口。它是开源,您可以通过运行安装它:

由于ML模型的大多数ML模型广泛使用酸洗,因此有一个潜在的攻击表面,用于对模型的重量/神经元扰动,包括故障注射,活的特洛伊木马和体重中毒攻击等。例如,在反序列化期间,注入到泡菜中的代码可以根据本地环境以编程方式进行编程更改,例如日常环境,时区,主机名,系统语言环境/语言或IP地址。这些变化可能是微妙的,如比特闪光攻击,或者更明显,如在反序列化中注入任意延迟到拒绝服务。

Fickling基于官方Pytorch教程的概念证明,该教程将任意代码注入现有的Pytorch模型。此示例显示如何将生成的模型加载到Pytorch中,将自动列出当前目录中的所有文件(可能包含专有模型和代码),并将其删除到远程服务器。

这有关Microsoft的Azure ML等服务,它支持在云实例中运行用户提供的模型。恶意的“Fickled”模型可能导致拒绝服务,和/或在微软可能假定的环境中实现远程代码执行。如果多个用户的作业没有充分划分,则还有潜在的抵抗其他用户的专有模型。

理想的解决方案是避免完全酸洗。有几种不同的编码-JSON,CBOR,PROTOBUF - 比酸洗更安全,并且足以编码这些模型。实际上,Pytorch已经包括state_dict和load_state_dict函数,将和加载模型权重放入字典中,这可以很容易地序列化为JSON格式。为了完全加载模型,模型结构(也需要多层,层类型等)。如果Pytorch实现了模型结构的序列化/反序列化方法,则整个模型可以更安全地编码到JSON文件中。

在Pytorch之外,还有其他框架避免使用泡菜进行序列化。例如,开放式神经网络交换(ONNX)旨在为编码AI模型提供通用标准以改善互操作性。 ONNX规范使用protobuf来编码其模型表示。

我们向1月25日向Pytorch和Pytorch Hub维护者分享了ML模型并在两天后收到了回复。维护者认为他们会考虑向Pytorch和Pytorch集线器添加其他警告。他们还解释说,提交给Pytorch集线器的模型是用于质量和实用程序的审查,但维护者不对发布模型的人员或仔细审核用于安全性的人的人员进行任何背景检查,请在添加到Pytorch集线器上的Github存储库中的链接之前索引页面。维护者似乎遵循我们的建议,以切换到更安全的序列化形式;他们说,ONU是在用户身上,以确保第三方模型的出处和可靠性。

我们不相信这是足够的,特别是在面对越来越普遍的粉碎攻击(见PIP和NPM)。此外,即使关联的源代码出现良性,供应链攻击可能会将恶意代码很容易地注入合法模型。检测此类攻击的唯一方法是使用像Fickling这样的工具手动检查模型。

由于ML继续普及,大多数从业者依赖于广义框架,我们必须确保框架是安全的。许多用户在计算机科学中没有背景,更不用说计算机安全,并且可能无法理解信任模型文件的未知出处的危险。随着大多数框架的数据序列化形式而远离酸洗,对于大多数框架来说是相对简单的,并且可以轻松获胜。我们在酸洗将不再用于将不受信任的文件进行反级化时享受一天的想法。与此同时,尝试耗尽,让我们知道如何使用它!

非常感谢我们的团队努力解决这项工作:Sonya Schriner,Sina Pulchiha,Jim Miller,Suha S. Hussain,Carson Harmon,Josselin Feist和Trent Brunson