JAVA出了漏洞,CVE-2010-4476,會(huì)導(dǎo)致拒絕服務(wù)攻擊。大家能從公告上,看到這樣一段代碼,挺長(zhǎng)的。意思是只有開(kāi)發(fā)人員寫(xiě)出這樣的代碼,才會(huì)對(duì)服務(wù)器造成影響。 人人
我們肯定會(huì)首先考慮,這么長(zhǎng)的代碼,究竟有多少開(kāi)發(fā)會(huì)傻乎乎的寫(xiě)出來(lái)?而我們究竟打不打補(bǔ)丁呢?其實(shí)作者知道,目前還有很多公司沒(méi)有打補(bǔ)丁,不過(guò)沒(méi)關(guān)系,等會(huì)兒你就要打了。
先看看官方給出的代碼。
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);
}
}
以上代碼,其實(shí)舉了兩個(gè)例子,首先簡(jiǎn)化一下代碼:
這段代碼會(huì)在編譯時(shí)掛掉:
double d = 2.2250738585072012e-308;
這段代碼會(huì)在運(yùn)行時(shí)掛掉:
double d = Double.parseDouble(“2.2250738585072012e-308″);
作者很奇怪后面的System.out是啥意思,按照實(shí)際測(cè)試以及官方原理,這句壓根不會(huì)執(zhí)行,樓上都已經(jīng)“無(wú)限循環(huán)”了,怎么可能走下來(lái)呢?不過(guò)這個(gè)不重要。債務(wù)追討
下文所說(shuō)的漏洞,是指假設(shè)我們的開(kāi)發(fā)人員寫(xiě)了“XXX”的代碼,攻擊者就可能攻擊我們服務(wù)器。
我們來(lái)逆推攻擊過(guò)程,從漏洞的角度上說(shuō),只有程序傳入的值,由用戶(hù)控制,才會(huì)導(dǎo)致漏洞觸發(fā),畢竟開(kāi)發(fā)不會(huì)直接寫(xiě)這個(gè)值。而編譯中掛掉,幾乎不可能存在,很難有正常的業(yè)務(wù)需要用戶(hù)提交代碼,讓服務(wù)器編譯執(zhí)行。所以,漏洞的產(chǎn)生只會(huì)出在這一句上:
這段代碼會(huì)在運(yùn)行時(shí)掛掉:
double d = Double.parseDouble(“2.2250738585072012e-308″);
那么再次逆推,要求這個(gè)值有用戶(hù)控制,如果環(huán)境是java web application,開(kāi)發(fā)想寫(xiě)出有漏洞的代碼,必須這樣搞:
這段代碼會(huì)在運(yùn)行時(shí)掛掉:
double d = Double.parseDouble(request.getParameter(“double”));
于是,程序就”hang!”(其實(shí)我不知道這個(gè)詞的意思),掛了,從表面上看不出來(lái),但是實(shí)際上你的CPU會(huì)立刻100%,當(dāng)前線程走不下去,頁(yè)面
卡死,不給你任何響應(yīng)。當(dāng)然,其他頁(yè)面也許會(huì)好,因?yàn)閣eb容器是多線程的,可惜已經(jīng)有人100%CPU了,頁(yè)面速度可想而知。
很多人,就考慮到了這段,除非開(kāi)發(fā)人員真的寫(xiě)了這樣的代碼,否則很難出現(xiàn)漏洞,所以沒(méi)有打補(bǔ)丁。
Java web在很多年前,都已經(jīng)開(kāi)始走框架路線了,我們熟知的spring
mvc、struts2、webwork等等,甚至還有一些公司自己實(shí)現(xiàn)框架,比如阿里巴巴公司的開(kāi)源框架webx(宣傳一下
http://code.taobao.org/project/view/401/)。在這樣的框架中,開(kāi)發(fā)人員更不可能自己去做轉(zhuǎn)義,這都是框架自己
負(fù)責(zé)的。是不是意味著,漏洞不可能存在呢?
這恰恰是最可怕的地方,這些框架沒(méi)有讓開(kāi)發(fā)人員參與類(lèi)型轉(zhuǎn)義,用戶(hù)本來(lái)提交的是一個(gè)String的2.2250738585072012e-308,框架會(huì)自動(dòng)轉(zhuǎn)義類(lèi)型為Double,經(jīng)測(cè)試,所有的框架都有自動(dòng)類(lèi)型轉(zhuǎn)義(否則框架意義何在啊)。
開(kāi)發(fā)什么都不需要做,只要在action中有一個(gè)對(duì)象,對(duì)象中有一個(gè)字段類(lèi)型為double,或許他都不需要定義對(duì)象,其他開(kāi)發(fā)早定義好了,他只需要寫(xiě)一個(gè)action。比如:
//訂單處理action
public class OrderAction extends ActionSupport{
//訂單對(duì)象
public Order order;
public String execute(){
return SUCCESS;
}
}
//Order對(duì)象的內(nèi)容
Public class Order{
//前面還有其他字段,這里只說(shuō)Double類(lèi)型的。
Double money;
}
這就“hang”了。我們可以寫(xiě)個(gè)掃描器,那么會(huì)有哪些字段通常被定義為double呢?掃描器自己去抓頁(yè)面,抓回來(lái)的input,如果為user.name,我們就猜測(cè)
user對(duì)象中可能存在money,可能存在score、point等,然后讓它們等于那個(gè)值,自動(dòng)提交。這等于掛字典,猜測(cè)對(duì)象中可能存在的
double類(lèi)型字段。
有沒(méi)有線上的例子呢?
posted on 2011-04-26 09:35
墻頭草 閱讀(278)
評(píng)論(0) 編輯 收藏