Java浮点值拒绝服务漏洞危害分析
By 空虚浪子心 http://www.inbreak.net/
JAVA出了漏洞,CVE-2010-4476,会导致拒绝服务攻击。大家能从公告上,看到这样一段代码,挺长的。意思是只有开发人员写出这样的代码,才会对服务器造成影响。
我们肯定会首先考虑,这么长的代码,究竟有多少开发会傻乎乎的写出来?而我们究竟打不打补丁呢?其实作者知道,目前还有很多公司没有打补丁,不过没关系,等会儿你就要打了。
先看看官方给出的代码。
Send a Java Program Into An Infinite Loop
Compile this program and run it; the program will hang (at least it does on a 32-bit system with the latest JRE/JDK):
class runhang {
public static void main(String[] args) {
System.out.println(“Test:”);
double d = Double.parseDouble(“2.2250738585072012e-308″);
System.out.println(“Value: ” + d);
}
}
—————————————————————————————————————-
Send the Java Compiler Into An Infinite Loop
Try to compile this program; the compiler will hang:
class compilehang {
public static void main(String[] args) {
double d = 2.2250738585072012e-308;
System.out.println(“Value: ” + d);
}
}
以上代码,其实举了两个例子,首先简化一下代码:
这段代码会在编译时挂掉:
double d = 2.2250738585072012e-308;
这段代码会在运行时挂掉:
double d = Double.parseDouble(“2.2250738585072012e-308″);
作者很奇怪后面的System.out是啥意思,按照实际测试以及官方原理,这句压根不会执行,楼上都已经“无限循环”了,怎么可能走下来呢?不过这个不重要。
下文所说的漏洞,是指假设我们的开发人员写了“XXX”的代码,攻击者就可能攻击我们服务器。
我们来逆推攻击过程,从漏洞的角度上说,只有程序传入的值,由用户控制,才会导致漏洞触发,毕竟开发不会直接写这个值。而编译中挂掉,几乎不可能存在,很难有正常的业务需要用户提交代码,让服务器编译执行。所以,漏洞的产生只会出在这一句上:
这段代码会在运行时挂掉:
double d = Double.parseDouble(“2.2250738585072012e-308″);
那么再次逆推,要求这个值有用户控制,如果环境是java web application,开发想写出有漏洞的代码,必须这样搞:
这段代码会在运行时挂掉:
double d = Double.parseDouble(request.getParameter(“double”));
当开发人员写出这样的代码,攻击者可以提交:
http://www.inbreak.net/double.do?double=2.2250738585072012e-308
于是,程序就”hang!”(其实我不知道这个词的意思),挂了,从表面上看不出来,但是实际上你的CPU会立刻100%,当前线程走不下去,页面
卡死,不给你任何响应。当然,其他页面也许会好,因为web容器是多线程的,可惜已经有人100%CPU了,页面速度可想而知。
很多人,就考虑到了这段,除非开发人员真的写了这样的代码,否则很难出现漏洞,所以没有打补丁。
Java web在很多年前,都已经开始走框架路线了,我们熟知的spring
mvc、struts2、webwork等等,甚至还有一些公司自己实现框架,比如阿里巴巴公司的开源框架webx(宣传一下
http://code.taobao.org/project/view/401/)。在这样的框架中,开发人员更不可能自己去做转义,这都是框架自己
负责的。是不是意味着,漏洞不可能存在呢?
这恰恰是最可怕的地方,这些框架没有让开发人员参与类型转义,用户本来提交的是一个String的2.2250738585072012e-308,框架会自动转义类型为Double,经测试,所有的框架都有自动类型转义(否则框架意义何在啊)。
开发什么都不需要做,只要在action中有一个对象,对象中有一个字段类型为double,或许他都不需要定义对象,其他开发早定义好了,他只需要写一个action。比如:
//订单处理action
public class OrderAction extends ActionSupport{
//订单对象
public Order order;
public String execute(){
return SUCCESS;
}
}
//Order对象的内容
Public class Order{
//前面还有其他字段,这里只说Double类型的。
Double money;
}
这是很常见的写法,只要Order对象中,有一个字段是Double的。我们就可以对此action提交:
http://www.inbreak.net/order.do?order.money=2.2250738585072012e-308
这就“hang”了。
我们可以写个扫描器,那么会有哪些字段通常被定义为double呢?扫描器自己去抓页面,抓回来的input,如果为user.name,我们就猜测
user对象中可能存在money,可能存在score、point等,然后让它们等于那个值,自动提交。这等于挂字典,猜测对象中可能存在的
double类型字段。
有没有线上的例子呢?
163的网易宝单日支付金额限制:

正常的情况,填入1元,看看效果:

立刻来到了
但是我们填上:2.2250738585072012e-308

等啊等,等啊等。。。等到花儿也谢了,还是不响应!
你猜猜它们的服务器怎样了?
Java
web框架化以后,开发人员和架构师都忘记了转义类型的事情,也不需要自己做转义,代码变得越来越简单。作者为了研究漏洞,去询问有些资深架构师时,甚至
以为“开发不会写这样的代码”,所以我们的程序不会受到影响。最终还是作者亲手用现有框架搭建了环境,把CPU真的跑到100%,才开始相信这个漏洞对框
架的危害。
作者相信,J2EE框架对这个漏洞的完美支持,足以使很多门户网站沦陷。而这只是刚刚开始,你可以抱有侥幸心理,不过下一篇和这个漏洞有关的文章,会让你彻底打消这个念头。
Java浮点值拒绝服务漏洞危害分析的更多相关文章
- Android应用安全之Android APP通用型拒绝服务漏洞
0xr0ot和Xbalien交流所有可能导致应用拒绝服务的异常类型时,发现了一处通用的本地拒绝服务漏洞.该通用型本地拒绝服务可以造成大面积的app拒绝服务. 针对序列化对象而出现的拒绝服务主要是由于应 ...
- Linux kernel 拒绝服务漏洞
漏洞名称: Linux kernel 拒绝服务漏洞 CNNVD编号: CNNVD-201311-020 发布时间: 2013-11-05 更新时间: 2013-11-05 危害等级: 漏洞类型: ...
- 重大漏洞!PHP multipart/form-data头部解析远程拒绝服务漏洞
"有些人看不懂,简单比喻来说吧:目前刚出的任何安全防护都不会拦,网站类专属漏洞 畸形数据包,2KB随机数据包,2M网速打死各种网站,cdn通挂!"PHP multipart/for ...
- Java安全之XStream 漏洞分析
Java安全之XStream 漏洞分析 0x00 前言 好久没写漏洞分析文章了,最近感觉在审代码的时候,XStream 组件出现的频率比较高,借此来学习一波XStream的漏洞分析. 0x01 XSt ...
- Java安全之Axis漏洞分析
Java安全之Axis漏洞分析 0x00 前言 看到个别代码常出现里面有一些Axis组件,没去仔细研究过该漏洞.研究记录一下. 0x01 漏洞复现 漏洞版本:axis=<1.4 Axis1.4 ...
- Java 为值传递而不是引用传递
——reference Java is Pass by Value and Not Pass by Reference 其实这个问题是一个非常初级的问题,相关的概念初学者早已掌握,但是时间长了还是容易 ...
- java的值传递笔记
1. 背景:开发小伙伴突然问我java是值传递还是引用传递,我说当然是值传递,只不过有时候传递一个对象时实际传递的是对象的地址值,所以让人容易产生一种引用传递的假象,貌似在李刚的疯狂java讲义有提到 ...
- java是值传递还是引用传递
首先写一个简便的Employee,以便测试使用. class Employee { private String name; public Employee(String name) { this.n ...
- C特殊浮点值NaN
特殊浮点值NaN(Not-a-Number),例如asin()函数返回反正弦值,所以输入参数不能大于1,否则函数返回NaN值,printf()显示为nan,NaN或类似形式.
随机推荐
- android 状态栏、标题栏、屏幕高度
1.获取状态栏高度: decorView是window中的最顶层view,可以从window中获取到decorView,然后decorView有个getWindowVisibleDisplayFram ...
- nsDATA 转结构体
很多时候需要将c,c++形式的struct转换为 NSData来处理.但是怎么转换呢? 假设有这么一个结构体: struct MYINFO { int a; long b; char c ...
- 使用源码编译wxpython-基于python2.7
1.前言 本文主要讲述在linux环境下进行编译wxpython,在windows下面安装wxpython很简单,只要下载,然后直接执行exe文件,下一步下一步即可安装,在linux下面,则具有很多步 ...
- C#单元测试
简单来说,单元测试就是局部测试,即是对项目中的某个静态类测试.静态方法测试.类的实例化测试以及类的方法测试.当您有一个具体的项目时您可以通过运行查看结果的方式进行测试,但当您只有一个类而没有完整的项目 ...
- (转)MFC消息机制
转自:http://blog.csdn.net/kongfuxionghao/article/details/35882533
- offer--链表反转和从尾到头打印链表
这个是高频的面试题,今天总结了一些.反转链表用三个指针实现,返回新链表的头节点:而从尾到头打印,应用栈实现,返回vector整个链表. //题目描述 // //输入一个链表,反转链表后,输出链表的所有 ...
- 初识---Qt解析XML文件(QDomDocument)
关于XML及其使用场景不在此多做介绍,今天主要介绍Qt中对于XML的解析.QtXml模块提供了一个读写XML文件的流,解析方法包含DOM和SAX,两者的区别是什么呢? DOM(Document Ob ...
- Java基础 —— 概述
Java语言: JDK(Java Development Kit)开发工具包,提供Java的开发环境和运行环境 --> 适合于开发 JRE(Java Runtime Environment)Ja ...
- HW7.15
public class Solution { public static void main(String[] args) { double[][] set1 = {{1, 1}, {2, 2}, ...
- dom 回到顶部(兼容IE FF Chrome)
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...