在我们的 Python 应用程序中,我们pickle.load用于加载一个名为perceptron.pkl. HP Fortify 静态扫描在同一行引发了一个高漏洞,“动态代码评估 - 不安全的 Pickle 反序列化”。
我该如何补救?有什么方法可以安全地装载泡菜吗?
在我们的 Python 应用程序中,我们pickle.load用于加载一个名为perceptron.pkl. HP Fortify 静态扫描在同一行引发了一个高漏洞,“动态代码评估 - 不安全的 Pickle 反序列化”。
我该如何补救?有什么方法可以安全地装载泡菜吗?
Python 手册附带了关于 pickle 模块的警告:
警告pickle 模块对错误或恶意构造的数据不安全。永远不要取消从不受信任或未经身份验证的来源收到的数据。
应该非常认真地对待这个警告。如果您解开不受信任的数据,攻击者将能够在您的系统上执行任意代码。那很不好。很坏。
不过,这里引用的关键部分是“不受信任或未经身份验证的来源”。如果您只是加载一个您相信没有恶意行为者可以控制的静态文件,那么 unpickling 是安全的。例如,如果您将文件与源代码一起存储并且具有相同的访问限制,那么攻击者也可以像修改 pickle 文件一样修改源代码。因此,解酸不一定是安全风险。
如果您不能信任该文件怎么办?你有两个选择:
find_class(参见手册)。我的猜测是#2 可能会更快实施,因为它需要对代码进行较少的更改。但这也是一种冒险的策略,因为我怀疑很容易犯一个小错误,从而使您面临漏洞。如果你想把风险降到最低,我会选择#1。
有什么方法可以安全地装载泡菜吗?
您已经要求任何方式,但这部分不仅取决于方式,还取决于所讨论的泡菜以及您所说的“安全”。
除非你的意思是“相当安全,因为我总是知道泡菜的来源”,否则答案可能是“不”。
但是,这里有一些问题的答案是“是”:
所以,要问自己的第一个问题是:这些中的第三个是否适用于你?你能以不同的方式序列化和反序列化吗?
如果不是,前两个是否适用?
如果没有,我刚刚在 PyCon 学到了一个名为“Pikara”的项目——它旨在“使解封对象变得像以往一样安全”。它显然是以腌制的波兰菜命名的。我建议“泡菜”可能同样合适。:-)
如果另一种序列化方法不适合您的实现,您可以考虑检查一下:https : //github.com/latacora/pikara
另一个回答者也发布了另一种解酸方法,但我不能保证(尽管我今天仔细看了看,至少很有趣——当文档成熟时我会回来查看)。
如果这个答案没有让你对前进的道路有 100% 的信心,那么让我问一个后续问题:你实际上想在这里解开什么?
只有默认的 unpickler 是不安全的。您可以编写一个安全的修改后的 unpickler,或者使用其他人已经编写的 unpickler,例如 picklemagic:https ://github.com/CensoredUsername/picklemagic