近日,Oracle 发布了一个名为 FPUpdater 的补丁程序,用于修复Java 平台上存在了10 年之久的Bug,恶意用户可以利用该Bug 向服务器发起拒绝服务攻击。时隔这么多年才发布,该补丁程序可谓是打破了记录。
们可以使用该补丁工具手工修复Java 实例,比如Java 服务器。该补丁适用于Oracle 所维护的所有受影响的Java 版本。根据 FPUpdater 发布声明所述,推荐将该 FPUpdater 工具应用于下表所示的 Oracle JRE 版本:
JRE/JDK 版本 说明 J2SE 1.4.2 1.4.2_29 及之前的版本需要升级 J2SE 5.0 5.0u27 及之前的版本需要升级 J2SE for Embedded 5.0 5.0u27 及之前的版本需要升级 Java SE 6 6u23 及之前的版本需要升级 Java SE for Embedded 6 6u23 及之前的版本需要升级 Java Real-Time System 2 2.2u1 及之前的版本需要升级 JRockit R27 R27.6.8 及之前的版本需要升级 JRockit R28 R28.1.1 及之前的版本需要升级 Oracle 还发布了一个针对 OpenJDK 的源代码修复。我们期待Oracle 在未来几天通过Java 的自动更新发布Critical Patch Update,但目前InfoQ 还无法证实这一点。
该Bug 源自于以二进制格式表示某些浮点数时所遇到的困难,在将十进制数2.2250738585072012e-308 转换为双精度的二进制浮点数时,该Bug 会导致Java 运行时和编译器进入到死循环当中。但该Bug 与 Rick Regan 所发现的 PHP 中的类似问题却并不一样。Java 的这个 Bug 是由 Konstantin Prei?er 再次发现并由 Regan 记录下来的。根据 Regan 的分析:
正常情况下,该数字会转换为 0x1p-1022,这是 DBL_MIN;但 Java 却出现了问题,导致在 0x1p-1022 和 0x0.fffffffffffffp-1022 之间来回变换,而后者则是最大的低于正常的双精度浮点数。
有人在 2001 年就发现了该问题,但在最初的 Bug 报告中却被归为低优先级的 Bug。它还有可能影响到其他的 Java 版本。比如说,InfoQ 就在 Apple 最新的 OS X 版本的 Java 上重现了该 Bug,但到目前为止,其他 Java 厂商的反应速度却远远落后于 Oracle。
评论