靳憲龍,黃雅娟
(1.四川大學計算機學院,成都 610065;2.國防科技大學國際關系學院,南京 210012)
近年來網(wǎng)絡空間攻防對抗態(tài)勢不斷升級,網(wǎng)絡空間安全的地位與作用進一步凸顯。軟件作為網(wǎng)絡空間的基礎之一,承載著網(wǎng)絡空間中的各項服務,同時也充當著網(wǎng)絡空間與現(xiàn)實世界之間的橋梁。在頻發(fā)的各類安全事件中,無論是基于利益驅動的網(wǎng)絡犯罪還是具有政治背景的APT行動,軟件漏洞始終是對抗雙方博弈的核心。
傳統(tǒng)的漏洞挖掘與利用主要通過人工來進行,安全專家依靠完善的專業(yè)知識及豐富的安全經(jīng)驗,對軟件中潛在的缺陷進行挖掘,判斷其可利用性并制定修復方案。但隨著各種半自動、自動化漏洞挖掘技術的提出,使得漏洞挖掘的效率大幅提升,僅谷歌的OSSFuzz框架每月平均挖掘200個漏洞。相較自動化漏洞挖掘的效率,以人工的方式對漏洞的可利用性進行判定已無法滿足現(xiàn)實需求。
網(wǎng)絡攻防也對漏洞利用的自動化提出了迫切需求。2013年美國國防部高級研究計劃局(DARPA)發(fā)起了 CGC(Cyber Grand Challenge)項目[1],旨在建立高性能的具備自動化攻擊與防御能力的網(wǎng)絡推理系統(tǒng)。獲得CGC冠軍的網(wǎng)絡推理系統(tǒng)Mayhem,在2016年的DEFCON CTF[2]中與人類戰(zhàn)隊進行攻防對抗,雖最終落敗,但已體現(xiàn)出自動化漏洞利用在網(wǎng)絡攻防中的廣闊前景。
自動化漏洞利用是指,在無人工干預的基礎上,自動化挖掘軟件內部缺陷,并利用該缺陷使軟件實現(xiàn)非預期功能的能力。依據(jù)自動化漏洞利用的完整程度,可分為完整模式與受限模式。
完整模式,在自動化挖掘軟件漏洞并生成利用樣本的基礎上,使得樣本具備繞過現(xiàn)有安全機制的能力;受限模式,實現(xiàn)自動挖掘軟件漏洞并生成漏洞利用樣本,但不考慮安全機制繞過。完整模式的自動化漏洞利用難度較大,目前的研究主要集中在受限模式。
自動化漏洞利用主要包含以下環(huán)節(jié)[3]:
(1)漏洞挖掘。通過對軟件源碼或二進制代碼進行分析,采用模糊測試、補丁比對等技術,挖掘軟件內部潛在缺陷。
(2)漏洞分析?;谲浖毕?,通過污點分析、符號執(zhí)行等技術,定位漏洞點、判明漏洞類型、澄清漏洞成因等關鍵信息。
(3)漏洞利用。在判明漏洞機理的前提下,利用該缺陷,使軟件實現(xiàn)非預期的功能,通過惡意利用對安全造成直接危害。
(4)安全機制繞過。結合代碼復用、信息泄露、堆風水等攻擊技術,實現(xiàn)對DEP、ASLR、CFI等安全機制的繞過。
隨著軟件分析技術的發(fā)展,提出了模糊測試、符號執(zhí)行、污點分析等技術,這些技術已在現(xiàn)實工作中發(fā)揮了重要作用。
模糊測試是指向待測程序提供大量特殊構造的或是隨機的數(shù)據(jù)作為輸入,監(jiān)視程序運行過程中的異常并記錄導致異常的輸入數(shù)據(jù),基于導致異常的輸入數(shù)據(jù)進一步定位軟件中漏洞位置[4]。
依據(jù)測試用例的生成方法,模糊測試可以分為基于變異的模糊測試與基于生成的模糊測試?;谧儺惖哪:郎y試,通過對現(xiàn)有數(shù)據(jù)進行變異以生成新的測試用例。基于生成的模式測試通過對程序進行建模,從而生成新的測試用例。模糊測試已在漏洞挖掘領域發(fā)揮重要作用,但依然存在測試盲目性大、測試效率低、代碼覆蓋率不高等問題。
目前主流的模糊測試工具有 Peach[5]、Sulley[6]、AFL[7]等。
符號執(zhí)行是指采用抽象符號代替程序變量,依據(jù)程序語義遍歷整個執(zhí)行空間,程序的輸出被表示為輸入符號值的函數(shù)[8]。
符號執(zhí)行可分為靜態(tài)符號執(zhí)行、動態(tài)符號執(zhí)行與選擇性符號執(zhí)行。靜態(tài)符號執(zhí)行并不真正的執(zhí)行程序,而是通過符號值模擬程序執(zhí)行;動態(tài)符號執(zhí)行是對具體執(zhí)行與靜態(tài)符號執(zhí)行的整合,兼具了兩種方法的優(yōu)點;選擇性符號執(zhí)行可以對關鍵部分進行符號執(zhí)行,其余部分采用真實執(zhí)行。雖然符號執(zhí)行技術具有較高的代碼覆蓋率,但面臨著程序狀態(tài)空間爆炸、復雜約束無法求解、資源消耗過大等問題。
目前,主流的符號執(zhí)行工具有基于源碼的EXE[9]、KLEE[10]、DART[11]、CUTE[12],基于二進制的 angr[13]、SAGE[14]、Bitblaze[15]等。
污點分析的核心思想是跟蹤并分析污點數(shù)據(jù)在程序中的傳播情況。污點分析可分為靜態(tài)污點分析與動態(tài)污點分析。靜態(tài)污點分析通過對源碼或字節(jié)碼中的語句進行分析,刻畫語句或指令間的依賴關系并以此為依據(jù),判斷污點數(shù)據(jù)可能的全部傳播路徑。動態(tài)污點分析是在程序執(zhí)行過程中,結合程序插樁跟蹤污點數(shù)據(jù)的傳播過程,相較于靜態(tài)污點分析能夠提供更精確的分析結果。雖然污點分析能夠提供精確的分析結果,但其同樣面臨著隱式流問題、污點清除、性能開銷過大等問題。
目前,主流的污點分析工具有TaintCheck[16]、Dytan[17]、libdft[18]等。
國內外研究團隊已針對自動化漏洞利用技術做了大量工作[19],本節(jié)按時間順序對十款主流自動化漏洞利用系統(tǒng)進行介紹。
2008年D.Brumley首次提出基于補丁比對的漏洞利用自動生成方法APEG[20]。該方法在實現(xiàn)過程中,首先通過補丁比對定位漏洞點;隨后分析補丁代碼,澄清漏洞機理并生成能夠觸發(fā)漏洞的異常輸入;最后,結合污點分析技術生成漏洞利用樣本。由于該方案可操作性強,因此得到了安全研究者的普遍認可。
APEG的不足主要體現(xiàn)在:首先,APEG同時需要原程序與補丁程序,該前提一定程度上限制了APEG的應用場景。其次,由于軟件復雜度的提升,簡單的指令比對已無法快速定位漏洞點,同時與漏洞無關的補丁也對澄清漏洞機理造成了干擾;再次,APEG所生成的漏洞利用樣本以DoS為主,對漏洞的利用程度有限。
2009年Sean Heelan首次提出基于異常輸入的自動化漏洞利用方案AXGEN[21]。該方法綜合使用數(shù)據(jù)流分析、動態(tài)污點分析等技術,針對緩沖區(qū)溢出類漏洞,生成利用程序。
在實現(xiàn)過程中,AXGEN首先對系統(tǒng)調用、線程創(chuàng)建、信號量等關鍵點進行Hook;隨后,采用污點分析對程序運行狀態(tài)進行監(jiān)控,分析指令寄存器EIP中污點數(shù)據(jù)情況,判斷控制流是否被劫持;最后,生成約束條件,求解后得到漏洞利用樣本。在測試過程中,AXGEN對多個存在漏洞的應用程序成功生成漏洞利用樣本。
該方法的局限性主要表現(xiàn)在,首先,AXGEN不具備漏洞挖掘能力;其次,不適用于較為復雜的漏洞類型;最后,由于采用了污點分析技術,因此AXGEN存在污點分析所固有的不足。
2011年T.Avgerinos首次提出了基于源碼的自動化漏洞利用方法AEG[22]。該方法針對棧溢出、格式化字符串漏洞自動生成漏洞利用樣本,是首個完整實現(xiàn)從漏洞挖掘到漏洞利用樣本生成全流程的自動化解決方案。在實現(xiàn)過程中,AEG首先對源碼進行預處理,生成字節(jié)碼與二進制程序;其次,通過前向符號執(zhí)行挖掘程序中潛在的漏洞。根據(jù)挖掘到的漏洞信息構造路徑約束并求解,生成能夠觸發(fā)漏洞的輸入;再次,結合異常輸入與動態(tài)分析,生成環(huán)境約束。最后,求解路徑約束、環(huán)境約束,生成漏洞利用樣本。在測試過程中,AEG針對14款應用成功生成16個漏洞利用樣本,其中包含兩個0 day。
該方法的局限性主要體現(xiàn)在:首先,依賴于程序源碼,限制了AEG的應用場景;其次,所針對的漏洞限于簡單的棧溢出與格式化字符串。
2012年S.K.Cha提出了基于二進制的自動化利用方案Mayhem[23],該方案可以看做AEG在二進制方向的拓展。在實現(xiàn)過程中,Mayhem運用在線符號執(zhí)行、離線符號執(zhí)行以及基于索引的內存建模技術,使用BAP[24]將匯編指令轉換為中間語言并構造約束條件,通過對約束求解,最終生成漏洞利用樣本。Mayhem在2016年舉辦的CGC決賽中取得冠軍。
雖然在實際應用中Mayhem表現(xiàn)出色,但同樣存在以下局限:首先,僅完成了針對部分系統(tǒng)調用及庫函數(shù)的建模,因此無法處理復雜應用;其次,無法處理多線程應用;再次,由于使用了污點分析,因此具備污點分析所共有的不足。
2012年Shih-Kun Huang等人提出了基于異常輸入的自動化漏洞利用方法CRAX[25]。該方法采用回溯分析獲取漏洞點的詳細信息,在實現(xiàn)過程中,首先基于異常輸入,在導致程序崩潰的路徑上進行符號執(zhí)行;同時監(jiān)測指令寄存器EIP及內存中符號變量情況,并生成相應的約束條件;最后,求解約束條件并生成漏洞利用樣本。在測試過程中,該方法針對16款小型應用、3款中型應用成功生成漏洞利用樣本。
該方法的局限性主要體現(xiàn)在:首先,不具備漏洞挖掘能力,漏洞利用樣本的生成依賴于異常輸入的質量;其次,面臨路徑選擇、符號求解等問題;最后,程序發(fā)生異常的位置往往滯后于真實錯誤的位置,雖然CRAX采用了回溯的方法,但部分信息的丟失將影響生成漏洞利用樣本的成功率。
2013年M.H.Wang等人提出了自動化漏洞利用方案PolyAEG[26],側重于生成高質量、多樣性的漏洞利用樣本。在實現(xiàn)過程中,PolyAEG首先動態(tài)監(jiān)控程序執(zhí)行狀態(tài),提取相關信息構建污點傳播流圖iTPG及全局污點狀態(tài)記錄GTSR;其次,分析潛在的控制流劫持點、可利用的指令、污點內存等,結合跳轉指令鏈與污點內存構建不同的約束條件;最后,對約束求解,生成漏洞利用樣本。測試過程中,該方案針對每個存在漏洞的應用程序均生成大量多樣性漏洞利用樣本,最高可達4724個。
該方法的局限性主要體現(xiàn)在污點分析所存在的誤報、漏報及性能開銷較大。
2015年H.Hu首次提出了面向數(shù)據(jù)流的自動化漏洞利用方案FlowStitch[27]。該方案在不影響程序控制流的前提下,通過已知內存錯誤構造輸入數(shù)據(jù),完成對原有數(shù)據(jù)流中關鍵變量的篡改,實現(xiàn)權限提升、信息泄露等功能。在測試過程中,針對8個存在漏洞的應用,自動生成19個漏洞利用樣本。所生成的漏洞利用樣本均能繞過DEP、CFI,其中10個漏洞利用樣本能夠對抗ASLR。
該方案主要局限于FlowStitch需要程序中存在已知的內存錯誤,該前提限制了FlowStitch的應用場景。
2016年來自加州大學圣芭芭拉分校的安全團隊Shellphish提出自動化漏洞利用方案Mechanical Phish[28]。該系統(tǒng)在實現(xiàn)過程中,首先由基于AFL與動態(tài)符號執(zhí)行的漏洞挖掘引擎Driller[29]進行自動化漏洞挖掘;其次,由基于angr的漏洞利用生成引擎Rex自動化生成漏洞利用樣本;最后,由補丁生成引擎Patcherex生成補丁程序。該方案在DARPA舉辦的CGC決賽中,取得了第三名。
該方案的局限性主要體現(xiàn)在:首先,方案的設計以CGC為背景,所使用的操作系統(tǒng)DECREE、針對的漏洞類型均與真實環(huán)境差距較大,因此該方案在現(xiàn)實環(huán)境中的表現(xiàn)有待完善;其次,Mechanical Phish使用angr作為符號執(zhí)行引擎,因此無法處理大部分真實應用。
2018年Wei Wu首次提出了基于內核UAF漏洞的自動化方案FUZE[30]。該方案綜合運用模糊測試、符號執(zhí)行、動態(tài)追蹤等技術,針對內核UAF漏洞自動生成漏洞利用樣本。在實現(xiàn)過程中,首先結合KASAN[31]與動態(tài)追蹤技術,獲取生成利用程序所必須的信息,如釋放對象的基址、大小等;其次,通過內核Fuzzing識別引用懸垂指針(dangling pointer)的系統(tǒng)調用;再次,結合符號執(zhí)行對可利用性進行判斷,并計算堆噴數(shù)據(jù);最后,生成完整的漏洞利用程序。通過對15個內核UAF漏洞進行測試,F(xiàn)UZE成功生成漏洞利用并一定程度上繞過保護機制。
該方案的局限性主要體現(xiàn)在:首先,未考慮開啟KASLR的情況;其次,在使用符號執(zhí)行時,對前置約束條件的設置使得FUZE存在漏報的可能性。
2018年Yan Wang提出了針對堆漏洞的解決方案Revery[32]。該方案在實現(xiàn)過程中,首先分析漏洞位置和相關內存布局,建立異常對象內存布局圖、內存布局貢獻者圖;其次,以異常對象的內存布局為導向,采用定向Fuzzing探索替代路徑,并結合污點分析技術,在替代路徑中探索可利用狀態(tài);最后,確定拼接點、拼接路徑,組合生成漏洞利用路徑。求解路徑約束、漏洞利用數(shù)據(jù)約束等約束條件,生成漏洞利用。在測試過程中,Revery以CTF賽題為樣本,成功生成多個針對堆漏洞的漏洞利用樣本。
該方案的局限性主要體現(xiàn)在:首先,Revery基于angr開發(fā),因此無法處理大部分真實應用;其次,無法自動進行堆的原子化操作,不能自動化構造內存布局。
自2008年首次提出APEG后,自動化漏洞利用歷經(jīng)了十年的發(fā)展。所挖掘的軟件形式從源碼、字節(jié)碼擴展至二進制代碼,能夠處理的漏洞類型也逐漸復雜。雖然相關研究取得了明顯進展,但依然存在一些關鍵問題需要解決。如符號執(zhí)行所面臨的瓶頸問題,使得自動化漏洞利用僅適用于小型軟件或代碼片段;其次,無法處理基于堆的復雜漏洞、邏輯漏洞、結合多個漏洞的漏洞鏈等;再次,目前的研究主要集中于受限模式,所生成的漏洞利用樣本無法繞過已有的安全機制。
從上述分析來看,自動化漏洞利用距離實用還存在一定距離,但現(xiàn)實中的迫切需求,已指明了今后的發(fā)展方向,并將進一步推動自動化漏洞利用的發(fā)展與完善。