Java - 不受信任数据的反序列化解决方法

java - deserialization of untrusted data workaround

提问人:Sudershan 提问时间:8/30/2016 最后编辑:CommunitySudershan 更新时间:9/23/2023 访问量:11118

问:

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

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

基本上,如果代码无法验证传入的对象,则容易受到攻击。

这种攻击的影响将非常大,如在 Java 中反序列化不受信任的数据会带来什么安全影响?

首先,攻击者使用 Apache Commons CollectionsInvokerTransformer 中的类作为构建攻击链的一种方式。

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

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

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

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

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

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

问题

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

Java 安全性 反序列化

评论

2赞 GhostCat 8/30/2016
一些不错的指南:securecoding.cert.org/confluence/pages/......
1赞 Taylor 8/30/2016
也许使用传输格式(如 json、xml 或协议缓冲区)是另一种选择?
0赞 Robert 8/30/2016
解决方案 4:仅接受来自可信来源的数据 - 可验证,例如通过 RSA/ECC 签名。
0赞 s.ijpma 8/30/2016
将您的共享资源集合 jar 更新到版本 3.2.2。
2赞 Robert 8/30/2016
@Sudershan 在这种情况下,只有解决方案 3 是安全的。Java 序列化格式是移动代码,您永远不应该向全世界公开代码执行接口。请改用纯数据格式。

答:

0赞 Gil Cohen 1/23/2022 #1

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