大多数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,那你就错了。
答案 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是分数的原因是因为它允许您使用两个现有值之间的值,这在初始分配发生后提供值时可能是必要的。