歐陽永基 魏 強(qiáng) 王清賢 尹中旭
Fuzzing[1]測試是軟件測試中一種很重要的測試方法,它使用大量隨機(jī)變異的用例作為輸入,監(jiān)視所檢測程序是否在運(yùn)行這些用例時發(fā)生異常。以zzuf[2], MiniFuzz[3]等為代表的傳統(tǒng) Fuzzing測試方法廣泛應(yīng)用于代碼的檢測中,它們可以挖掘出其他檢測方法無法檢測的脆弱點(diǎn)。但是傳統(tǒng)的 Fuzzing測試方法的缺陷也很明顯:由于測試數(shù)據(jù)的構(gòu)造方法過于隨機(jī)簡單,以及測試具有盲目性,導(dǎo)致測試速度快但效率低;難以確定覆蓋率,導(dǎo)致無法對Fuzzing結(jié)果進(jìn)行評估;由于不能保證充分的代碼覆蓋導(dǎo)致漏報率高;由于測試數(shù)據(jù)的相互獨(dú)立,導(dǎo)致難以發(fā)現(xiàn)復(fù)雜的脆弱點(diǎn)等。以EFS[4]和peach[5]等為代表的智能 Fuzzing測試工具,根據(jù)對測試程序的分析、理解,利用啟發(fā)式算法、結(jié)構(gòu)化的數(shù)據(jù)構(gòu)造描述,能夠構(gòu)造豐富多樣的測試數(shù)據(jù),但仍然忽視了已有異常對潛在異常的指示作用,往往不能在宏觀層面上研究測試數(shù)據(jù)的構(gòu)造。而以Ruijters[6]等為代表的研究人員,探索了利用馬爾科夫鏈建模等技術(shù)進(jìn)行更有效測試的可行性,雖然他們的模型可以生成大量有差異的樣本,并能有效評估覆蓋率,但是他們依然沒有建立程序異常和測試因素的整體關(guān)系模型,局限于改善某個、或某幾個測試因素,對Fuzzing測試的貢獻(xiàn)有限。
為了克服現(xiàn)有 Fuzzing技術(shù)對目標(biāo)程序缺乏理解、測試完全隨機(jī)且盲目的缺點(diǎn),研究者提出了許多新技術(shù)和新方法[7,8],基于動態(tài)符號執(zhí)行的智能測試技術(shù)逐漸成為其中的研究熱點(diǎn)。其具體做法是首先通過靜態(tài)分析獲得危險點(diǎn),然后通過符號執(zhí)行收集路徑條件,最后利用約束求解工具求解能夠執(zhí)行到指定路徑的測試數(shù)據(jù)進(jìn)行測試。微軟公司軟件可靠性部門Godefroid等人[9]設(shè)計(jì)的SAGE,加州大學(xué)伯克利分校的Molnar等人[10]在Valgrind基礎(chǔ)之上設(shè)計(jì)開發(fā)的CatchConv,斯坦福大學(xué)Engler等人開發(fā)的ARCHER以及威斯康星大學(xué)Balakrishnan等人[11]開發(fā)的 CodeSurfer/x86,北京大學(xué) Wang等人[12]所開發(fā) TaintScope,阿姆斯特丹自由大學(xué)[13]開發(fā)的Dowser,上述軟件測試模型采用中間表示、污點(diǎn)傳播分析、符號執(zhí)行、執(zhí)行路徑遍歷、路徑約束求解等思想,不同程度上改進(jìn)了以peach為代表的Fuzzing技術(shù)的弊端,反映了軟件脆弱性測試由模糊化測試向精確化測試轉(zhuǎn)變的趨勢。然而不同于Fuzzing技術(shù),基于動態(tài)符號執(zhí)行測試中的關(guān)鍵技術(shù),如符號執(zhí)行、約束求解等技術(shù)都需要大量計(jì)算資源,并且技術(shù)實(shí)現(xiàn)較為復(fù)雜,不利于大規(guī)模推廣應(yīng)用。迄今為止,安全社區(qū)最具代表性的開源原型工具Fuzzgrind, Pingrind, avalanche和KLEE,尚無法對大型應(yīng)用程序進(jìn)行有效測試,例如 WPS office 2013軟件、暴風(fēng)影音5媒體播發(fā)軟件、PDF閱讀軟件SumatraPDF等。實(shí)際應(yīng)用中,安全研究人員發(fā)現(xiàn)脆弱點(diǎn)普遍存在出錯代碼區(qū)域重合、觸發(fā)原理相似的現(xiàn)象。例如研究人員Exodusintel利用對CVE-2013-3147脆弱點(diǎn)的分析,采用與之相似的對編輯聚焦事件處理的方法構(gòu)造了能觸發(fā)新脆弱點(diǎn)的樣本。同時,Arcuri等人通過分析、研究現(xiàn)有隨機(jī)測試的因素,提供了一種新穎的評估隨機(jī)測試有效性的理論,它為建立程序異常和測試因素的關(guān)系模型提供了理論基礎(chǔ)[14]。
本文的主要貢獻(xiàn)如下:(1)綜合Fuzzing技術(shù)和動態(tài)符號執(zhí)行技術(shù)的優(yōu)缺點(diǎn),并考慮已發(fā)現(xiàn)脆弱點(diǎn)和潛在脆弱點(diǎn)的相關(guān)性,提出了一種基于異常分布導(dǎo)向的樣本構(gòu)造模型 TGM(Testcase Generation Model)。TGM 模型能夠優(yōu)先選擇異常概率高與基本塊覆蓋多的樣本進(jìn)行數(shù)據(jù)變異,并可以根據(jù)測試結(jié)果迭代更新模型參數(shù),使模型不斷趨近實(shí)際測試樣本異常分布。(2)在TGM模型基礎(chǔ)上,設(shè)計(jì)并構(gòu)建了智能 Fuzzing框架,并對其中測試輸入?yún)?shù)對應(yīng)屬性的處理等關(guān)鍵問題進(jìn)行了解決,為合理利用TGM 模型進(jìn)行程序測試提供了基礎(chǔ)。(3)實(shí)現(xiàn)了基于 TGM 的模糊測試器 CombFuzz,利用該系統(tǒng)分別對BegBunch[15]測試集和WPS等大型應(yīng)用程序進(jìn)行了測試,并與現(xiàn)有工具進(jìn)行了對比,實(shí)驗(yàn)表明基于TGM模型的智能Fuzzing測試方法有著較強(qiáng)的異常挖掘能力和代碼覆蓋能力。
為了優(yōu)先選擇異常觸發(fā)概率高的樣本進(jìn)行測試,本文對一些開源軟件的Bug庫進(jìn)行了統(tǒng)計(jì)分析,從中發(fā)現(xiàn)已測試出的安全缺陷存在一定的隱含規(guī)律。例如,在Mozilla的Bugzilla中,我們發(fā)現(xiàn),有近200個安全問題發(fā)生在assertion語句周圍。因此,考慮到安全缺陷發(fā)生的規(guī)律性,本文提出一種基于異常分布導(dǎo)向的樣本構(gòu)造模型 TGM(Testcase Generation Model)。
為了更好地對模型進(jìn)行敘述,我們以文件測試為例進(jìn)行說明,下面給出模型適用于文件測試的一些重要概念的定義:(1)文件偏移:測試文件的基本組成單元,記為r;(2)文件類型:即測試文件的結(jié)構(gòu),記為cat; (3)文件:由m個偏移組成,表示為s={r1, r2, … ,rm|m > 0 且 m ∈ N}; (4)測試集:由n 個測試文件組成,表示為 S = {s1, s2,… ,sn|n > 0 且 n ∈N}。
在單個 Fuzzing測試中,如果將產(chǎn)生異常標(biāo)記為事件A,沒有產(chǎn)生異常記為A,則發(fā)生異常的概率可以記為p( A)。如果以該次Fuzzing測試的特征(如測試文件偏移 r1, r2,…,rm和測試文件類型cat)為先驗(yàn),則測試發(fā)生異常的概率可以表示為 p ( A|r1, r2,… ,rm,cat)。顯然單個Fuzzing測試為伯努利實(shí)驗(yàn),如果對所有 ri, cat的組合都進(jìn)行無窮次測試,那么就可以精確地獲得在給定文件偏移、文件類型的前提下,事件A發(fā)生的概率。然而出于測試成本的考慮,重復(fù)進(jìn)行大量實(shí)驗(yàn)是不可取的。因而可利用泊松分布在一定的置信區(qū)間計(jì)算出異常觸發(fā)的概率,進(jìn)而選擇概率高的樣本進(jìn)行測試。
基于該測試思想,本文建立了TGM樣本構(gòu)造模型,輔助 Fuzzing方法進(jìn)行程序測試,其概率圖表示如圖1所示,其中,t表示脆弱性模式,I表示測試輸入?yún)?shù)對應(yīng)屬性,θ表示I可能觸發(fā)的異常概率,α表示θ的概率分布。

圖1 TGM概率圖
在TGM模型中,將脆弱性模式t和異常觸發(fā)的相對強(qiáng)弱α作為樣本構(gòu)造的先驗(yàn)條件,由參數(shù)(,)tα可以獲得測試輸入?yún)?shù)I可能觸發(fā)的異常概率θ。采用TGM模型構(gòu)造測試樣本,用戶首先對測試樣本集進(jìn)行去重等預(yù)處理,根據(jù)要測試的脆弱性模式,選擇I中的測試樣本,如對于緩沖區(qū)溢出檢測,用戶可選擇樣本中能污染strcpy函數(shù)中長度參數(shù)的偏移,并以遞增和遞減該偏移的方式選取待測偏移集合,然后在測試中,根據(jù)這些偏移觸發(fā)的異常數(shù)量,迭代調(diào)整參數(shù)α,θ值,并優(yōu)先選擇異常觸發(fā)概率高的樣本進(jìn)行測試。
對于Fuzzing測試,最重要的是基于TGM模型選擇參數(shù)I,然后通過改變屬性中的元素來構(gòu)造新的樣本。I的取值可以為多種屬性,例如,對于本文研究的文檔類Fuzzing 測試,I的取值為文檔類型cat和偏移r兩種屬性。具體而言,給定一組測試樣本,首先根據(jù)選定的屬性I進(jìn)行分組,如根據(jù)樣本覆蓋的基本塊數(shù)目、指令條數(shù)、執(zhí)行時間、樣本文件類型、覆蓋函數(shù)的偏移等進(jìn)行分類;然后從組中挑選樣本進(jìn)行測試,并計(jì)算可能的異常概率分布;最后,建立合適的模型分析該分布的分布來指導(dǎo)測試器選擇下一個待測試的樣本。若一個測試集中包含k個屬性類型,總的異常數(shù)量Q,每種類型的異常數(shù)量為q,則每種類型的異常概率為 qk/Q。我們將I可能觸發(fā)的異常概率表示為θ,顯然θ服從多項(xiàng)分布(multinomial distribution)。對于不同的脆弱性模式,異常觸發(fā)的概率分布一般并不相同,因此,我們以α表示在不同脆弱性模式下異常觸發(fā)的相對強(qiáng)弱。由于狄利克雷分布是多項(xiàng)分布的共軛先驗(yàn)分布,我們假定α服從狄利克雷分布。綜上所述,TGM 模型將按照以下步驟來構(gòu)造新的樣本:(1)θ ~ Dir(α); (2)I~Multinomial(θ); (3)根據(jù)I 構(gòu)造新樣本。
若總共有M個屬性,即I={ r , cat, …},則TGM的概率模型可表示為

如果對于每一個脆弱性模式都訓(xùn)練一個 TGM模型,則可以去掉參數(shù)t來簡化模型,即式(1)可轉(zhuǎn)化為式(2):

其中θ服從分布Dir()α,即

對于某個Dir()α分布,則對應(yīng)輸入?yún)?shù)I以ip觸發(fā)異常的概率為

為提高模糊測試器發(fā)現(xiàn)測試程序異常的效率,我們首先根據(jù)初始測試樣本的測試結(jié)果,初始化TGM 模型的參數(shù)α和θ,然后根據(jù)已初始化的模型,選擇屬性I進(jìn)行新樣本構(gòu)造,并利用新的樣本測試結(jié)果,對概率模型參數(shù)進(jìn)行更新,使得模型更準(zhǔn)確地反映出偏移、類型對異常觸發(fā)的影響程度,進(jìn)而指導(dǎo)測試器選取更有效的測試樣本。迭代進(jìn)行屬性選擇、新樣本構(gòu)造與測試、模型更新的過程,直到達(dá)到預(yù)定測試效果或測試時間結(jié)束為止。
基于TGM模型,本文設(shè)計(jì)了針對文件處理軟件的測試器,其總體框架如圖2所示。

圖2 模糊測試器總體框架
該測試器主要由數(shù)據(jù)分析、變異策略、樣本構(gòu)造、Fuzzing 4個主要部分組成。其中,數(shù)據(jù)分析主要負(fù)責(zé)對樣本集合進(jìn)行去重、優(yōu)化、以及樣本屬性的信息收集;變異策略根據(jù)TGM模型選擇樣本屬性作為候選變異對象;樣本構(gòu)造通過畸形的數(shù)據(jù)替換構(gòu)造新的樣本;Fuzzing主要包括執(zhí)行測試和crash捕獲兩個主要功能。下面將詳細(xì)描述基于TGM模型的測試器所涉及的關(guān)鍵算法與技術(shù)。
在 Fuzzing測試中,如果重疊樣本過多,將會嚴(yán)重影響測試效率和樣本概率的統(tǒng)計(jì)。因此,本文的首要目標(biāo)就是要確保在達(dá)到同樣測試效果的前提下減少樣本集的規(guī)模,提高測試用例的構(gòu)造效率。為了完成上述目的,本文設(shè)計(jì)了一種基于貪心算法的樣本去重算法,該算法每次都在剩下的樣本中選取最大的樣本進(jìn)行去重,并記錄基本塊的地址,防止重復(fù)比較,與開源社區(qū)peach的MinSet相比,改善了它簡單遍歷基本塊的模式,減少了優(yōu)化時間。經(jīng)過上述處理,在達(dá)到同樣測試效果的前提下,樣本集中的樣本間將不會存在執(zhí)行路徑完全相同的兩個樣本,緩解了相同效果樣本的干擾,為后面樣本的異常概率統(tǒng)計(jì)提高了準(zhǔn)確度。
在基于變異的 Fuzzing測試中,測試樣本類型和變異偏移是 Fuzzing的兩個重要測試輸入?yún)?shù),也是影響測試效率的主要因素。合適的參數(shù)選取將會大大提高測試的效率,本節(jié)將敘述如何盡可能選取觸發(fā)異常概率大的測試樣本。
3.2.1 樣本類型選取算法 由于本文選取樣本類型和偏移兩種屬性來指導(dǎo)數(shù)據(jù)的變異,為了區(qū)分二者的順序,本文將樣本類型作為第一主要因素來指導(dǎo)測試文件的選取。根據(jù)已訓(xùn)練好的TGM模型,可以獲得異常觸發(fā)的概率分布情況,利用概率分布能快速地計(jì)算出文件類型的異常觸發(fā)概率,因而,模糊測試器依據(jù)此信息可選擇更合適的樣本進(jìn)行測試,樣本類型選取具體算法如表1所示。
模糊測試器根據(jù)上述算法選取合適的樣本類型進(jìn)行優(yōu)先測試,其下一步的任務(wù)是如何在選取的樣本上進(jìn)行變異,使得測試效果更好。
3.2.2 樣本偏移選取 對于測試的目標(biāo),無論是文件處理程序、協(xié)議或者其它的程序,都有著千差萬別的數(shù)據(jù)結(jié)構(gòu)類型。有些可能是一個“頭部+數(shù)據(jù)”的簡單格式,而大多數(shù)的格式卻更加復(fù)雜。本節(jié)要解決的主要問題是如何恰當(dāng)選取樣本偏移,既不破壞格式語義,又具備較佳測試效果。為了解決該問題,本文提出了基于快慢表的污點(diǎn)分析技術(shù),首先分析程序中函數(shù)的輸入偏移,然后根據(jù)得到的偏移對輸入樣本進(jìn)行變異,采用與文件類型選取相似的算法構(gòu)造測試數(shù)據(jù)。

表1 樣本類型選取算法
(1)基于快慢表的污點(diǎn)分析:污點(diǎn)分析是一種有效確認(rèn)變量間是否相關(guān)的方法,為了獲得樣本對于程序的影響情況,本文利用該技術(shù)對程序執(zhí)行進(jìn)行精確分析。其主要思想是將不受信任的輸入源標(biāo)記為污點(diǎn)(taint),然后跟蹤這類數(shù)據(jù)在程序中的執(zhí)行情況,并把與這些數(shù)據(jù)具有傳播關(guān)系的數(shù)據(jù)同樣標(biāo)記為污點(diǎn),最后進(jìn)行安全分析等需要的操作。根據(jù)該思想,研究人員開發(fā)了大量的污點(diǎn)分析工具,例如DTA++[16]與libdft[17]等現(xiàn)代污點(diǎn)分析工具,但是依然存在污點(diǎn)分析效率問題,尤其忽視了對污點(diǎn)分析關(guān)鍵模塊影子內(nèi)存[18]的優(yōu)化。
考慮到程序執(zhí)行時往往具備局部性原理,即在一段時間內(nèi),整個程序的執(zhí)行僅限于程序中的某一部分。相應(yīng)地,執(zhí)行所訪問的存儲空間也局限于某個內(nèi)存區(qū)域。為了提高效率,我們可利用頁式存儲結(jié)構(gòu)的思想來設(shè)計(jì)影子內(nèi)存。因此,本文在 libdft的基礎(chǔ)上,設(shè)計(jì)了基于快慢表影子內(nèi)存的細(xì)粒度污點(diǎn)分析方法,該方法以快慢表的結(jié)構(gòu)跟蹤每一個輸入字節(jié)的污點(diǎn)傳播過程,記錄任意被污染內(nèi)存的污點(diǎn)標(biāo)簽(輸入偏移),為偏移的選取提供可選依據(jù)。本文設(shè)計(jì)的基于快慢表的影子內(nèi)存包含兩個數(shù)據(jù)結(jié)構(gòu):污點(diǎn)位圖(快表)和污點(diǎn)源映射表(慢表)。污點(diǎn)位圖是一段靜態(tài)分配的內(nèi)存,其每一位對應(yīng)4 GB虛擬內(nèi)存中的每一字節(jié),標(biāo)識其是否被污染。因而采用移位操作可以迅速判斷某一內(nèi)存是否被污染。對于線性地址x處單字節(jié),判斷其是否被污染的公式為

式(5)中 BIT_MAP_SIZE 為污點(diǎn)位圖大小,IsTainted標(biāo)識該內(nèi)存是否被污染。污點(diǎn)位圖理論大小為4 GB/8=512 MB。但在實(shí)際測試中,將污點(diǎn)位圖設(shè)置為64 M,這樣會導(dǎo)致多個虛擬地址映射到位圖同一位的情況。但由于污點(diǎn)數(shù)據(jù)僅在寄存器和堆棧區(qū)域之間傳播,而堆棧區(qū)域僅占總內(nèi)存較小的比例,污點(diǎn)數(shù)據(jù)在位圖中由于更新而產(chǎn)生地址碰撞的可能性極小。此外,如果產(chǎn)生地址碰撞,可以查詢污點(diǎn)源映射表進(jìn)行二次確認(rèn)。污點(diǎn)源映射表是一張哈希表,用于維護(hù)污點(diǎn)單元(包括寄存器和內(nèi)存)地址和污點(diǎn)源之間的映射關(guān)系。實(shí)際實(shí)現(xiàn)時,只有通過位圖判斷存在某一內(nèi)存或寄存器存在污點(diǎn)數(shù)據(jù)處理時,才更新污點(diǎn)映射表,即添加一個地址項(xiàng)和對應(yīng)的輸入偏移的集合。由于程序執(zhí)行過程中訪問的污點(diǎn)內(nèi)存只占總內(nèi)存較小比例,因此可以通過污點(diǎn)位圖表快速定位某一內(nèi)存是否被污染,如果沒有被污染(絕大多數(shù)情況),則不必查詢污點(diǎn)源映射表,加快污點(diǎn)分析速度。
(2)偏移分析:設(shè)計(jì)完污點(diǎn)分析策略之后,為了確定偏移的范圍,需要對測試程序的執(zhí)行數(shù)據(jù)流處理的相關(guān)信息進(jìn)行記錄,以供后續(xù)模塊參考和使用。考慮到函數(shù)和指令是處理數(shù)據(jù)的主體,所以分別對指令和函數(shù)進(jìn)行記錄,然后分析它們與偏移位置的映射關(guān)系來確定偏移。
(a)指令記錄:在程序的執(zhí)行流中,函數(shù)間將包含許多指令,為了分析清楚輸入源和函數(shù)處理的關(guān)系,需要對輸入源在程序中的加載處和函數(shù)間的指令進(jìn)行記錄,然后在此基礎(chǔ)上對每條指令的源操作數(shù)和目的操作數(shù)進(jìn)行分析,獲取輸入源的處理偏移。現(xiàn)實(shí)中,程序執(zhí)行的指令規(guī)模十分巨大,為了減少記錄規(guī)模,本文采用只記錄跟污點(diǎn)相關(guān)的操作指令。對于每一條污點(diǎn)處理指令,污點(diǎn)來源記錄方式如下所示:

該記錄所表示的含義為:0x5adc4324指令處理的污點(diǎn)來源為偏移0x7處的連續(xù)4個字節(jié),表示為taintsrc(0x 5 a dc4 324)= {0x 7 ,0x 8 ,0x 9 ,0x a }。
因此,通過上述的指令記錄方式,可以很快地找尋到程序中某個函數(shù)處理的輸入來源于樣本的哪些字節(jié),即這些字節(jié)在樣本中所處的偏移。
(b)函數(shù)記錄:函數(shù)記錄用于記錄程序內(nèi)部某一子函數(shù)的污染數(shù)據(jù)來源,給 Fuzzing器提供變異偏移的可選方式。由于測試程序中的函數(shù)會頻繁地調(diào)用系統(tǒng)庫函數(shù),因此,該類型函數(shù)的調(diào)用需要特殊處理。本文主要采用函數(shù)摘要的方式對庫函數(shù)的污點(diǎn)傳播進(jìn)行封裝,減少頻繁在庫函數(shù)內(nèi)部的跟蹤次數(shù)。在提高效率的同時,記錄特定庫函數(shù)的污染來源。
(3)偏移選取算法:通過污點(diǎn)跟蹤和偏移的分析,可以得到輸入源一系列的文件偏移。測試時,可以根據(jù)實(shí)際的情況,適當(dāng)選取偏移,然后讓測試器依次變異這些偏移。對于不同的文件,其偏移的適應(yīng)度各有差異,偏移選取算法正是為了指導(dǎo)測試器選取最優(yōu)的偏移進(jìn)行測試。對于給定的樣本文件si,其偏移集合為 R = {r1, r2,… ,rm|m > 0 且 m ∈ N},根據(jù)TGM模型,統(tǒng)計(jì)每個偏移r在測試過程中觸發(fā)異常的概率大小,根據(jù)概率的大小選取下一次測試變異的偏移。具體實(shí)現(xiàn)類似于樣本類型選取算法,此處不再贅述。
為驗(yàn)證方法的有效性和正確性,本文構(gòu)建了實(shí)驗(yàn)環(huán)境,并開發(fā)了基于異常分布導(dǎo)向的智能Fuzzing原型工具 CombFuzz,選取真實(shí)的測試用例進(jìn)行分析與驗(yàn)證。
為了驗(yàn)證本文方法對已有安全異常的檢測能力,我們選用了 Begbunch提供的測試用例作為測試對象,并與zzuf, Fuzzgrind和KLEE工具進(jìn)行了對比,實(shí)驗(yàn)數(shù)據(jù)如表2所示。
經(jīng)實(shí)驗(yàn)測試,本文提出的基于異常分布的智能Fuzzing方法能正確發(fā)現(xiàn)Begbunch測試集中的67個安全脆弱點(diǎn),并沒有產(chǎn)生誤報,同時可以覆蓋176532個基本塊。對比其它3個工具,CombFuzz在脆弱點(diǎn)檢測的正確性方面,明顯強(qiáng)于 zzuf,基本能達(dá)到以Fuzzgrind和KLEE為代表的精細(xì)化測試工具的異常檢測水平。同時,在代碼覆蓋方面,CombFuzz能比zzuf多覆蓋50000多個基本塊,但是卻比Fuzzgrind和KLEE覆蓋的基本塊少。分析上述原因,zzuf是傳統(tǒng)的Fuzzing技術(shù),它忽視了程序執(zhí)行信息對測試的反饋能力。Fuzzgrind是一種典型的基于動態(tài)符號執(zhí)行的智能測試技術(shù),但它的符號執(zhí)行設(shè)計(jì)較為簡單,實(shí)際執(zhí)行過程中,對于復(fù)雜的程序,無法有效生成能覆蓋預(yù)期目標(biāo)的用例,導(dǎo)致其無法發(fā)現(xiàn)更多的異常。KLEE相較于Fuzzgrind有較大的提升,但由于符號執(zhí)行技術(shù)固有的缺陷,它依然無法擺脫需要大量計(jì)算資源的現(xiàn)實(shí)要求,對于大型應(yīng)用程序的測試仍較為勉強(qiáng)。總的來說,CombFuzz原型工具在對已有安全異常的檢測能力和代碼覆蓋能力都有較好表現(xiàn)。

表2 多個工具對比測試結(jié)果
該實(shí)驗(yàn)選用了暴風(fēng)影音5,WPS office 2013和SumatraPDF作為安全測試對象,同時,利用微軟SDL實(shí)驗(yàn)室的MiniFuzz和開源工具Pingrind分別對上述3個軟件進(jìn)行測試,然后對三者的測試結(jié)果進(jìn)行比較,表3為三者測試的結(jié)果。

表3 CombFuzz, MiniFuzz和Pingrind測試發(fā)現(xiàn)缺陷數(shù)
從表3可以看出,在給定相同的時間下,本方法相比MiniFuzz的Fuzzing技術(shù),異常發(fā)現(xiàn)效率平均提高近18倍,并且對于SumatraPDF的測試,CombFuzz發(fā)掘了 MiniFuzz無法發(fā)現(xiàn)的異常,而Pingrind基本無法找出程序缺陷。對于Pingrind工具,其測試思想與 Fuzzgrind相同,因此,對于大型應(yīng)用程序進(jìn)行測試時,為了順利進(jìn)行,需對約束進(jìn)行一定的限制,本文將約束設(shè)置為500和1000分別進(jìn)行了測試,但都沒測試到有效缺陷,可見對于大型應(yīng)用程序,在有限的測試資源下,基于符號執(zhí)行的Fuzzing技術(shù)作用有限;對于MiniFuzz,它是一款用于簡化模糊測試部署的模糊測試工具,其中心思想是構(gòu)造豐富的測試數(shù)據(jù)對程序進(jìn)行測試,它關(guān)注隨機(jī)化數(shù)據(jù)的樣式,卻沒有分析數(shù)據(jù)和程序本身的相關(guān)性,更缺乏對已有測試數(shù)據(jù)的反饋學(xué)習(xí)。同時,為了驗(yàn)證本文方法發(fā)掘異常的危害程度,我們通過MSEC和人工驗(yàn)證,發(fā)現(xiàn)CombFuzz挖掘出了7個未公開的“可利用”脆弱點(diǎn),高達(dá)16個“可能可利用”和“可能不可利用”脆弱點(diǎn)。
另一方面,在利用傳統(tǒng)的 Fuzzing方法進(jìn)行程序,由于樣本文件、偏移變異范圍選取不夠合適,容易發(fā)生長時間無法發(fā)現(xiàn)異常的情況,無法判斷測試終止條件,影響測試效率。為了驗(yàn)證本文方法對該缺陷的改進(jìn),我們對異常發(fā)現(xiàn)的時間進(jìn)行了記錄,圖3是利用CombFuzz工具對WPS office 2013、暴風(fēng)影音5和SumatraPDF測試產(chǎn)生異常的數(shù)量隨時間的分布情況。

圖3 異常隨時間分布情況
從圖3可以看出,除了對暴風(fēng)影音5的測試結(jié)果,其它兩個結(jié)果都表明CombFuzz能較長時間地發(fā)現(xiàn)程序的異常,并且,它也能以較短的時間使得異常發(fā)現(xiàn)的速度達(dá)到最大值。同時,從圖3可以發(fā)現(xiàn),在后面的測試時間段里,發(fā)現(xiàn)異常的數(shù)量明顯減少,主要可能的因素:一是本文原型工具在測試策略中,采用隨機(jī)變異的方式存在一定的局限;二是在偏移選取中,不是對每個基本塊或函數(shù)采取定制的變異范圍,而是為方便概率統(tǒng)計(jì)和實(shí)現(xiàn),每次變異都采用了同等長度,犧牲了精度;三是沒有對程序路徑進(jìn)行分析,無法反饋執(zhí)行信息,更新偏移范圍。
從軟件安全測試的角度來看,利用已發(fā)現(xiàn)的異常觸發(fā)概率分布,以盡量覆蓋更多的基本塊,有針對性地構(gòu)造測試用例,并優(yōu)先測試異常概率高的樣本,可以顯著提高軟件測試的效率。本文提出了TGM樣本構(gòu)造模型,設(shè)計(jì)并實(shí)現(xiàn)了基于該模型的異常分布導(dǎo)向智能 Fuzzing測試器,首先通過隨機(jī)收集測試對象程序的樣本集,然后,利用樣本去重算法去除冗余測試樣本,最終,在基于 TGM模型的樣本文件類型選取算法和偏移選取算法的支持下,指導(dǎo)測試器優(yōu)先測試異常概率高的樣本。從理論分析和實(shí)驗(yàn)數(shù)據(jù)看,本文給出的基于異常分布導(dǎo)向的智能 Fuzzing方法,相對微軟 SDL實(shí)驗(yàn)室的MiniFuzz 模糊測試器具有更高的異常發(fā)現(xiàn)效率,并在幾款具有代表性的常用應(yīng)用軟件中發(fā)現(xiàn)了未公開的脆弱點(diǎn),有效驗(yàn)證了本文方法的正確性。但依然存在一些問題,如對于已經(jīng)發(fā)現(xiàn)的異常,沒有對其產(chǎn)生機(jī)理進(jìn)行詳細(xì)分析,若產(chǎn)生缺陷的代碼具有相關(guān)性,能對TGM模型進(jìn)行如何改進(jìn)等,還需要在接下來的工作中進(jìn)一步研究。
[1] Sutton M, Greene A, and Amini P. Fuzzing: Brute Force Vulnerability Discovery[M]. New Jersey: Pearson Education,2007.
[2] Hocevar S. zzuf multi-purpose fuzzer[OL]. http://caca.zoy. org/wiki/zzuf, 2013.
[3] Microsoft SDL. MiniFuzz tool[OL]. http://technet.microsoft.com/en-us/edge/minifuzz-overview-and-demo.aspx, 2013.3.
[4] DeMott J, Enbody R, and Punch W F. Revolutionizing the field of grey-box attack surface testing with evolutionary fuzzing[OL]. https://www.blackhat.com/html/bh-mediaarchives/bh-archives-2007.html, 2007.
[5] Michael Eddington, Peach[OL]. http://peachfuzzer.com.2013.10.
[6] Ruijters E. [Master dissertation], Model-checking Markov chains using interval arithmetic[D]. [Master dissertalion],Maastricht University, 2013.
[7] 孫浩, 李會朋, 曾慶凱. 基于信息流的整數(shù)漏洞插裝和驗(yàn)證[J].軟件學(xué)報, 2013, 24(12): 2767-2781.Sun Hao, Li Hui-peng, and Zeng Qing-kai. Statically detect and run-time check integer-based vulnerabilities with information flow[J]. Journal of Software, 2013, 24(12):2767-2781.
[8] 崔寶江, 梁曉兵, 王禹, 等. 基于回溯與引導(dǎo)的關(guān)鍵代碼區(qū)域覆蓋的二進(jìn)制程序測試技術(shù)研究[J]. 電子與信息學(xué)報, 2012,34(1): 108-114.Cui Bao-jiang, Liang Xiao-bing, Wang Yu. The study of binary program test techniques based on backtracking and leading for covering key code area[J]. Journal of Electronics &Information Technology, 2012, 34(1): 108-114.
[9] Godefroid P, Levin M Y, and Molnar D. Sage: whitebox fuzzing for security testing[J]. Queue, 2012, 10(1): 20.
[10] Molnar D A and Wagner D. Catchconv: symbolic execution and run-time type inference for integer conversion errors[R].EECS Department, University of California, Berkeley,Technical Report No. UCB/EECS-2007-23, 2007.
[11] Balakrishnan G, Gruian R, and Reps T. CodeSurfer/x86 a platform for analyzing x86 executables[C]. Compiler Construction. Springer Berlin Heidelberg, 2005: 250-254.
[12] Wang T, Wei T, Gu G, et al.. TaintScope. a checksum-aware directed fuzzing tool for automatic software vulnerability detection[C]. 2010 IEEE Symposium on Security and Privacy(SP), Oakland, USA, 2010: 497-512.
[13] Haller I, Slowinska A, Neugschwandtner M, et al.. Dowsing for overflows: a guided fuzzer to find buffer boundary violations[C]. Proceedings of the 22nd USENIX conference on Security, Washington D.C, 2013: 49-64.
[14] Arcuri A, Iqbal M Z, and Briand L. Random testing:theoretical results and practical implications[J]. IEEE Transactions on Software Engineering, 2012, 38(2): 258-277.[15] Cifuentes C, Hoermann C, and Keynes N. BegBunch:benchmarking for C bug detection tools[C]. Proceedings of the 2nd International Workshop on Defects in Large Software Systems: Held in conjunction with the ACM SIGSOFT International Symposium on Software Testing and Analysis(ISSTA 2009), Chicago, 2009: 16-20.
[16] Kang M G, McCamant S, and Poosankam P. DTA++:Dynamic taint analysis with targeted control-flow propagation[R]. Proceedings of the 18th Annual Network and Distributed System Security Symposium, San Diego, 2011: 2.[17] Kemerlis V P, Portokalidis G, and Jee K. libdft: practical dynamic data flow tracking for commodity systems[C].Proceedings of the 8th ACM SIGPLAN/SIGOPS International Conference on Virtual Execution Environments(VEE), London, UK, 2012: 121-132.
[18] Min J W, Choi Y H, and Eom J H. Explicit Untainting to Reduce Shadow Memory Usage and Access Frequency in Taint Analysis[M]. Ho Chi Minh City: Springer Berlin Heidelberg, 2013: 175-186.