Oracle 发布补丁,修复 Double.parseDouble Bug

  • Charles Humble
  • 张龙

2011 年 2 月 22 日

话题:JavaOracle安全语言 & 开发架构

近日,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。

查看英文原文:Oracle 发布补丁,修复 Double.parseDouble Bug

JavaOracle安全语言 & 开发架构