Apache Log4j2,RASP 防御優(yōu)勢(shì)及原理
Apache Log4j2 遠(yuǎn)程代碼執(zhí)行漏洞已爆發(fā)一周,安全廠商提供各類防御方案和檢測(cè)工具,甲方團(tuán)隊(duì)連夜應(yīng)急。
影響持續(xù)至今,網(wǎng)上流傳的各種利用和繞過(guò)姿勢(shì)還在層出不窮,影響面持續(xù)擴(kuò)大。所有安全人都開(kāi)始反思一個(gè)問(wèn)題:當(dāng)前的防御是否有效?針對(duì)這樣的 0day 再次發(fā)生,什么是有效的手段?
阿里云安全團(tuán)隊(duì)此次參與了諸多客戶應(yīng)急,并從云平臺(tái)自身防御總結(jié)經(jīng)驗(yàn),嘗試拋出一些觀點(diǎn)以供討論。
首先,我們先來(lái)從技術(shù)層面分析一下為什么這次 Log4j2 這么難搞。
Apache Log4j2 漏洞們的特質(zhì)
Cloud Native
此次 Log4j2 漏洞有兩個(gè)很棘手的特質(zhì):
1
可以實(shí)現(xiàn)任意遠(yuǎn)程代碼執(zhí)行
“懂規(guī)矩”的漏洞,危險(xiǎn)大的利用門檻高,利用門檻低的危害小,還算符合自然規(guī)律。這個(gè)漏洞并不按常規(guī)出牌,不但影響面廣,利用門檻低,危害還極大。三個(gè)因素重疊,到處被冠上“史詩(shī)級(jí)”的頭銜。
Java 的應(yīng)用極其廣泛且生態(tài)龐大,而 Log4j 作為日志處理的基礎(chǔ)組件被幾乎所有應(yīng)用程序所使用。
通過(guò) JNDI 注入的手段,可以實(shí)現(xiàn)任意遠(yuǎn)程代碼執(zhí)行,意味著攻擊者可以在存在漏洞的服務(wù)器上為所欲為。
即使在內(nèi)網(wǎng)環(huán)境中 JNDI 外聯(lián)無(wú)法成功,攻擊者也可以結(jié)合 lookup 特性去讀取很多敏感信息(如數(shù)據(jù)庫(kù)密碼、JAVA 環(huán)境變量等),再通過(guò) DNS 協(xié)議把敏感信息帶出內(nèi)網(wǎng)。
流量特征隱蔽
某些場(chǎng)景下幾乎沒(méi)有可以跟正常請(qǐng)求區(qū)分開(kāi)來(lái)的強(qiáng)特征。
本次漏洞 PoC 構(gòu)造非常簡(jiǎn)單,漏洞觸發(fā)的點(diǎn)廣泛而靈活,配合各種變量和協(xié)議的嵌套繞過(guò)方式,導(dǎo)致流量特征非常復(fù)雜和隱蔽。Log4j2 的 lookup 功能支持一些特殊的寫(xiě)法來(lái)對(duì)字符做二次處理,如 ${lower:j}Ndi、${upper:JN}di、${aaa:vv:cc:-j}ndi 等寫(xiě)法,都能打破字符串的連續(xù)性,造成利用時(shí)候的流量特征極為不明顯。
這是對(duì)所有基于流量特征安全防護(hù)產(chǎn)品的巨大挑戰(zhàn)。
當(dāng)流量特征不夠明顯時(shí),基于流量特征的規(guī)則陷入尷尬:要么覆蓋不到,要么產(chǎn)生嚴(yán)重誤報(bào)。只能持續(xù)不斷補(bǔ)充規(guī)則,在繞過(guò)和被繞過(guò)中循環(huán)往復(fù)。這種防御手段,能在 0day 爆發(fā)初期非常有效的為漏洞修復(fù)爭(zhēng)取時(shí)間。但隨著各種利用手段的變化越來(lái)越多,則很難保證沒(méi)有被繞過(guò)或誤報(bào)。
與 Log4j2 漏洞的某些“弱特征”甚至“0 特征”利用方式類似的場(chǎng)景,還有加密流量、內(nèi)存馬等,這些手段都曾在大型攻防演練中大放異彩,難以檢測(cè)的原理是類似的。
所以,有沒(méi)有一種技術(shù),可以無(wú)視漏洞利用手法在流量特征上的各種變化或隱藏,防御的更天然,甚至不依賴規(guī)則更新就可以防御這類 0day?
RASP 在此次事件中重回視野
Cloud Native
RASP(Runtime Application Self-Protection),運(yùn)行時(shí)應(yīng)用自我防護(hù),安全行業(yè)其實(shí)對(duì)其并不陌生,卻因?yàn)閭鹘y(tǒng)印象而采納不多。
這類技術(shù)的優(yōu)勢(shì)在于,以疫情類比,傳統(tǒng)的邊界防御類產(chǎn)品,類似口罩/防護(hù)服,而 RASP 則類似疫苗,會(huì)將自己注入到應(yīng)用當(dāng)中,伴隨應(yīng)用一起運(yùn)行,通過(guò) hook 關(guān)鍵函數(shù)實(shí)時(shí)檢測(cè)應(yīng)用執(zhí)行的高危行為。
RASP 是哪一類 0day 的天敵
Cloud Native
不同于基于流量特征的檢測(cè),RASP 核心關(guān)注應(yīng)用行為,而非流量本身。
當(dāng) RASP 發(fā)現(xiàn)一個(gè)應(yīng)用,做了它正常不應(yīng)該做的事情時(shí),大概率意味著當(dāng)前應(yīng)用已經(jīng)被攻擊者利用漏洞攻陷并做了一些高危操作(比如命令執(zhí)行、文件讀取、文件上傳、SSRF 等)。
其第一個(gè)優(yōu)勢(shì)是:凡是被 RASP 防御的行為,都已經(jīng)是真正可以被成功利用的攻擊行為。
而應(yīng)用的行為類型,相比于變幻無(wú)窮近乎無(wú)限的流量特征來(lái)說(shuō),往往是可以窮舉的。從應(yīng)用行為異常的角度去檢測(cè),范圍可以大幅收斂到有限的類型,這是RASP可以無(wú)視流量特征并且不依賴規(guī)則更新就可以防御幾乎全部0day(包括加密流量和內(nèi)存馬)的根本原因。
0day 和一些弱特征漏洞利用方式之所以難以防御的原因,上文已經(jīng)提及。但不管流量特征如何變化,漏洞利用的本質(zhì):還是要回歸到讓?xiě)?yīng)用來(lái)做一些不安全的動(dòng)作上——也就是應(yīng)用行為或者企圖。
以此次漏洞來(lái)看,RASP 并不關(guān)注請(qǐng)求中的流量是否包含了惡意的 payload,而是去關(guān)注 Log4j2 究竟使用 JNDI 功能去做了什么。如果進(jìn)行正常的 JNDI 查詢,就沒(méi)有問(wèn)題;但如果企圖使用 JNDI 功能進(jìn)行命令執(zhí)行,就是一個(gè)顯而易見(jiàn)的危險(xiǎn)行為。
RASP 正是在這個(gè)階段發(fā)揮了極其重要的作用:在應(yīng)用犯錯(cuò)之前將其“懸崖勒馬”。
從這個(gè)角度上還可以引申出 RASP 的第二個(gè)優(yōu)勢(shì):誤報(bào)極低。
比如:如果應(yīng)用壓根沒(méi)有使用 Log4j2,基于 payload 中的惡意特征上報(bào)攻擊就意味著誤報(bào),一定程度上消耗安全人員的精力。
而由于 RASP 運(yùn)行在應(yīng)用內(nèi)部,可以明確知道來(lái)自流量層的 payload 是否成功進(jìn)入了 Log4j2 的危險(xiǎn)函數(shù),所以不會(huì)存在“無(wú)效告警”。
近些年來(lái),從 weblogic 到 shiro、dubbo 再到今天的 Log4j2,由第三方組件導(dǎo)致的 0day 不斷的大規(guī)模爆發(fā)。
因?yàn)檫@類組件的代碼并不由使用它的應(yīng)用的開(kāi)發(fā)們維護(hù),一旦漏洞爆發(fā),安全人員第一時(shí)間首先需要投入大量的精力去排查哪些應(yīng)用在使用存在漏洞的組件,這并不是一個(gè)容易的事情。特別是對(duì)應(yīng)用眾多、迭代快速的企業(yè)來(lái)說(shuō),自己也說(shuō)不清楚哪些應(yīng)用、在使用哪些組件的、哪些版本是非常正常的事情。
這里引出了 RASP 的第三個(gè)優(yōu)勢(shì):第三方組件自查。
當(dāng)一個(gè) 0day 出現(xiàn)時(shí),可以第一時(shí)間排查到受影響組件的路徑,如下圖所示:
(通過(guò)阿里云RASP定位的Log4j組件路徑)
對(duì)于歷史上已經(jīng)爆出過(guò) CVE 漏洞的組件,RASP 可以自動(dòng)檢測(cè)并關(guān)聯(lián)其對(duì)應(yīng)的 CVE 漏洞編號(hào)、漏洞等級(jí)等信息,方便安全和開(kāi)發(fā)人員及時(shí)修復(fù)。
云原生 RASP,架構(gòu)優(yōu)勢(shì)加速落地
Cloud Native
2014 年,Gartner 就將 RASP 列為應(yīng)用安全的關(guān)鍵趨勢(shì),但實(shí)際上 RASP 在生產(chǎn)環(huán)境中大規(guī)模落地一直比較緩慢,目前也只有少數(shù)頭部的互聯(lián)網(wǎng)公司做到了。究其原因,最大的阻礙在于 RASP 技術(shù)對(duì)應(yīng)用自身的入侵性,開(kāi)發(fā)人員會(huì)非常擔(dān)憂產(chǎn)生性能、穩(wěn)定性、兼容性下降等問(wèn)題。
阿里巴巴集團(tuán)從 2015 年開(kāi)始部署自研的 RASP 產(chǎn)品,多年實(shí)踐已完成在生產(chǎn)網(wǎng)的大規(guī)模部署,并且經(jīng)歷了生產(chǎn)網(wǎng)超大流量業(yè)務(wù)的實(shí)戰(zhàn)檢驗(yàn),在性能、穩(wěn)定性和安全性(自我保護(hù))控制方面實(shí)現(xiàn)最佳表現(xiàn)。不得不說(shuō),這其中的確需要大量時(shí)間來(lái)沉淀經(jīng)驗(yàn)和教訓(xùn),不斷調(diào)優(yōu),這也是甲方安全團(tuán)隊(duì)自建 RASP 最大的難點(diǎn)。
阿里云安全團(tuán)隊(duì)將 RASP 最佳實(shí)踐嘗試輸出,去年推出更通用、更適合用戶場(chǎng)景的 RASP 版本,并在多個(gè)金融、教育用戶的生產(chǎn)網(wǎng)中部署和應(yīng)用。今年,打通云架構(gòu)優(yōu)勢(shì),實(shí)現(xiàn)云原生 ARMS 產(chǎn)品應(yīng)用一鍵接入 RASP 的絲滑體驗(yàn)(開(kāi)啟路徑:阿里云 ARMS-應(yīng)用安全菜單),極大降低云上用戶使用 RASP 防御能力的門檻。
近期事件接入 RASP 的用戶中,阿里云安全團(tuán)隊(duì)觀測(cè)到非常兇猛的 Log4j2 漏洞利用和危險(xiǎn)行為。以某金融用戶為例,接入 2 天,RASP 檢測(cè)并攔截了涉及 8 個(gè) Java 應(yīng)用的 184 次真實(shí)攻擊,其中包含 43 次命令執(zhí)行和 141 次 DNS 漏洞探測(cè)。如果缺少 RASP 的防御一環(huán)阻攔,這些是極大可能真實(shí)執(zhí)行成功的攻擊。
當(dāng)前版本免費(fèi)公測(cè),應(yīng)急的安全同志們可以接入 RASP 再?gòu)娜萆?jí)。如果需保護(hù)應(yīng)用暫時(shí)沒(méi)有上云,也可以聯(lián)系我們部署線下版 RASP。
PS:因漏洞管理規(guī)定,文中圖片漏洞細(xì)節(jié)通過(guò)馬賽克做了模糊處理,敬請(qǐng)諒解