安全工程師只能向拒絕服務(wù)漏洞 Parse Double 低頭?

雙十一的硝煙還未散盡,雙十二就要來(lái)了。每逢節(jié)日期間,各大電商網(wǎng)站交易量暴漲,用戶蜂擁而至搶購(gòu)商品。那么這些電商平臺(tái)的安全性如何?

據(jù)不完全統(tǒng)計(jì),烏云平臺(tái)自成立以來(lái),已收集到的電商平臺(tái)漏洞總數(shù)達(dá) 1169 個(gè),其中 2015 年電商平臺(tái)漏洞數(shù)為 414 個(gè),相比于 2014 年,漏洞總數(shù)上漲了68.98%。對(duì)于安全工程師們來(lái)說(shuō),則需要加班加點(diǎn)保障網(wǎng)站的穩(wěn)定性和安全性。數(shù)千億的消費(fèi)額,讓所有的電商平臺(tái)工程師,對(duì)安全問(wèn)題不敢有一絲怠慢。

安全工程師只能向拒絕服務(wù)漏洞 Parse Double 低頭?

根據(jù) Gartner 的報(bào)告,超過(guò) 80% 的攻擊是以應(yīng)用層為目標(biāo)的,而大多數(shù)破壞活動(dòng)是通過(guò)應(yīng)用程序進(jìn)行的。他們發(fā)現(xiàn),軟件提供商對(duì)應(yīng)用程序安全防護(hù)的投 入普遍不足。Gartner 專家指出周界安全防護(hù)費(fèi)用與應(yīng)用程序安全防護(hù)費(fèi)用之比為 23:1。在一個(gè)完美的模型中,開(kāi)發(fā)人員的開(kāi)發(fā)生命周期 ( SDLC ) 應(yīng)當(dāng)符合安全防護(hù)標(biāo)準(zhǔn),從而開(kāi)發(fā)出安全的軟件。現(xiàn)實(shí)卻并非如此,迭代開(kāi)發(fā)和快速部署的流行,讓電商平臺(tái)正在經(jīng)受重重考驗(yàn)。

讓我們先看一個(gè)比較普遍的漏洞,拒絕服務(wù)漏洞:Parse Double,目前還有不少平臺(tái)在采用較老的 Java 版本,所以此類漏洞還時(shí)有發(fā)生。

拒絕服務(wù)漏洞是在一些遺留系統(tǒng)中仍然存在的老錯(cuò)誤,在 Windows 與 Linux 的 JDK1.6_23 及更早 JDK1.5_27 及更早 JRE 1.4.2_29 及更早的版本中都存在這一漏洞。對(duì)于使用 Apache Tomcat 服務(wù)器的系統(tǒng),若其 JRE 比較脆弱,未經(jīng)授權(quán)的用戶完全可以耗盡其所有資源。

實(shí)現(xiàn)方式——實(shí)現(xiàn) java.lang.Double.parseDouble() 及其相關(guān)方法中的漏洞會(huì)導(dǎo)致線程在解析[2^(-1022) - 2^(-1075) : 2^(-1022) - 2^(-1076)]范圍內(nèi)的任一數(shù)字時(shí)造成線程懸停。這個(gè)缺陷可以用來(lái)進(jìn)行 DOS(拒絕服務(wù))攻擊。例如:下面的代碼使用了較為脆弱的方法。

Double d = Double.parseDouble(request.getParameter("d"));

攻擊者可以發(fā)送這樣的請(qǐng)求,其參數(shù) d 在上面的范圍中,例如「 0.0222507385850720119e-00306」 ,進(jìn)而導(dǎo)致程序在處理該請(qǐng)求時(shí)懸停。

黑客新聞中的評(píng)論指出,BigDecimal.doubleValue 方法實(shí)際上只是將參數(shù)轉(zhuǎn)化為字符串,然后調(diào)用 Double.parseDouble 方法。因此,非常不幸,上面的機(jī)制只有在我放棄一些精度調(diào)用 Math.pow(10, exponent) ,而不使用 scaleByPowerOfTen 時(shí)會(huì)起作用。上面的版本,很遺憾,不起作用。

盡管這個(gè)錯(cuò)誤已經(jīng)在 JDK 1.6_24 及之后的版本得到修復(fù),安全行業(yè)研究機(jī)構(gòu)發(fā)現(xiàn)許多 Java 系統(tǒng)可能還在運(yùn)行有風(fēng)險(xiǎn)的老版本。普遍的建議是升級(jí)系統(tǒng)或者單純地標(biāo)準(zhǔn)化清理后的字符串,將其傳入新的 java.math.BigDecimal() 方法,再將結(jié)果轉(zhuǎn)化為基本 double 類型。遺憾的是,BigDecimal 的構(gòu)造函數(shù)也會(huì)調(diào)用麻煩的 Double.parseDouble 代碼,因此我們又回到了原點(diǎn)。最后,我們還可以嘗試下面的代碼,雖然不能說(shuō)它高效,但是它通過(guò)了所有 Float 測(cè)試,不會(huì)像 Double.parseDouble 那樣拒絕服務(wù)。

public static double parseDouble(String value) {
String normalString = normalizeDoubleString(value);
int offset = normalString.indexOf('E');
     BigDecimal base;
     int exponent;
    if (offset == -1) {
     base = new BigDecimal(value);
     exponent = 0;
      } else {
     base = new BigDecimal(normalString.substring(0, offset));
     exponent = Integer.parseInt(normalString.charAt(offset + 1) == '+' ?
     normalString.substring(offset + 2)
     normalString.substring(offset + 1));
     }
    return base.scaleByPowerOfTen(exponent).doubleValue();
}

這種方式雖說(shuō)有一定效果,算不上聰明和高效。那么是否有更好的方式呢?

安全工程師只能向拒絕服務(wù)漏洞 Parse Double 低頭?

一種新型應(yīng)用安全保護(hù)技術(shù)受到了較多的關(guān)注—— RASP(實(shí)時(shí)應(yīng)用安全自我保護(hù))。RASP 將保護(hù)程序想疫苗一樣注入到應(yīng)用程序和應(yīng)用程序融為一體,能實(shí)時(shí)檢測(cè)和阻斷安全攻擊,使應(yīng)用程序具備自我保護(hù)能力。比如說(shuō)針對(duì)拒絕服務(wù)漏洞 Parse Double 來(lái)說(shuō),RASP 定制了響應(yīng)的規(guī)則集和防護(hù)類,然后采用 java 字節(jié)碼技術(shù),在被保護(hù)的類被加載進(jìn)虛擬機(jī)之前,根據(jù)規(guī)則對(duì)被保護(hù)的類進(jìn)行修改,將防護(hù)類織入到被保護(hù)的類中,從而保證了我們服務(wù)器的安全。

RASP 工作在運(yùn)行環(huán)境時(shí),像疫苗一樣和應(yīng)用程序融為一體,了解應(yīng)用的上下文,從而可以實(shí)時(shí)徹底的保護(hù)應(yīng)用程序,使應(yīng)用程序免受漏洞所累。現(xiàn)在是廣告時(shí)間啦!目前,國(guó)內(nèi)只有一個(gè)產(chǎn)品OneASP擁有這個(gè)功能。大家可以訪問(wèn)一下網(wǎng)站和 DEMO ,體驗(yàn)一下我們強(qiáng)大的功能吧。雙十二就要來(lái)了,希望各位電商平臺(tái)能夠拒絕向「漏洞」低頭 !

OneRASP(實(shí)時(shí)應(yīng)用自我保護(hù))是一種基于云的應(yīng)用程序自我保護(hù)服務(wù), 可以為軟件產(chǎn)品提供實(shí)時(shí)保護(hù),使其免受漏洞所累。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容