2013-03-30 134 views
1

在python3 pickle模块的文档,它说:取储存危险

“ pickle模块并不旨在是对错误或恶意构造数据的安全来自不可信或未经认证的源接收决不unpickle数据”

从不受信任的来源中取出数据的风险是什么?取消不受信任的数据本身是否危险?或者,使用未焊接的对象只是危险的?那么解开不可信数据然后(在对结果对象做任何事情之前)证明它是一个保存对象是安全的吗?

回答

2

Pickle通过查找可调用对象(通常是类,但实际上是可调用的)并用固定参数调用它们来重新创建对象。这意味着拆除可能运行任何可召回任何地方,与任何论点。即使相关模块尚未导入,pickle也很乐意导入它。例如,它只需要几十个字符到execute os.system。所以,你甚至在你还没有收到对象之前就搞砸了

2

取消pickle等于执行任意代码。攻击者可以创建一个pickle,它将在取出过程中执行系统命令。

下面是一个例子,从a good blog post on the topic

此明确指出,泡菜是不安全的。许多人认为这是因为它可以加载除期望以外的类,并可能欺骗你运行它们的功能。但实际的安全风险要更危险。 Unpickling可以被利用来执行你的机器上的任意命令!

+1

@nadiaAlramli那个帖子还在什么地方?该博文很好,但链接直接跳转到您的链接页面 – tacaswell

1

pickle格式使用全面的虚拟机。如果馈入机器的代码是由攻击者控制的,那么它可以远远超出对象序列化(包括执行任意OS命令)。

有关讨论,请参阅Why Python Pickle is Insecure

+0

链接已死 –