9

有一种简单的方法可以完全锁定大量 JVM:

class runhang {
public static void main(String[] args) {
  System.out.println("Test:");
  double d = Double.parseDouble("2.2250738585072012e-308");
  System.out.println("Value: " + d);
 }
}

或者,挂起编译器:

class compilehang {
public static void main(String[] args) {
  double d = 2.2250738585072012e-308;
  System.out.println("Value: " + d);
 }
}

如此处所述: http ://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/

我的问题很简单:您知道哪种精心设计的 Web 应用程序实际上会受到这种影响?

换句话说:攻击者可以在哪种 webapps 上执行拒绝服务使用该已知弱点

这很糟糕,非常糟糕。但是除了程序员使用浮点数进行货币计算之外,我看不到很多 Java 支持的网站会崩溃。

我可以看到玩具科学小程序是候选人,但除此之外......

这是被阻塞线程的线程转储(在 Linux 上使用“kill -3”完成):

"main" prio=1 tid=0x09ab8a10 nid=0x57e9 runnable [0xbfbde000..0xbfbde728]
        at sun.misc.FDBigInt.mult(FloatingDecimal.java:2617)
        at sun.misc.FloatingDecimal.multPow52(FloatingDecimal.java:158)
        at sun.misc.FloatingDecimal.doubleValue(FloatingDecimal.java:1510)
        at java.lang.Double.parseDouble(Double.java:482)

编辑

JVM 锁定在这里:

java 版本 "1.5.0_10" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_10-b03) Java HotSpot(TM) Server VM (build 1.5.0_10-b03, 混合模式)

java 版本 "1.6.0_17" Java(TM) SE Runtime Environment (build 1.6.0_17-b04) Java HotSpot(TM) Server VM (build 14.3-b01, 混合模式)

4

5 回答 5

8

许多 Web服务器使用 Double.parse 解析部分 http 标头,因此我们在这里处理基础设施(除了在容器中运行的应用程序的任何问题)。您链接到的 Exploring Binary 博客的评论有以下示例:

GET / HTTP/1.1
Host: myhost
Connection: keep-alive
Accept-Language: en-us;q=2.2250738585072012e-308

如果请求所针对的 servlet 调用任何本地化 API(然后会尝试解析语言标头),则上述操作将使服务器停机。

所以是的,这是一个非常大的问题。攻击面很大,后果也很严重。

于 2011-02-10T05:49:50.050 回答
7

讨厌说的很明显,但是所有让用户提交字符串“2.2250738585072011e-308”并调用 parse double on 的应用程序都可能“实际上”受到影响。

于 2011-02-09T18:45:22.207 回答
4

Tomcat 的所有版本都已修补并发布以处理“接受语言”条件。

Oracle 发布了一个热修复程序,可以在这里找到:

http://www.oracle.com/technetwork/java/javase/fpupdater-tool-readme-305936.html

该修补程序适用于 java 1.4、1.5 和 1.6。

于 2011-02-10T15:46:28.190 回答
1

任何让用户输入浮点数并对其进行比较或计算的东西都应该是可疑的。我想说付款表格、贷款计算器和投标表格是最常见的。只需在整个应用程序中使用一个小的计算器实用程序,就可以通过重复点击来挂起 Web 服务器。

于 2011-02-09T20:26:42.167 回答
0

我知道这个数字只是会导致应用程序崩溃但无法抗拒评论的数字范围中的一个,请检查最后 4 位数字。2012,它说明了这个数字,古代预言的世界末日,我们的现代应用程序正指向一个崩溃的阈值,除非修复:-)

于 2011-02-12T14:29:03.517 回答