第三方組件的安全剖析
一、Apache Struts2再曝高危漏洞
前段時間,Apache Struts2又接連曝出了兩個高危遠(yuǎn)程代碼執(zhí)行(Remoce Code Execution,下文簡稱RCE)漏洞(CVE-2017-5638)。為什么要說“又”呢?那是因?yàn)檫@早就不是Apache Struts2第一次曝出這類漏洞了。
你應(yīng)該還有印象,早幾年前Apache Struts2披露了一系列RCE漏洞,而且他們家在披露RCE漏洞的同時還附帶了證明漏洞存在的POC(Proof Of Concept)腳本。在那次事件中,由于POC包含的信息量太大,其本意可能是想方便開發(fā)者了解更多漏洞細(xì)節(jié),但未曾想?yún)s為黑客攻擊提供了重要線索,不得不讓人覺得是“神助攻”。再加上,這種做法幾乎就沒給使用Struts2的開發(fā)團(tuán)隊(duì)留出進(jìn)行修復(fù)的時間,以至于在短時間里,國內(nèi)外眾多使用Struts2的網(wǎng)站,包括一些知名網(wǎng)站均遭到黑客攻擊,大量網(wǎng)站紛紛表示躺槍。
二、前端JS框架、庫的安全性同樣令人擔(dān)憂
如果說現(xiàn)如今Struts2在新開發(fā)的應(yīng)用中的使用量小到幾乎可以忽略不計(jì),它的安全漏洞所帶來的影響有限,那么當(dāng)下火爆的各種前端JavaScript開發(fā)框架、庫當(dāng)中也存在安全漏洞這一事實(shí)卻讓情況變得不容樂觀。
早在2014年,當(dāng)時的一份調(diào)查研究發(fā)現(xiàn),在Alexa排名前10萬的網(wǎng)站中,有60%的網(wǎng)站使用了至少含有一個已知安全漏洞的JavaScript庫。時間來到2017年,美國波斯頓Northeastern University做了一次跟進(jìn)調(diào)查,發(fā)現(xiàn)Alexa排名前13萬的網(wǎng)站中,有37%的網(wǎng)站使用了至少含有一個已知安全漏洞的JavaScript庫。
三、挑戰(zhàn)
使用含有已知安全漏洞的第三方組件的現(xiàn)象為何會如此普遍呢?原因是多方面的,比如,在采用第三方組件的時候沒有對其進(jìn)行安全檢查,或者最初該組件并沒有安全漏洞,只是隨著時間推移,一段時間后被發(fā)現(xiàn)存在安全問題并披露了出來,等等。要想扭轉(zhuǎn)這一局面,開發(fā)團(tuán)隊(duì)卻也面臨著不小的挑戰(zhàn)。
1. 挑戰(zhàn)一:第三方組件及其版本號眾多,需要快速確認(rèn)哪些存在已知安全漏洞,是否受到漏洞披露的影響
無論是服務(wù)器端應(yīng)用還是運(yùn)行在瀏覽器里的前端應(yīng)用,使用幾十個第三方組件、庫是稀疏平常的事情,更何況這還只是直接依賴的第三方組件,要是算上間接依賴(即第三方組件所依賴的第三方組件,以此類推)的話,組成一個應(yīng)用的第三方組件數(shù)量將會相當(dāng)可觀。
在知道應(yīng)用所使用的所有第三方組件之后,還需要知道各個組件的精確版本號,然后才能將組件、版本號在已知漏洞數(shù)據(jù)庫里進(jìn)行匹配查詢,得出最后的結(jié)果。
讓問題變得更加棘手的是,一個企業(yè)里往往有不止一個應(yīng)用系統(tǒng),而每個系統(tǒng)都需要定期或者不定期的做這樣的排查,所需要的工作量有多么巨大可想而知。
2. 挑戰(zhàn)二:和時間賽跑,需要在第一時間內(nèi)得到通知,以最短時間完成修復(fù)和測試,并發(fā)布到生產(chǎn)環(huán)境
應(yīng)用在還未發(fā)布時如果遇到這類問題,開發(fā)團(tuán)隊(duì)有充足的時間來做出應(yīng)對,但對于已經(jīng)處于運(yùn)營中的應(yīng)用而言,時間就是生命線,這是一場和黑客爭分奪秒的戰(zhàn)爭,如果不能趕在黑客進(jìn)行攻擊前完成修復(fù)、發(fā)布等一系列任務(wù),那就只能祝你好運(yùn)了。
3. 挑戰(zhàn)三:對企業(yè)持續(xù)交付能力是個考驗(yàn)
在第三方組件的提供商披露安全漏洞的同時,還會給出修復(fù)建議,而通常的情況是,開發(fā)團(tuán)隊(duì)只需要將受到影響的第三方組件升級到新版本即可。看上去這似乎一點(diǎn)不難,但卻細(xì)思極恐。
第一,版本升級可能會帶來兼容性問題,導(dǎo)致應(yīng)用無法正常啟動、使用等。解決兼容性問題就可能得花去不少時間。
第二,邁過了兼容性這一關(guān),開發(fā)團(tuán)隊(duì)還得對應(yīng)用進(jìn)行回歸測試,以確保版本升級沒有破壞原有的業(yè)務(wù)功能。那么問題來了,你的團(tuán)隊(duì)需要花多少時間進(jìn)行這一測試呢?幾分鐘?幾小時?還是幾天甚至幾周?
第三,開發(fā)團(tuán)隊(duì)排除重重困難,避開了兼容性問題,完成了回歸測試,終于走到了發(fā)布修復(fù)這一步。此時,你的團(tuán)隊(duì)是否能對應(yīng)用進(jìn)行藍(lán)綠部署、滾動發(fā)布以保證生產(chǎn)環(huán)境業(yè)務(wù)不會因?yàn)椴渴鸲袛?
四、解決之道
1. 創(chuàng)建和維護(hù)第三方組件信息庫
開發(fā)團(tuán)隊(duì)可以將應(yīng)用中所使用到的所有第三方組件,包括那些間接依賴的第三方組件,及其版本號集中收集起來,形成一個組件信息庫。于是,每當(dāng)有第三方組件安全漏洞信息披露出來的時候,開發(fā)團(tuán)隊(duì)都可以立即做出判斷,了解自己的應(yīng)用是否受此次漏洞披露的影響。
2. 定期匹配排查
除了在得到第三方組件安全漏洞的信息披露通知后進(jìn)行識別判斷,開發(fā)團(tuán)隊(duì)還非常有必要主動的對所用到的組件進(jìn)行定期安全檢查。因?yàn)樵谏弦徊街幸呀?jīng)識別出了所有的第三方組件及其版本號,開發(fā)團(tuán)隊(duì)接下來需要做的,是將這些信息在已知安全漏洞數(shù)據(jù)庫(例如National Vulnerability Database)中進(jìn)行匹配。
3. 自動化
剛才已經(jīng)提到,識別第三方組件及其版本號,并且還要對其進(jìn)行細(xì)致的匹配排查,工作量是非常巨大的,如果沒有自動化的幫助,僅僅依靠人工的話,幾乎是不可能完成的任務(wù)。
幸運(yùn)的是,目前已經(jīng)有不少工具能幫我們完成這一工作,例如兩次入選ThoughtWorks技術(shù)雷達(dá)的OWASP Dependency Check,它能自動完成第三方組件識別、漏洞數(shù)據(jù)庫維護(hù),以及漏洞匹配、生成檢查報(bào)告等一些列活動。除了支持Java和.Net應(yīng)用外,還支持Ruby、NodeJS以及Python應(yīng)用,以及部分C/C++應(yīng)用。
同類型的工具還有支持.NET的OWASP SafeNuGet,專門針對Node應(yīng)用的Node Security Project等等。對于其他語言,也有各自對應(yīng)的自動化檢查工具,在此就不一一列舉了。
4. 貫穿整個生命周期
在應(yīng)用開發(fā)過程中,第三方組件可能會不斷的被加入到項(xiàng)目里,或者移除出去,其版本也可能會隨著時間的推移而不斷更改。在這個過程中,組件的的每一次變化都可能會帶來新的安全隱患。
開發(fā)團(tuán)隊(duì)可以利用上一步提到的自動化檢查工具,并將其和CI服務(wù)器集成起來,可以很容易做到在每次代碼提交的時候進(jìn)行一次安全檢查,從而達(dá)到持續(xù)監(jiān)控組件安全性的目標(biāo)。
五、總結(jié)
應(yīng)用往往使用了大量第三方組件,它們可能含有安全漏洞,給應(yīng)用的整體安全性埋下隱患。開發(fā)團(tuán)隊(duì)和黑客一直都在進(jìn)行時間競賽,其必須要在第一時間內(nèi)得到安全漏洞的披露通知,趕在黑客發(fā)動攻擊之前,完成漏洞修復(fù)工作。
好在開發(fā)團(tuán)隊(duì)可以利用各種自動化工具,快速且全面的發(fā)現(xiàn)那些有問題的第三方組件,通過運(yùn)行回歸測試以確保原有業(yè)務(wù)行為的正確性,并且結(jié)合持續(xù)交付的能力,在不影響生產(chǎn)環(huán)境業(yè)務(wù)持續(xù)運(yùn)行的情況下,將代碼改動發(fā)布到生成環(huán)境,及時避免第三方組件安全漏洞給應(yīng)用帶來安全風(fēng)險(xiǎn)。
【本文是51CTO專欄作者“ThoughtWorks”的原創(chuàng)稿件,微信公眾號:思特沃克,轉(zhuǎn)載請聯(lián)系原作者】