代码之家  ›  专栏  ›  技术社区  ›  PeterK

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

  •  7
  • PeterK  · 技术社区  · 14 年前

    我希望能够在Java代码中发现反序列化的问题。我该找什么?例如,如何确定一些Java代码试图利用“ java calendar bug “?请注意,我不是Java程序员,但我理解序列化和OOP后面的概念。我正在尝试实现一些安全检查(比如编译器警告工具)。

    编辑: 根据评论,我想稍微改变一下这个问题: 我认为所有被分析的代码都是“不可信的”,有没有一种方法来评估潜在的危险?我的意思是,在反序列化bug方面,我能说代码A比B更危险吗?我该找什么?

    4 回复  |  直到 14 年前
        1
  •  5
  •   Tom Hawtin - tackline    14 年前

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

    如果串行化数据是以相同的信任创建、保存和读取的,那么就没有任何实际问题(标准错误除外)。注意:如果你写了任何敏感信息,那么串行数据也是敏感的(看起来很明显,但是有相当多的间接性)。

    如果序列化数据由于任何原因而不可信,那么还有一些要考虑的问题。重新创建的对象的内部结构可能是“不寻常的”。数据可能不一致。您可能共享了应分开的可变对象。反序列化可能会导致一个无限循环,或者一个非无限循环,而这个循环恰好在宇宙热死之前是不可完成的。当然,数据可能是谎言。

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

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

    从反序列化对象的角度来看,事情更复杂。对象提供者 ObjectInputStream 通过 读取对象 , readUnshared , defaultReadObject , readFields 或者只是默认的反序列化可能包含恶意代码捕获的引用,或者对于非最终类,恶意地进行子类化。当对象部分初始化时,也可以在反序列化期间使用。反序列化不调用反序列化类的“real”构造函数( 读取对象 / readObjectNoData 是一种psuedo构造函数,它不能设置 final s)。这一切都是一场噩梦,所以你可能不想让你的敏感类可以序列化。

    在序列化和反序列化的实现中存在许多漏洞。你不必担心这个问题,除非你自己去实现它。

        2
  •  2
  •   darioo    14 年前

    隐马尔可夫模型。。。你的问题有点笼统。你看了吗 this 文章?这是关于Java的序列化算法,但从谷歌的缓存,因为主页似乎正在下降的时刻。

        3
  •  1
  •   Stephen C    14 年前

    我认为最好的方法是利用Java中已知的安全漏洞来破坏代码,将其升级为修复bug的Java版本。其次,处理与序列化相关的错误的最佳方法是将来自未知/未验证/不安全源的所有序列化数据视为可疑数据。

    通过分析Java代码进行安全漏洞来发现问题并不容易,需要对被使用的Java机制进行深入理解并加以利用。尝试发现尝试的漏洞攻击(通常)会更加困难,特别是如果您正在寻找零日安全漏洞的漏洞攻击。请记住,还有其他可能的向量。

    (如果有简单的方法在爪哇找到未知的安全漏洞,你可以肯定,Sun和其他安全研究人员早就已经使用过了。)

        4
  •  1
  •   Skarab    14 年前

    如果将Java对象序列化以将其转移到分离的应用程序,那么为什么不考虑用应用程序之间共享的密钥来签署对象呢?它应该足以保护自己免受中间人的攻击。

    回到验证问题的核心,对于通用语言来说,验证是非常困难的。你应该找有关这个主题的科学出版物。我认为最常用的技术是 sandboxing . 第二种方法是限制语言并禁止执行危险命令,例如, Yahoo Caja library 使用这种技术。