【发布时间】:2013-03-21 01:33:30
【问题描述】:
在 python3 pickle 模块的文档中它说:
" pickle 模块并非旨在防止错误或恶意构造的数据。永远不要解开从不受信任或未经身份验证的来源收到的数据。”
从不受信任的来源提取数据有什么风险?对不受信任的数据进行分解本身是否危险?或者使用未腌制的物体只是危险吗?那么解开不受信任的数据然后(在对结果对象进行任何操作之前)证明它是否是保存对象是否安全?
【问题讨论】:
在 python3 pickle 模块的文档中它说:
" pickle 模块并非旨在防止错误或恶意构造的数据。永远不要解开从不受信任或未经身份验证的来源收到的数据。”
从不受信任的来源提取数据有什么风险?对不受信任的数据进行分解本身是否危险?或者使用未腌制的物体只是危险吗?那么解开不受信任的数据然后(在对结果对象进行任何操作之前)证明它是否是保存对象是否安全?
【问题讨论】:
Unpickle 相当于执行任意代码。攻击者可以创建一个pickle,它将在unpickling期间执行系统命令。
这是来自a good blog post on the topic的示例:
这清楚地表明泡菜是不安全的。许多人认为这是因为它可以加载与您预期不同的类,并且可能会欺骗您运行它们的功能。但实际的安全风险要危险得多。 可以利用 Unpickling 在您的机器上执行任意命令!
【讨论】:
Pickle 通过查找可调用对象(通常是类,但实际上是任何可调用对象)并使用固定参数调用它们来重新创建对象。这意味着 unpickling 可以运行 any 可调用的 anywhere,并带有 any 参数。即使尚未导入相关模块,pickle 也会很乐意导入它。例如,execute os.system 只需要几十个字符。因此,在你拿回一个对象之前,你就完蛋了。
【讨论】:
pickle 格式使用成熟的虚拟机。如果输入机器的代码由攻击者控制,它可以做的事情远远超出对象序列化(包括执行任意操作系统命令)。
有关讨论,请参阅Why Python Pickle is Insecure。
【讨论】: