如何发现java反序列化问题?

Pet*_*erK 7 java serialization exploit

我希望能够发现java代码中的反序列化问题.我应该寻找什么?例如,如何判断某些java代码是否试图利用" java calendar bug "?请注意,我不是一个java程序员,但我理解序列化和OOP背后的概念.我正在尝试实施一些安全检查(类似于编译器警告工具).

编辑:基于评论我想稍微改变一下这个问题:我认为所有的代码都是"不可信的",有没有办法如何评估潜在的危险?我的意思是,我可以告诉代码A在反序列化错误方面比B更危险吗?我应该寻找什么?

Tom*_*ine 5

首先,您需要了解您的上下文以确定安全威胁.(当我谈到"信任"时,我只是采取了一些捷径.我故意恶意说话.)

如果序列化数据是以相同的信任创建,保存和读取的,那么就没有任何实际问题(标准错误除外).请注意,如果您编写任何敏感信息,那么序列化数据也是敏感的(这似乎很明显,但那里有相当多的间接).

如果序列化数据因任何原因不受信任,那么还有一点需要考虑.重新创建的对象的内部结构可能是"不寻常的".数据可能不一致.您可能共享了应该是可分离的可变对象.反序列化可能会导致无限循环,或者在宇宙热死亡之前恰好无法完成的非无限循环.当然,数据可能是谎言.

如果您正在编写由不太可信的代码使用的库代码,那么事情变得更有趣:

在"日历错误"(和类似)的情况下,这是关于使用恶意数据和恶意代码对任意流进行反序列化.Java安全编码指南建议在自定义readObject方法中进行安全检查(使用"Java2安全模型"),这意味着您不应该以比代码和数据更多的信任来调用反序列化.

从可反复使用的对象的角度来看,事情更棘手.通过提供的对象ObjectInputStream通过readObject,readUnshared,defaultReadObject,readFields或只是默认deserialisation可能已经参考文献通过恶意代码,或者对于非最终类捕获,被恶意的子类.在部分初始化时,也可以在反序列化期间使用对象.反序列化不会调用反序列化类的"真实"构造函数(readObject/ readObjectNoData是一种伪造构造函数,它不能设置finals).这都是一场噩梦,所以你可能不想让你的敏感类可以序列化.

序列化和反序列化的实现存在许多漏洞.除非您自己实施,否则您不必担心这一点.