雙十一的硝煙還未散盡鹤树,雙十二就要來(lái)了铣焊。每逢節(jié)日期間,各大電商網(wǎng)站交易量暴漲罕伯,用戶(hù)蜂擁而至搶購(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)題不敢有一絲怠慢。
根據(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 專(zhuān)家指出周界安全防護(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 版本畜普,所以此類(lèi)漏洞還時(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)的用戶(hù)完全可以耗盡其所有資源儒鹿。
實(shí)現(xiàn)方式——實(shí)現(xiàn) java.lang.Double.parseDouble() 及其相關(guān)方法中的漏洞會(huì)導(dǎo)致線(xiàn)程在解析[2^(-1022) - 2^(-1075) : 2^(-1022) - 2^(-1076)]范圍內(nèi)的任一數(shù)字時(shí)造成線(xiàn)程懸停化撕。這個(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 類(lèi)型揣苏。遺憾的是悯嗓,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ō)有一定效果洪乍,算不上聰明和高效眯杏。那么是否有更好的方式呢?
一種新型應(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ù)類(lèi),然后采用 java 字節(jié)碼技術(shù)锉屈,在被保護(hù)的類(lèi)被加載進(jìn)虛擬機(jī)之前荤傲,根據(jù)規(guī)則對(duì)被保護(hù)的類(lèi)進(jìn)行修改,將防護(hù)類(lèi)織入到被保護(hù)的類(lèi)中颈渊,從而保證了我們服務(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è)功能。大家可以訪(fǎng)問(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ù),使其免受漏洞所累芬位。