java - 不可信数据的反序列化解决方法

去年我们遇到了所谓的 java 对象反序列化漏洞(看起来不是 java 的问题),它正在反序列化可能导致远程代码执行 (RCE) 或拒绝服务 (DoS) 攻击的对象。

有关详细信息,请参阅 https://dzone.com/articles/java-serialization-vulnerability-threatens-million

基本上,如果代码无法验证传入的对象,它就是易受攻击的。

What is the security impact of deserializing untrusted data in Java? 中所述,这种攻击的影响会非常高

首先,攻击者使用来自 Apache Commons CollectionsInvokerTransformer 的类来构建攻击链。

解决方案 1:黑名单 已用于构建小工具链的类不被接受。

但是,这还不够,因为攻击链可以通过许多其他方式构建。参考,

https://github.com/frohoff/ysoserial/tree/master/src/main/java/ysoserial/payloads

解决方案 2:白名单 通过使用“SecureObjectStream”覆盖 ObjectStream,它验证应用程序实际期望的类。

同样,这并不能完全否定攻击。有一个使用 jre7u21 的 RCE 和一个使用 HashSets 的拒绝服务攻击。

解决方案 3:关闭反序列化 迄今为止最好的一个。

问题

在不能忽视反序列化的情况下,除了黑白名单之外,还有更好的方法来验证和阻止坏数据爆炸吗?

stack overflow java - deserialization of untrusted data workaround
原文答案

答案:

作者头像

首先,您需要考虑风险以及谁获取序列化数据。一个只有 3 个超级管理员可以访问的内部管理界面,不需要像公共网站一样的关注。在第一种情况下,您甚至可能不会修复它并使用补偿控件来解决。其次,您需要优先考虑您的建议:关闭序列化是最好的选择,因为它可以消除风险。白名单特定类是次优的,如果无法关闭序列化,则应选择白名单,但不建议将黑名单列入黑名单,因为您不会考虑所有选项并且会被绕过。我不会将黑名单视为有效的解决方案。根据用例,另一种可能的解决方案是序列化数据的加密和或签名 (HMAC)。在 .NET 中,您拥有可用于反序列化攻击的 Viewstate 来接管它,但如果以适当的方式对其进行签名或加密,则无法对其进行修改,因此这是另一个有效的解决方案。因此,您可以选择这 3 个中的一个(不包括黑名单)。