java - 不受信任的数据变通办法的反序列化

去年,我们遇到了所谓的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:白名单通过使用“安全对象流”覆盖对象流,该流验证应用程序实际期望的类。

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

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

问题

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


答案 1

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


答案 2