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”));
于是,程序就”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,經測試,所有的框架都有自動類型轉義(否則框架意義何在?。?br />
開發什么都不需要做,只要在action中有一個對象,對象中有一個字段類型為double,或許他都不需要定義對象,其他開發早定義好了,他只需要寫一個action。比如:
//訂單處理action
public class OrderAction extends ActionSupport{
//訂單對象
public Order order;
public String execute(){
return SUCCESS;
}
}
//Order對象的內容
Public class Order{
//前面還有其他字段,這里只說Double類型的。
Double money;
}
這就“hang”了。我們可以寫個掃描器,那么會有哪些字段通常被定義為double呢?掃描器自己去抓頁面,抓回來的input,如果為user.name,我們就猜測
user對象中可能存在money,可能存在score、point等,然后讓它們等于那個值,自動提交。這等于掛字典,猜測對象中可能存在的
double類型字段。
有沒有線上的例子呢?
posted on 2011-04-26 09:35
墻頭草 閱讀(278)
評論(0) 編輯 收藏