大多数未修补的Tomcat Web服务器都是易受攻击的,谁有错?

时间:2011-02-11 00:03:50

标签: java http tomcat

大多数Java JVM都受到非常严重的拒绝服务(所有Oracle / Sun JVM在1.6.0_24之前[在撰写本文时还没有出现]并且没有得到所发布的HotFix昨天,例如)。

http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/

以下内容:

curl -H 'Accept-Language: en-us;q=2.2250738585072012e-308' http://example.org

崩溃了地球上Tomcat网络服务器的很多

我的问题很简单:谁有错?

显然getLocale()调用(非常严重)错误的Double.parseDouble(...),然后您可以在Tomcat上轻松执行拒绝服务。

Double.parseDouble(...)的错误实现真的有问题吗?

对我来说,看起来真正的问题是HTTP规范正在使用浮点数来表达对我来说真的不像科学计算的东西。对这样的事物使用浮点数似乎不仅仅是奇怪的事情:很容易证明用不同语言实现会产生不同的结果。

那么谁有过错?

Java Double.parseDouble(...)的实施非常蹩脚(自10年以来就知道错误)?

HTTP规范? (请记住,PHP遇到了完全相同的错误)。

我理解你如果用一种语言发生错误就会责怪这种语言......但是当两种不同语言发生两次远程拒绝服务攻击时,由于HTTP规范要求解析某事物的浮点数应该响铃。

浮点数应仅用于科学计算。如果你没有浮点数而没有epsilon,那你就错了。

3 个答案:

答案 0 :(得分:6)

实际上,rfc 2616(HTTP / 1.1规范)说:

  

HTTP / 1.1应用程序之后不得生成超过三位数   小数点。这些值的用户配置也应该是   以这种方式限制。

qvalue    = ( "0" [ "." 0*3DIGIT ] )
          | ( "1" [ "." 0*3("0") ] )
     

“质量价值”是用词不当,因为这些价值仅仅代表   期望质量的相对降低。

请注意,这会限制位数,并且不允许使用指数。我认为任何实现都完全符合规范,忽略具有超过3个小数位的输入,并完全忽略具有指数值的任何内容。 Tomcat不这样做的事实不是HTTP规范的问题。

答案 1 :(得分:0)

它不是/或。与许多安全问题一样,这是两者的错误导致的结果。如果其中任何一个人的工作做得相当好,就不会出现问题。

答案 2 :(得分:-1)

这是Java运行时库中的数字解析方法的问题,而不是Tomcat - 它只是使用所述方法。


编辑:q是分数的原因是因为它允许您使用两个现有值之间的值,这在初始分配发生后提供值时可能是必要的。