1
5
首先,您需要了解您的上下文以确定安全威胁。(当我谈到“信任”时,我采取了一些捷径。我是故意恶意的。) 如果串行化数据是以相同的信任创建、保存和读取的,那么就没有任何实际问题(标准错误除外)。注意:如果你写了任何敏感信息,那么串行数据也是敏感的(看起来很明显,但是有相当多的间接性)。 如果序列化数据由于任何原因而不可信,那么还有一些要考虑的问题。重新创建的对象的内部结构可能是“不寻常的”。数据可能不一致。您可能共享了应分开的可变对象。反序列化可能会导致一个无限循环,或者一个非无限循环,而这个循环恰好在宇宙热死之前是不可完成的。当然,数据可能是谎言。 如果您正在编写不太可信的代码使用的库代码,那么事情会变得更有趣:
在“日历错误”的情况下(和类似情况),这是关于用恶意数据和恶意代码反序列化任意流。Java安全编码指南建议使用自定义的“Java2安全模型”进行安全检查。
从反序列化对象的角度来看,事情更复杂。对象提供者
在序列化和反序列化的实现中存在许多漏洞。你不必担心这个问题,除非你自己去实现它。 |
3
1
我认为最好的方法是利用Java中已知的安全漏洞来破坏代码,将其升级为修复bug的Java版本。其次,处理与序列化相关的错误的最佳方法是将来自未知/未验证/不安全源的所有序列化数据视为可疑数据。 通过分析Java代码进行安全漏洞来发现问题并不容易,需要对被使用的Java机制进行深入理解并加以利用。尝试发现尝试的漏洞攻击(通常)会更加困难,特别是如果您正在寻找零日安全漏洞的漏洞攻击。请记住,还有其他可能的向量。 (如果有简单的方法在爪哇找到未知的安全漏洞,你可以肯定,Sun和其他安全研究人员早就已经使用过了。) |
4
1
如果将Java对象序列化以将其转移到分离的应用程序,那么为什么不考虑用应用程序之间共享的密钥来签署对象呢?它应该足以保护自己免受中间人的攻击。 回到验证问题的核心,对于通用语言来说,验证是非常困难的。你应该找有关这个主题的科学出版物。我认为最常用的技术是 sandboxing . 第二种方法是限制语言并禁止执行危险命令,例如, Yahoo Caja library 使用这种技术。 |
Juicy · JMP rel16(代替JMP rel32) 10 年前 |