方恩博,范希明,賈 鵬
(1.中國電子科技集團公司第三十研究所,四川 成都 610041;2.四川大學(xué) 網(wǎng)絡(luò)空間安全學(xué)院,四川 成都 610200)
模糊測試是現(xiàn)代漏洞挖掘最有效的技術(shù)之一,其為被測程序提供大量輸入,并監(jiān)視其出現(xiàn)的異常行為,例如堆棧溢出、越界讀寫、內(nèi)存泄漏等[1]。自從模糊測試的方法問世以來,其在業(yè)界和學(xué)界受到廣泛關(guān)注并不斷發(fā)展,基于此,研究人員開發(fā)了各種工具應(yīng)用于不同的測試場景。近年來,隨著AFL[2]家族的出現(xiàn),灰盒模糊測試的發(fā)展不斷完善,并取得了優(yōu)秀的成果。
群體智能思想是近年來熱門的研究方向,研究人員將人的先驗知識與機器的算力相結(jié)合,在部分領(lǐng)域取得了很好的成果。基于此,本文在模糊測試中引入人機協(xié)同的思想,讓專家來解決模糊測試執(zhí)行中遇到的問題。首先,對每一個專家的特點和經(jīng)驗進行量化描述并繪制知識圖譜,以此作為任務(wù)分配的依據(jù);其次,實現(xiàn)了任務(wù)自動化拆分和分配模塊,將每一個漏洞挖掘任務(wù)自動化拆分為若干子任務(wù),再對每一個子任務(wù)分配相應(yīng)的專家或機器;最后,每一個漏洞挖掘任務(wù)都由若干臺底層機器完成,每一臺機器都配有若干個漏洞挖掘工具,按照專家的建議選擇某種工具。在LAVA-M 測試集和兩個真實程序上進行實驗,底層使用20臺并行化的主機,結(jié)果遠(yuǎn)優(yōu)于AFL。
模糊測試是指向待測程序提供大量畸形數(shù)據(jù)作為輸入,監(jiān)視程序的異常情況,并基于導(dǎo)致異常的輸入分析發(fā)現(xiàn)漏洞的一種方法[1]。根據(jù)測試用例生成的方法,模糊測試可以分為基于生成的模糊測試和基于變異的模糊測試。前者需要已知的數(shù)據(jù)格式,在不破壞格式的前提下生成測試用例;后者是將初始數(shù)據(jù)進行大量變異,生成測試用例。按照對待測程序的分析程度,模糊測試方法可以分為白盒模糊測試、灰盒模糊測試和黑盒模糊測試。白盒模糊測試需要全部源代碼,黑盒模糊測試則不需要任何待測程序的信息,灰盒模糊測試介于二者之間,通過運行時的反饋來指導(dǎo)模糊測試。模糊測試已在漏洞挖掘領(lǐng)域發(fā)揮重要作用,但其仍然面臨著許多問題,如代碼覆蓋率不高,不能完全探索程序空間等。目前主流的模糊測試工具有Peach[3]、AFL、AFLGo[4]等。
符號執(zhí)行是指將程序的約束條件轉(zhuǎn)化為抽象的符號,則一個程序的輸出即可轉(zhuǎn)化為一個關(guān)于輸入的函數(shù)。符號執(zhí)行可以得出到達(dá)目標(biāo)代碼段所需要的輸入條件。符號執(zhí)行分為靜態(tài)符號執(zhí)行和動態(tài)符號執(zhí)行,其中靜態(tài)符號執(zhí)行是通過符號值模擬程序執(zhí)行,而動態(tài)符號執(zhí)行是在程序運行時進行約束求解。雖然符號執(zhí)行可以達(dá)到較高的代碼覆蓋率,但是其狀態(tài)空間爆炸、復(fù)雜約束無法求解、資源開銷過大等問題限制了符號執(zhí)行的實際使用[5]。目前,主流的符號執(zhí)行工具有KLEE[6]、CUTE[7]、DART[8]、angr[9]等。
污點分析的核心思想是跟蹤污點數(shù)據(jù)在程序執(zhí)行中的傳播情況。污點分析可以分為靜態(tài)污點分析和動態(tài)污點分析。靜態(tài)污點分析通過對源碼或者匯編代碼進行分析,建立寄存器和數(shù)據(jù)之間的順序依賴關(guān)系,依次判斷污點數(shù)據(jù)的傳播路徑;動態(tài)污點分析是指在程序執(zhí)行過程中,結(jié)合插樁的手段跟蹤污點數(shù)據(jù)的流向。污點分析同樣面臨著隱式流、污點清除和開銷過大的問題。目前主流的污點分析工具有TaintCheck[10]、Dytan[11]、libdft[12]等。
該框架整體流程如圖1 所示。首先,當(dāng)框架收到一個Fuzz 任務(wù)時,該框架將Fuzz 任務(wù)和其相關(guān)信息傳入漏洞智能拆分模塊。該模塊依據(jù)環(huán)節(jié)不同、策略不同,將一個Fuzz 任務(wù)拆分為若干子任務(wù)。
其次,當(dāng)任務(wù)拆分結(jié)束后,該框架將每一個子任務(wù)與相關(guān)信息傳入漏洞智能分配模塊。該模塊通過任務(wù)類型、個體特長、任務(wù)完成情況等信息對每一個個體進行打分,得出結(jié)果后,將每一個子任務(wù)分配給相應(yīng)的個體。其中每一個個體都由事先的個體建模得到。
再次,當(dāng)每一個個體收到子任務(wù)后,開始執(zhí)行相關(guān)的漏洞挖掘任務(wù),其中,機器自動化執(zhí)行過程中,遇到問題可以參考專家意見或者由專家介入代為處理。
最后,在所有機群和人群個體完成任務(wù)后,將所有任務(wù)進行匯總。匯聚的結(jié)果經(jīng)過去重后傳入結(jié)果與crash 分析,以詳細(xì)獲取漏洞信息。根據(jù)每個個體產(chǎn)生的結(jié)果,系統(tǒng)會評估每一個個體的工作情況并打分。該分?jǐn)?shù)將不斷積累并影響接下來的任務(wù)分配,如果某一個體在其從事的任務(wù)上效果并不理想,則根據(jù)相關(guān)算法降低其再次接受同種任務(wù)的概率。
個體庫從多個維度對專家和機器進行描述,其中,專家個體庫的特征維度如表1 所示,機器個體庫的特征維度如表2 所示。

表2 機器個體庫的特征維度
基于上述維度,對每個個體進行建模,并基于neo4j 數(shù)據(jù)庫建立知識圖譜。在后續(xù)的任務(wù)分配算法中,會根據(jù)各個維度的值對子任務(wù)進行合理的分配,每個子任務(wù)會選擇最合適的專家或機器。
如圖2 所示,將一個漏洞挖掘任務(wù)拆分為若干個子任務(wù),這樣每一個個體可以尋找到最適合其自身優(yōu)勢的子任務(wù)。以模糊測試為例,將一個模糊測試任務(wù)拆分為種子選取、測試過程、異常處理和crash 分析4 個子任務(wù)。其中,測試過程是通過并行若干臺模糊測試終端實現(xiàn)。種子選取是指,由被指派該子任務(wù)的專家個體對當(dāng)前待測試程序進行靜態(tài)分析,得出哪些種子可能對模糊測試效果更好,對初始種子隊列進行精簡和增添。異常處理是指,當(dāng)模糊測試工具長時間陷入覆蓋率停滯狀態(tài)時,該框架允許專家介入程序現(xiàn)場,通過逆向分析的方法判斷當(dāng)前程序是已經(jīng)達(dá)到了覆蓋率飽和狀態(tài),還是無法通過某些路徑,專家可以手動分析該路徑的約束條件,從而修改種子或修改模糊測試工具的字典,以通過該路徑約束,crash 分析是指當(dāng)模糊測試工具發(fā)現(xiàn)crash 時,需要對所得的種子進行crash 分析,判斷crash 成因并生成poc。雖然對不同的模糊測試工具存在不同的子任務(wù)拆解策略,但是模糊測試的大體拆解思路按照上述實現(xiàn)。當(dāng)任務(wù)拆解完成后,根據(jù)各項維度的值選擇最合適的個體進行任務(wù)分配,并在每一次任務(wù)完成后,根據(jù)評估算法調(diào)整個體的表現(xiàn)情況,以便在下一次任務(wù)分配時可以制訂更加合理的分配方案。

圖2 自動化任務(wù)拆解和分配模型(以Fuzzing 任務(wù)為例)
如圖3 所示,當(dāng)專家完成種子選擇后,即開始模糊測試。每一臺機器中都包含如AFL、AFL-Fast[16]、InsFuzz 等開源模糊測試工具,按照專家的建議采用相應(yīng)的模糊測試工具。在并行化中,最重要的問題是解決bitmap 合并,本文采用的方法是在服務(wù)器端不斷地輪詢每一個節(jié)點,從中取出位圖和種子文件,然后在服務(wù)器端進行合并,合并后再分發(fā)給每一個節(jié)點。如此一來,實現(xiàn)了位圖和種子隊列的同步。雖然在過程中會因為輪詢順序?qū)е鹿?jié)點存在同步的滯后性,但是從長時間來看,每一個節(jié)點都會分配到其他節(jié)點具有價值的種子,并且位圖保持一致。

圖3 并行化漏洞挖掘引擎框架
此外,本文在某些節(jié)點提供了若干符號執(zhí)行和污點分析工具,雖然這二者由于代價問題不可能每次漏洞挖掘任務(wù)都會應(yīng)用,但是針對某些特殊的場景,需要二者與模糊測試工具相互配合。其中,符號執(zhí)行工具包括KLEE、S2E、angr 等,污點分析工具包括TaintCheck、TaintDroid 等。
為了驗證基于人機協(xié)同的漏洞挖掘框架的有效性,選擇LAVA-M 測試集和真實世界的兩個程序nm-new、readelf 進行測試。為了體現(xiàn)人的先驗知識的效果,本次實驗采用專家進行預(yù)先的靜態(tài)分析,針對每一次比較指令的判斷做出處理,將比較指令的值作為字典加入模糊測試工具中。本次模糊測試使用添加了人工字典的20 臺AFL 和20 臺AFL 運行5 h 進行對比,體現(xiàn)人的先驗知識的效果。
如表3 所示,加入人工先驗知識的AFL 效果遠(yuǎn)優(yōu)于原版AFL,因此證明,這種基于人機協(xié)同的漏洞挖掘框架會大幅度提高漏洞挖掘的效率。

表3 AFL 與AFL(含專家知識)運行5 h 的覆蓋率和crash 數(shù)量對比
同時,進行另一個實驗測試,將專家指導(dǎo)的快速到達(dá)目標(biāo)點的策略引入AFLGo,專家在不同階段進行不同的種子篩選策略。在Binutils 測試集上與AFLGo 進行對比,將每個實驗運行20 次取平均值,時間預(yù)算設(shè)置為8 h。觀察專家指導(dǎo)下的漏洞挖掘框架在通用漏洞披露(Common Vulnerabilities&Exposures,CVE)復(fù)現(xiàn)上的能力。
如表4 所示,引入專家知識后的AFLGo 效果優(yōu)于原始AFLGo,這是因為AFLGo 并沒有對更有價值的種子進行排序,而專家知識改變了AFLGo原始的種子選擇策略,優(yōu)先運行更有價值的種子,從而提高了命中目標(biāo)點的次數(shù),并縮短了CVE 的復(fù)現(xiàn)時間。

表4 AFLGo 與AFLGo(含專家知識)的命中目標(biāo)點次數(shù)和CVE 復(fù)現(xiàn)時間對比
本文實現(xiàn)了一種基于人機協(xié)同的漏洞挖掘框架設(shè)計,該框架主要由基于知識圖譜的個體庫、任務(wù)智能拆解與分配、并行化漏洞挖掘引擎3 個模塊組成。在人的參與下,實驗證明其結(jié)果要優(yōu)于傳統(tǒng)的漏洞挖掘工具,這種人機結(jié)合的思想發(fā)揮了作用。在未來的工作中,將會進一步完善人的參與過程,將人機交互接口化,構(gòu)成一個完整的人機交互漏洞挖掘系統(tǒng)。