在python3 pickle模块的文档中,它说:
” pickle模块不是为了防止错误或恶意构造的数据。切勿取消从不受信任或未经身份验证的来源收到的数据。“
从不受信任的来源取消数据的风险是什么?不受信任的数据本身的破坏是危险的吗?或者使用未打印的物体是否危险?因此,对不可信的数据进行取消分类然后(在对结果对象进行任何操作之前)证明它是一个保存对象是否安全?
答案 0 :(得分:2)
取消腌菜相当于执行任意代码。攻击者可以创建一个pickle,它将在unpickling期间执行系统命令。
以下是a good blog post on the topic的示例:
这清楚地表明泡菜是不安全的。许多人认为这是因为它可以加载除你期望之外的类,并可能欺骗你运行它们的功能。但实际的安全风险要大得多。 可以利用Unpickling在您的计算机上执行任意命令!
答案 1 :(得分:2)
Pickle通过查找callables(通常是类,但实际上是任何可调用的对象)重新创建对象,并使用固定参数调用它们。这意味着unpickling可以使用任何参数运行任何可调用的任何地方。即使尚未导入相关模块,pickle也会很乐意导入它。例如,execute os.system
只需要几十个字符。所以,在你拿回一个物品之前,你就搞砸了。
答案 2 :(得分:1)
pickle格式使用完整的虚拟机。如果输入到机器中的代码由攻击者控制,它可以完成除对象序列化之外的任务(包括执行任意OS命令)。
有关讨论,请参阅Why Python Pickle is Insecure。