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

Sud*_*han 6 java security serialization deserialization

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

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

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

Java中反序列化不可信数据的安全性影响所述,此攻击的影响将非常大

首先,攻击者使用从类InvokerTransformer阿帕奇百科全书集合的方式来构建攻击链。

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

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

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

解决方案2:列入白名单,方法是使用“ SecureObjectStream”覆盖ObjectStream,该对象将验证应用程序实际需要的类。

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

解决方案3:关闭反序列化最好的方法。

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

Gil*_*hen 1

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