Evan Sultanik是Trail of Bits的计算机安全研究人员,还是美国德雷塞尔大学的兼职计算机科学教授。他拆解Python界广泛使用的pickle数据格式后发现,这种数据格式令人反感。
他并不是头一个这么做的人,他也承认这一点,在最近的一篇博文中特别指出: 几年前,计算机安全界开始渐渐讨厌pickling,这种二进制协议用于对Python对象结构进行序列化和反序列化。
连Python自己针对pickle模块的说明文档也承认未包括安全性。 文档开头这样写道: “警告: pickle模块不安全。 只能unpickle您信任的数据。 ”unpickling是反向操作,将字节流(来自二进制文件或类似字节的对象)转换回对象层次结构。
不过众多开发人员仍在使用它,尤其是在Python机器学习社区。 Sultanik表示,原因不难理解,因为pickling内置在Python中,另一个原因是它可以节省内存、简化模型训练,并使训练后的机器学习模型易于移植。
除了是Python标准库的一部分外,pickling在NumPy和scikit-learn这两个Python库中也得到支持,这两种库经常用于面向AI的数据科学。
据Sultanik声称,机器学习从业人员偏爱共享预训练的pickled模型,而不是用来训练这些模型的数据和算法,pickled模型代表有价值的知识产权。 已经建立起PyTorch Hub之类的网站以促进模型分发,而一些机器学习库整合了从GitHub自动获取模型的API。
大概一个月前,在GitHub上的PyTorch代码库中,一个名为KOLANICH的开发人员开了一个问题单,直言不讳地指出了该问题: “pickle是一个可以用来隐藏后门的安全问题。 遗憾的是,许多项目仍在使用[pickling方法] torch.save和torch.load。 ”
参与讨论的其他开发人员回答已经看到了警告,在考虑该怎么做。
为了促使pickle辩护者行动起来,Sultanik开发了一款名为Fickling的工具,以协助pickle文件的逆向工程、测试和武器化。他希望安全工程师们将该工具用于检查pickle文件,希望机器学习从业人员会用它来了解pickling的风险。
Sultanik还基于官方PyTorch教程开发了一个概念验证漏洞利用程序,可以将恶意代码注入到现有的PyTorch模型中。概念验证模型加载到PyTorch中后,会将当前目录中的所有文件泄露到远程服务器上。
Sultanik解释道:“对于微软的Azure ML之类的服务而言,这令人担忧,该服务支持在云实例中运行用户提供的模型。恶意的Fickled模型可能会导致拒绝服务,以及/或者在微软可能以为是专有环境的环境中实现远程代码执行。”
Sultanik表示,他已向PyTorch和PyTorch Hub的维护者表明了自己的担忧,并且显然被告知对方会考虑添加另外的警告。虽然他得知提交到PyTorch Hub的模型经过了“质量和实用性审查”,但他观察到,大家没有花精力去了解发布模型的人或去审核他们上传的代码。
Sultanik认为,考虑到供应链攻击已破坏了PyPI、npm、RubyGems及其他软件包注册中心中的代码软件包,要求用户自行确定代码是否靠得住再也不够了。
他下结论道:“对于大多数框架而言,远离pickling这种数据序列化协议相对简单直观,还可以轻松提高安全。”
参考资料:https://blog.trailofbits.com/2021/03/15/never-a-dill-moment-exploiting-machine-learning-pickle-files/