Pickle和Dill是否有类似的包含恶意脚本的风险?

时间:2015-12-16 14:14:57

标签: python pickle

Dill显然是一个非常有用的模块,只要您仔细管理文件,它就相对安全了。但我被声明推迟了:

  

因此,dill并非旨在防止错误或恶意构造的数据。由用户决定他们解开的数据是否来自可信赖的来源。

我在https://pypi.python.org/pypi/dill读到了。它由用户决定如何管理他们的文件。

如果我理解正确,一旦被莳萝腌制,你就不能轻易地找出原始剧本在没有特殊技能的情况下会做什么。

我的问题是:虽然我没有看到警告,也存在类似的情况吗?

3 个答案:

答案 0 :(得分:3)

Dill建立在泡菜之上,并且警告适用于腌制和莳萝一样多。

Pickle使用堆栈语言来有效地执行任意Python代码。例如,攻击者可以潜入指令以打开机器的后端。不要使用来自不受信任来源的腌制数据。

documentation包含明确警告:

  

警告pickle模块对于错误或恶意构造的数据不安全。切勿取消从不受信任或未经身份验证的来源收到的数据。

答案 1 :(得分:2)

因为Pickle允许您通过

覆盖对象序列化和反序列化
object.__getstate__()
  

类可以进一步影响他们的实例被腌制的方式;如果   class定义方法__getstate__(),它被调用并返回   对象被pickle作为实例的内容,而不是   实例字典的内容。如果__getstate__()方法是   缺席时,实例的__dict__像往常一样被腌制。

object.__setstate__(state)
  

取消排版时,如果类定义__setstate__(),则调用它   与未破坏状态。在这种情况下,没有要求   状态对象是字典。否则,酸洗状态必须   是一个字典,其项目分配给新实例   字典。

因为这些函数可以在用户的​​权限级别执行任意代码,所以编写恶意反序列化器相对容易 - 例如一个删除硬盘上的所有文件。

答案 2 :(得分:1)

  

虽然我没有看到警告,但是咸菜也存在类似的情况吗?

始终,始终假设只是因为某人没有说明它的危险性 安全使用。

话虽如此,Pickle docs也这么说:

  

警告 pickle模块对于错误或恶意构造的数据不安全。切勿取消从不受信任或未经身份验证的来源收到的数据。

是的,那个泡菜也存在安全风险。

解释背景:pickle和dill恢复python对象的状态。在CPython中,默认的python实现,这意味着恢复包含长度字段的PyObjects结构。作为一个例子,修改它会导致时髦的效果,并可能对你的python进程产生任意影响'存储器中。

顺便说一句,即使假设数据不是恶意的,也不意味着你可以解除或者不发送任何有关数据的信息。来自不同的python版本。所以,对我来说,这个问题有点理论上的问题:如果你需要可移植的对象,你将不得不实现一个坚如磐石的序列化/反序列化机制来传输你需要传输的数据,而不是或多或少。