安全加载泡菜文件?

信息安全 Python 静态分析 强化
2021-09-02 08:40:15

在我们的 Python 应用程序中,我们pickle.load用于加载一个名为perceptron.pkl. HP Fortify 静态扫描在同一行引发了一个高漏洞,“动态代码评估 - 不安全的 Pickle 反序列化”。

我该如何补救?有什么方法可以安全地装载泡菜吗?

3个回答

Python 手册附带了关于 pickle 模块的警告

警告pickle 模块对错误或恶意构造的数据不安全。永远不要取消从不受信任或未经身份验证的来源收到的数据。

应该非常认真地对待这个警告。如果您解开不受信任的数据,攻击者将能够在您的系统上执行任意代码。那很不好。很坏。

不过,这里引用的关键部分是“不受信任或未经身份验证的来源”。如果您只是加载一个您相信没有恶意行为者可以控制的静态文件,那么 unpickling 是安全的。例如,如果您将文件与源代码一起存储并且具有相同的访问限制,那么攻击者也可以像修改 pickle 文件一样修改源代码。因此,解酸不一定是安全风险。

如果您不能信任该文件怎么办?你有两个选择:

  1. 切换到不易受代码执行影响的格式,例如 JSON。
  2. 使用该方法创建一个受限的 unpickler find_class(参见手册)。

我的猜测是#2 可能会更快实施,因为它需要对代码进行较少的更改。但这也是一种冒险的策略,因为我怀疑很容易犯一个小错误,从而使您面临漏洞。如果你想把风险降到最低,我会选择#1。

有什么方法可以安全地装载泡菜吗?

您已经要求任何方式,但这部分不仅取决于方式,还取决于所讨论的泡菜以及您所说的“安全”。

除非你的意思是“相当安全,因为我总是知道泡菜的来源”,否则答案可能是“不”。

但是,这里有一些问题的答案是“是”:

  • 如果我 100% 确定我写了一个泡菜并且它在运输过程中没有被修改,我可以安全地加载泡菜吗?
  • 如果来源是受信任的并且我已经检查了我从中加载泡菜的文件确实来自该来源,我可以安全地加载泡菜吗?
  • 在绝大多数情况下,我可以通过使用完全安全的反序列化逻辑来安全地实现与加载泡菜相同的事情吗?

所以,要问自己的第一个问题是:这些中的第三个是否适用于你?你能以不同的方式序列化和反序列化吗?

如果不是,前两个是否适用?

如果没有,我刚刚在 PyCon 学到了一个名为“Pikara”的项目——它旨在“使解封对象变得像以往一样安全”。它显然是以腌制的波兰菜命名的。我建议“泡菜”可能同样合适。:-)

如果另一种序列化方法不适合您的实现,您可以考虑检查一下:https : //github.com/latacora/pikara

另一个回答者也发布了另一种解酸方法,但我不能保证(尽管我今天仔细看了看,至少很有趣——当文档成熟时我会回来查看)。

如果这个答案没有让你对前进的道路有 100% 的信心,那么让我问一个后续问题:你实际上想在这里解开什么?

只有默认的 unpickler 是不安全的。您可以编写一个安全的修改后的 unpickler,或者使用其他人已经编写的 unpickler,例如 picklemagic:https ://github.com/CensoredUsername/picklemagic