1

在 python3 pickle 模块的文档中它说:

“pickle 模块并非旨在防止错误或恶意构造的数据。切勿取消从不受信任或未经身份验证的来源接收的数据。”

从不受信任的来源提取数据的风险是什么?对不受信任的数据进行分解本身是否危险?或者使用未腌制的物体只是危险吗?那么解开不受信任的数据然后(在对结果对象做任何事情之前)证明它是否是一个保存对象是否安全?

4

3 回答 3

2

解开泡菜相当于执行任意代码。攻击者可以创建一个pickle,它将在unpickling期间执行系统命令。

这是一篇关于该主题的好博客文章的示例:

这清楚地表明泡菜是不安全的。许多人认为这是因为它可以加载与您预期不同的类,并且可能会欺骗您运行它们的功能。但实际的安全风险要危险得多。可以利用 Unpickling 在您的机器上执行任意命令!

于 2013-03-30T12:53:02.443 回答
2

Pickle recreates objects by looking up callables (commonly classes, but really any callable) and calling them with fixed arguments. This means that unpickling may run any callable anywhere, with any arguments. Even if the relevant module hasn't been imported yet, pickle will gladly import it. It takes only a couple dozen characters to execute os.system, for example. So you're screwed before you even get an object back.

于 2013-03-30T12:53:19.857 回答
1

pickle 格式使用成熟的虚拟机。如果输入机器的代码由攻击者控制,它可以做的事情远远超出对象序列化(包括执行任意操作系统命令)。

有关讨论,请参阅Python Pickle 不安全的原因

于 2013-03-30T12:53:07.043 回答