李明磊,陸余良,黃 暉,朱凱龍
(國(guó)防科技大學(xué)電子對(duì)抗學(xué)院,合肥 230037)
隨著社會(huì)信息化程度的不斷提高,網(wǎng)絡(luò)空間安全成為國(guó)家安全的重中之重。在威脅網(wǎng)絡(luò)空間安全的眾多因素中,漏洞是最根本的原因。模糊測(cè)試技術(shù)是目前最有效的漏洞檢測(cè)技術(shù)之一,其為被測(cè)程序提供多種輸入并監(jiān)測(cè)被測(cè)程序的多種異常行為,如堆棧或緩沖區(qū)溢出、內(nèi)存泄漏等[1-2]。安全人員通過對(duì)程序異常行為進(jìn)行分析,從而實(shí)現(xiàn)對(duì)軟件漏洞位置定位。
1988 年,MILLER 等人提出模糊測(cè)試的概念[3],經(jīng)過三十多年的發(fā)展,已經(jīng)形成包括白盒模糊測(cè)試、灰盒模糊測(cè)試、黑盒模糊測(cè)試在內(nèi)的三類模糊測(cè)試技術(shù)。白盒模糊測(cè)試技術(shù)基于程序源代碼進(jìn)行分析,能夠根據(jù)程序源碼提供更具有針對(duì)性的測(cè)試用例,但對(duì)程序的分析會(huì)引入大量的額外開銷[4]。與白盒測(cè)試相反,黑盒測(cè)試不對(duì)被測(cè)程序進(jìn)行分析,而是僅提供持續(xù)不斷的輸入并對(duì)程序運(yùn)行結(jié)果進(jìn)行收集。這使得黑盒測(cè)試具有較好的時(shí)間效率,能夠在短時(shí)間內(nèi)覆蓋程序的大量路徑,但不具有針對(duì)性的測(cè)試用例也使得黑盒測(cè)試難以覆蓋程序深處的路徑?;液心:郎y(cè)試是一種結(jié)合黑盒與白盒測(cè)試特點(diǎn)的測(cè)試方法,模糊測(cè)試器在提供給程序大量測(cè)試用例的同時(shí)通過輕量級(jí)程序分析工具對(duì)程序運(yùn)行狀態(tài)進(jìn)行分析,并根據(jù)分析結(jié)果對(duì)測(cè)試用例進(jìn)行修改?;液心:郎y(cè)試能夠在保持黑盒模糊測(cè)試高效、擴(kuò)展性好的基礎(chǔ)上獲得對(duì)程序關(guān)鍵結(jié)構(gòu)信息分析的能力,使模糊測(cè)試技術(shù)更加智能[5]。
近年來,研究人員將污點(diǎn)分析[6]、符號(hào)執(zhí)行[7]以及靜態(tài)分析[8]等技術(shù)與灰盒模糊測(cè)試技術(shù)相結(jié)合,使得灰盒模糊測(cè)試技術(shù)在路徑覆蓋率、時(shí)間效率以及路徑覆蓋深度等方面取得突破。文獻(xiàn)[9]開發(fā)的模糊測(cè)試器TaintScope 使用了符號(hào)執(zhí)行與污點(diǎn)分析技術(shù),自動(dòng)標(biāo)記輸入中的校驗(yàn)和字段并求解出可以通過程序校驗(yàn)和檢測(cè)的測(cè)試用例。文獻(xiàn)[10]開發(fā)的模糊測(cè)試器Dowser 使用污點(diǎn)分析技術(shù)計(jì)算種子文件各比特位之間的突變比例,提高種子文件變異效率。文獻(xiàn)[11]開發(fā)的模糊測(cè)試器BORG 使用靜態(tài)分析技術(shù)得到程序的控制流程圖,并利用該程序流程圖使用符號(hào)執(zhí)行技術(shù)生成可以到達(dá)程序高危漏洞的測(cè)試用例。文獻(xiàn)[12]開發(fā)的模糊測(cè)試器AflFast 使用馬爾科夫鏈模型對(duì)程序路徑狀態(tài)轉(zhuǎn)換概率進(jìn)行建模,根據(jù)概率模型選擇覆蓋低概率路徑的種子進(jìn)行變異,以提高新路徑的發(fā)現(xiàn)速度。文獻(xiàn)[13]開發(fā)的模糊測(cè)試器Skyfire 使用概率上下文相關(guān)語法從大量現(xiàn)有樣本中生成高質(zhì)量樣本。文獻(xiàn)[14]開發(fā)的模糊測(cè)試器VUzzer 使用了靜態(tài)分析與動(dòng)態(tài)污點(diǎn)分析技術(shù),計(jì)算每個(gè)種子的適應(yīng)度來提高模糊測(cè)試器路徑覆蓋的深度。
隨著程序規(guī)模的不斷增長(zhǎng),為提高模糊測(cè)試的效率,在進(jìn)行模糊測(cè)試前,研究人員通常會(huì)對(duì)目標(biāo)程序進(jìn)行脆弱性分析等工作,選定程序中存在潛在問題的區(qū)域作為目標(biāo)區(qū)域進(jìn)行測(cè)試,如程序的補(bǔ)丁區(qū)域。但上述的模糊測(cè)試器是面向整個(gè)程序進(jìn)行測(cè)試,被用于補(bǔ)丁測(cè)試、高危區(qū)域測(cè)試時(shí)缺乏導(dǎo)向性,會(huì)將大量時(shí)間和系統(tǒng)資源浪費(fèi)在程序的無關(guān)區(qū)域。因此,文獻(xiàn)[15]提出導(dǎo)向式灰盒模糊測(cè)試技術(shù),導(dǎo)向式灰盒模糊測(cè)試技術(shù)能夠快速生成到達(dá)程序目標(biāo)區(qū)域的測(cè)試用例并發(fā)現(xiàn)漏洞[16],其不需要重量級(jí)的符號(hào)執(zhí)行、程序分析和約束求解技術(shù),而是先通過靜態(tài)分析計(jì)算出程序各基本塊到目標(biāo)區(qū)域的距離,并通過插樁的方式將距離信息插入到目標(biāo)程序中,在測(cè)試階段根據(jù)插樁信息計(jì)算每個(gè)種子距離目標(biāo)區(qū)域的距離,使用啟發(fā)式算法提升距離目標(biāo)區(qū)域近的種子生成測(cè)試用例的數(shù)量,保證了測(cè)試的高效性與導(dǎo)向性[17]。
本文對(duì)現(xiàn)有的導(dǎo)向式灰盒模糊測(cè)試方法進(jìn)行分析,提出一種距離與權(quán)重相結(jié)合的導(dǎo)向式灰盒模糊測(cè)試方法,通過改進(jìn)距離計(jì)算方法提高導(dǎo)向式灰盒模糊測(cè)試的準(zhǔn)確性。
本文以文獻(xiàn)[15]開發(fā)的導(dǎo)向式灰盒模糊測(cè)試器Aflgo 為例,對(duì)導(dǎo)向式灰盒模糊測(cè)試的基本工作流程進(jìn)行介紹。導(dǎo)向式灰盒模糊測(cè)試器由靜態(tài)分析與灰盒測(cè)試兩部分組成,靜態(tài)分析部分僅在模糊測(cè)試開始前運(yùn)行一次,整體架構(gòu)如圖1 所示。
圖1 導(dǎo)向式模糊測(cè)試技術(shù)框架Fig.1 Framework of guided fuzzing test technology
導(dǎo)向式灰盒模糊測(cè)試流程如下:
1)在靜態(tài)分析階段,對(duì)目標(biāo)程序進(jìn)行靜態(tài)分析得到目標(biāo)程序的函數(shù)調(diào)用流程圖和程序控制流程圖。
2)計(jì)算出程序每一個(gè)基本塊到目標(biāo)區(qū)域的距離并通過插樁的方式將距離信息插入到程序中。
3)模糊測(cè)試階段,從種子集中選擇一個(gè)種子進(jìn)行測(cè)試,收集該種子執(zhí)行軌跡并計(jì)算種子與目標(biāo)區(qū)域的距離。
4)根據(jù)種子到目標(biāo)區(qū)域的距離動(dòng)態(tài)調(diào)控種子的能量,即種子變異產(chǎn)生的測(cè)試用例的數(shù)量。
5)如果變異生成的測(cè)試用例覆蓋到程序新的路徑,就將此測(cè)試用例加入種子集。
重復(fù)操作流程3)~流程5),當(dāng)種子集中種子都被選擇過一遍時(shí)為一輪,一輪測(cè)試后從種子集第一個(gè)種子開始新一輪測(cè)試直到時(shí)間結(jié)束。
Aflgo 通過與Afl 及導(dǎo)向式符號(hào)執(zhí)行工具KATCH[16]進(jìn)行對(duì)比實(shí)驗(yàn),證明了其導(dǎo)向的有效性,但依然存在以下3 個(gè)問題:
1)距離計(jì)算粒度粗糙,沒有仔細(xì)區(qū)分函數(shù)與基本塊對(duì)種子距離的影響,而是簡(jiǎn)單地認(rèn)為函數(shù)距離是基本塊距離的常數(shù)倍。
2)沒有對(duì)程序不同位置的基本塊進(jìn)行區(qū)分,認(rèn)為程序中基本塊的權(quán)重是相同的,降低了距離計(jì)算的精度。
3)種子能量調(diào)控策略以程序運(yùn)行時(shí)間作為調(diào)控指標(biāo)不夠準(zhǔn)確。程序受運(yùn)行環(huán)境影響較大,同一個(gè)程序在不同運(yùn)行環(huán)境下運(yùn)行相同的時(shí)間運(yùn)行狀態(tài)有很大的差別。
為解決上述問題,本文提出一種更加精確有效的距離計(jì)算與能量調(diào)控方法,對(duì)圖1 中的基本塊距離計(jì)算與種子能量計(jì)算進(jìn)行改進(jìn),以提高導(dǎo)向式模糊測(cè)試器的導(dǎo)向性。
實(shí)現(xiàn)導(dǎo)向式灰盒模糊測(cè)試導(dǎo)向性的關(guān)鍵在于計(jì)算種子到目標(biāo)區(qū)域的距離。通過上文的分析可以看出,目前限制距離計(jì)算準(zhǔn)確性的主要原因有兩點(diǎn):1)如何計(jì)算不同函數(shù)、不同基本塊對(duì)種子到目標(biāo)區(qū)域距離的影響;2)如何用統(tǒng)一的量綱表示程序中函數(shù)和基本塊到目標(biāo)區(qū)域的距離。本文通過對(duì)導(dǎo)向式灰盒模糊測(cè)試中的距離與能量計(jì)算方法進(jìn)行改進(jìn),將不同函數(shù)與基本塊的差異考慮到距離計(jì)算當(dāng)中,統(tǒng)一函數(shù)與基本塊的距離計(jì)算標(biāo)準(zhǔn),設(shè)計(jì)合理的種子能量調(diào)控策略。
為提高距離計(jì)算的準(zhǔn)確性與合理性,本文將距離計(jì)算與能量調(diào)控分為函數(shù)路徑長(zhǎng)度(Pf)計(jì)算、基本塊距離計(jì)算、種子距離與能量計(jì)算3 個(gè)部分。3 個(gè)部分為遞進(jìn)關(guān)系,計(jì)算過程如圖2 所示。函數(shù)路徑長(zhǎng)度表示不同函數(shù)參與距離計(jì)算時(shí)貢獻(xiàn)的距離,基本塊距離指程序中基本塊到目標(biāo)區(qū)域的距離,種子距離指進(jìn)行模糊測(cè)試過程中種子執(zhí)行軌跡到目標(biāo)區(qū)域的距離,本文中目標(biāo)區(qū)域由若干同屬一個(gè)函數(shù)的基本塊構(gòu)成。
圖2 距離計(jì)算示意圖Fig.2 Schematic diagram of distance calculation
在靜態(tài)分析階段完成程序函數(shù)路徑長(zhǎng)度計(jì)算與基本塊距離計(jì)算并將基本塊距離插樁到程序中。在模糊測(cè)試階段,模糊測(cè)試器記錄種子覆蓋到的基本塊信息,并根據(jù)基本塊信息計(jì)算種子距離與能量。
在計(jì)算函數(shù)路徑長(zhǎng)度(Pf)前引入基本塊權(quán)重(Wb)概念以提高距離計(jì)算的合理性?;緣K權(quán)重表示基本塊在程序路徑中的重要程度,以區(qū)分不同基本塊對(duì)距離計(jì)算的影響。根據(jù)Wb得到函數(shù)內(nèi)部基本塊間路徑距離計(jì)算公式L(i,j),路徑距離指兩點(diǎn)間最短的一條路徑的長(zhǎng)度。根據(jù)本文的方法利用L(i,j)計(jì)算程序中每一個(gè)函數(shù)的函數(shù)路徑長(zhǎng)度,L(i,j)由基本塊間的距離而來,因此函數(shù)路徑長(zhǎng)度的量綱與基本塊距離的量綱是統(tǒng)一的。
得到程序函數(shù)路徑長(zhǎng)度后,根據(jù)公式L(i,j)與函數(shù)調(diào)用圖可以得到程序任意基本塊到目標(biāo)區(qū)域的距離。程序基本塊距離計(jì)算較為復(fù)雜,因此將基本塊分為四類進(jìn)行計(jì)算,將計(jì)算得到的基本塊距離插樁到目標(biāo)程序中。得到包含插樁信息的程序后,根據(jù)模糊測(cè)試時(shí)種子覆蓋到的基本塊中包含的基本塊距離信息計(jì)算種子距離并歸一化處理。為了更加合理地對(duì)種子能量進(jìn)行調(diào)度,根據(jù)種子執(zhí)行輪次對(duì)種子能量進(jìn)行修正。
導(dǎo)向式灰盒模糊測(cè)試是為了在有限的時(shí)間里盡可能多地發(fā)現(xiàn)覆蓋目標(biāo)區(qū)域的路徑。傳統(tǒng)的距離計(jì)算方法沒有對(duì)處于程序路徑不同位置的基本塊進(jìn)行區(qū)分。以圖3 所示的程序路徑為例,傳統(tǒng)的計(jì)算方法[15]認(rèn)為基本塊D和基本塊B到達(dá)目標(biāo)區(qū)域G的距離相同。但從路徑圖可以看出,經(jīng)過基本塊B到目標(biāo)區(qū)域G有兩條路徑,而經(jīng)過D到目標(biāo)區(qū)域G的路徑僅有一條,經(jīng)過基本塊B比經(jīng)過基本塊D更容易到達(dá)目標(biāo)區(qū)域。傳統(tǒng)的計(jì)算方式不能體現(xiàn)出不同位置基本塊的區(qū)別,降低了導(dǎo)向的精度和速度。為提高距離計(jì)算的準(zhǔn)確性,本文對(duì)傳統(tǒng)的計(jì)算方法進(jìn)行改進(jìn),給不同位置的基本塊賦予不同的權(quán)重,使得經(jīng)過B到目標(biāo)區(qū)域G的距離小于經(jīng)過D到G的距離。
圖3 程序路徑示意圖Fig.3 Schematic diagram of program path
通過對(duì)程序路徑的分析,一個(gè)基本塊的后繼基本塊越多,則經(jīng)過該基本塊的種子變異后覆蓋不同路徑的概率越高。因此,在距離計(jì)算中用基本塊出度(一個(gè)基本塊的后繼基本塊個(gè)數(shù))作為基本塊的權(quán)重,用符號(hào)Wb表示。
在引入基本塊權(quán)重后基本塊間的距離如圖4 所示。分別計(jì)算圖4 中A到G的路徑1{A,D,E,G}和路徑2{A、B、E、G}的長(zhǎng)度,得到路徑1 長(zhǎng)度為7/3,路徑2 長(zhǎng)度為11/6。在未將權(quán)重引入前,距離相同的兩條路徑在引入基本塊權(quán)重后距離產(chǎn)生差值,經(jīng)過權(quán)重高的基本塊的路徑距離更短,在變異時(shí)可以得到更多的變異機(jī)會(huì)。
圖4 加權(quán)路徑距離計(jì)算Fig.4 Distance calculation of weighted path
式(1)表示同屬一個(gè)函數(shù)的基本塊i與基本塊j之間的距離,如果從i到j(luò)有多條路徑則選擇其中最短的一條路徑計(jì)算,集合B表示該路徑覆蓋到的基本塊,i∈B,j?B。
以圖4 為例,A到G的路徑有4 條。選擇其中最短的一條利用式(1)計(jì)算,可得A到G的路徑距離L(A,G)=11/6。
在之前的距離導(dǎo)向啟發(fā)式計(jì)算規(guī)則中[15],不同函數(shù)在基本塊距離計(jì)算中貢獻(xiàn)的距離為相同的常數(shù)值,沒有考慮到不同函數(shù)對(duì)基本塊距離不同的影響,計(jì)算基本塊距離時(shí)會(huì)引起較大的誤差。為提高距離計(jì)算的精度,本文引入函數(shù)路徑長(zhǎng)度的概念,用函數(shù)包含的基本塊表示該函數(shù)在基本塊距離計(jì)算中貢獻(xiàn)的距離。函數(shù)路徑長(zhǎng)度指一條路徑穿過該函數(shù)實(shí)際經(jīng)過的距離,用函數(shù)入口基本塊到函數(shù)出口基本塊全部路徑的距離的平均值表示該長(zhǎng)度。
以圖5 為例,基本塊A為函數(shù)入口基本塊,基本塊G為函數(shù)出口基本塊。由A出發(fā)到G的路徑有4 條,分別為{A,D,E,G}、{A,B,E,G}、{A,B,G}和{A,C,G},長(zhǎng)度分別為7/3、11/6、5/6 和4/3,因此該函數(shù)路徑長(zhǎng)度為19/12,當(dāng)該函數(shù)參與到距離計(jì)算時(shí)貢獻(xiàn)的距離為19/12。
圖5 函數(shù)路徑長(zhǎng)度計(jì)算Fig.5 Length calculation of function path
依據(jù)3.1 節(jié)中得到的同屬一個(gè)函數(shù)的2 個(gè)基本塊間距離計(jì)算公式L(i,j)與函數(shù)路徑長(zhǎng)度(Pf)計(jì)算方法,計(jì)算程序基本塊到目標(biāo)區(qū)域距離。依據(jù)程序中基本塊與目標(biāo)區(qū)域的位置分為4 種情況討論,如圖6 所示。其中,方框表示函數(shù),圓圈表示基本塊,三角形表示目標(biāo)基本塊。
圖6 基本塊分類Fig.6 Classification of basic blocks
為便于計(jì)算與討論,首先引入符號(hào)H,H表示程序中包含目標(biāo)區(qū)域的函數(shù)從入口基本塊到目標(biāo)區(qū)域的距離。如圖6 中基本塊D到目標(biāo)區(qū)域的距離,利用式(2)可以求得該距離。集合Bt由該函數(shù)包含的目標(biāo)基本塊組成,b1st為入口基本塊。
4 種情況討論如下:
情況1當(dāng)基本塊為目標(biāo)基本塊時(shí),該基本塊到目標(biāo)區(qū)域的距離為0。
情況2當(dāng)基本塊與目標(biāo)區(qū)域?qū)儆谕缓瘮?shù)但不是目標(biāo)基本塊時(shí),如圖6 中的基本塊C。利用式(1)分別計(jì)算基本塊C到每個(gè)目標(biāo)基本塊的距離后,求調(diào)和平均值作為基本塊C到目標(biāo)區(qū)域的距離。
情況3當(dāng)基本塊與目標(biāo)區(qū)域?qū)儆诓煌瘮?shù)但可以直接通過函數(shù)調(diào)用到達(dá)目標(biāo)區(qū)域所在函數(shù)時(shí),如圖6 中基本塊A。用基本塊A調(diào)用的系列函數(shù)的函數(shù)路徑長(zhǎng)度的倒數(shù)和加上H作為基本塊A到目標(biāo)區(qū)域的距離,即圖6 中函數(shù)F2與F3的函數(shù)路徑長(zhǎng)度的倒數(shù)和與函數(shù)F4的H之和,如果有多條調(diào)用路徑則取平均值作為該基本塊的基本塊距離。
情況4當(dāng)基本塊與目標(biāo)區(qū)域?qū)儆诓煌瘮?shù)且可以通過同屬一個(gè)函數(shù)內(nèi)的其他基本塊到達(dá)目標(biāo)區(qū)域所在函數(shù)時(shí),如圖6 中基本塊B通過基本塊A可以到達(dá)包含目標(biāo)區(qū)域的函數(shù)F4。計(jì)算出基本塊A到目標(biāo)區(qū)域的距離,在用該距離加上基本塊A到基本塊B的距離,作為基本塊B到目標(biāo)區(qū)域的距離。
式(3)為基本塊距離計(jì)算公式,集合Tb由目標(biāo)基本塊組成,集合Ta由與目標(biāo)基本塊同屬一個(gè)函數(shù)的基本塊組成,集合Tf由可以直接到達(dá)包含目標(biāo)區(qū)域的函數(shù)的基本塊組成,集合Tj由可以通過Tf中的元素到達(dá)包含目標(biāo)區(qū)域的函數(shù)的基本塊組成。集合Fi由基本塊i到包含目標(biāo)區(qū)域的函數(shù)所需要調(diào)用的函數(shù)組成,Num(Fi)表示集合Fi中元素的數(shù)量,Pf表示函數(shù)f的函數(shù)路徑長(zhǎng)度。
在靜態(tài)分析階段利用式(3)完成對(duì)基本塊距離的計(jì)算,計(jì)算過程如算法1 所示。
算法1基本塊距離計(jì)算算法
對(duì)算法1 的代價(jià)進(jìn)行分析,假設(shè)程序有m個(gè)函數(shù)和n個(gè)基本塊,符號(hào)Ki表示函數(shù)i包含的基本塊數(shù)量。對(duì)算法中第一個(gè)雙層循環(huán)進(jìn)行分析(算法第1行~第6 行),由函數(shù)路徑長(zhǎng)度計(jì)算方法可知,Calculate_Pf(function)相當(dāng)于對(duì)函數(shù)function 包含的基本塊進(jìn)行一次遍歷,代價(jià)為O(kfunction),而第二層循環(huán)(算法第2 行~第5 行)代價(jià)也為O(kfunction),所以算法1 中第一個(gè)雙層循環(huán)總執(zhí)行次數(shù)相當(dāng)于程序中每個(gè)函數(shù)包含的基本塊數(shù)量之和的兩倍,故代價(jià)為O(n)。對(duì)算法1 第二個(gè)雙層循環(huán)(第9 行~第11 行)進(jìn)行分析,由式(3)可知Calculate(BB)的代價(jià)為O(m),故第二個(gè)雙層循環(huán)的代價(jià)為O(m×n)。取兩個(gè)雙層循環(huán)代價(jià)之和作為算法1 的總代價(jià),總代價(jià)為O((m+1)×n)。多數(shù)應(yīng)用程序中基本塊數(shù)量遠(yuǎn)遠(yuǎn)大于函數(shù)數(shù)量,m+1 可以看為常數(shù)項(xiàng),所以距離計(jì)算花費(fèi)的代價(jià)為O(n)。
在3.2 節(jié)中得到了程序中任意基本塊到目標(biāo)區(qū)域的距離計(jì)算公式。在對(duì)程序靜態(tài)分析時(shí)利用公式計(jì)算出每一個(gè)基本塊到目標(biāo)區(qū)域的距離并插樁到程序中。在模糊測(cè)試時(shí)追蹤每個(gè)種子執(zhí)行的軌跡,根據(jù)種子執(zhí)行到的基本塊計(jì)算該種子到目標(biāo)區(qū)域的距離,如式(4)所示:
其中,集合Q由種子s覆蓋的基本塊構(gòu)成,Num(Q)表示集合Q內(nèi)元素的數(shù)量。
對(duì)種子距離進(jìn)行歸一化得到式(5),集合S由模糊測(cè)試器使用的種子構(gòu)成:
在模糊測(cè)試中種子能量是用來調(diào)控一個(gè)種子變異次數(shù)的重要變量,如果一個(gè)種子與模糊測(cè)試器的測(cè)試策略契合度越高,那么該種子得到的能量也越高,在種子進(jìn)行變異時(shí)模糊測(cè)試器會(huì)根據(jù)種子的能量對(duì)種子進(jìn)行變異操作,種子能量越高變異生成的測(cè)試用例越多。
為避免種子在模糊測(cè)試一開始就收斂到某一條路徑上,將模糊測(cè)試執(zhí)行的輪次t作為調(diào)節(jié)種子能量的因子。使得模糊測(cè)試在初始的幾輪測(cè)試中能夠探索足夠多的路徑,避免模糊測(cè)試路徑過度集中。將Afl 能量計(jì)算方法[18]與式(7)結(jié)合可以得到種子能量計(jì)算公式:
其中,A(s)表示在Afl 能量計(jì)算中種子s的能量。
當(dāng)t趨近正無窮時(shí),E(s,Tb)=A(s)×(s,Tb);當(dāng)t=1 時(shí),E(s,Tb)=A(s)。當(dāng)模糊測(cè)試剛開始時(shí)種子的距離對(duì)能量計(jì)算不會(huì)產(chǎn)生影響,而隨著迭代次數(shù)的增加,種子距離對(duì)能量的影響逐漸增強(qiáng)。圖7 為不同迭代次數(shù)對(duì)種子能量變化的影響,可以看到當(dāng)種子距離一定時(shí),隨著迭代次數(shù)的增加,種子能量在初始的幾輪迭代中急劇變化后迅速趨于穩(wěn)定,這證明了迭代次數(shù)t僅在測(cè)試開始階段影響種子能量計(jì)算,隨著迭代次數(shù)的不斷增加,t對(duì)種子能量影響逐漸降低,種子距離在種子能量計(jì)算中起主導(dǎo)作用。
圖7 迭代次數(shù)對(duì)種子能量的影響Fig.7 Effect of iteration times on seed energy
為驗(yàn)證本文方法的有效性,基于Afl[18]設(shè)計(jì)實(shí)現(xiàn)了原型系統(tǒng)Afl-guide,并與Aflgo、Afl 進(jìn)行對(duì)比實(shí)驗(yàn)。Afl-guide 使用LLVM[19]對(duì)目標(biāo)程序進(jìn)行分析生成函數(shù)調(diào)用圖和函數(shù)控制流程圖,使用Python 腳本利用Networkx 包實(shí)現(xiàn)對(duì)函數(shù)調(diào)用圖和函數(shù)控制流程圖的解析并計(jì)算基本塊距離。擴(kuò)展Afl 的插樁模塊,將基本塊距離插樁到程序中。
本文結(jié)合Aflgo,選取libming 與GNU Binutils 作為測(cè)試程序。libming 是一款使用C 語言編寫的Flash(SWF)輸出庫(kù),可在C ++、PHP、Python、Ruby和Perl 中使用,擁有10 萬行的代碼,是被廣泛使用的開源項(xiàng)目。GNU Binutils 是GNU/Linux 平臺(tái)中使用的二進(jìn)制分析工具集,有著近100 萬行的代碼,被廣泛用于對(duì)模糊測(cè)試工具的測(cè)試中[20-21]。
實(shí)驗(yàn)選取libming 和GNU Binutils 中近年公開的CVE 作為導(dǎo)向目標(biāo),分別用3 個(gè)工具對(duì)目標(biāo)程序進(jìn)行實(shí)驗(yàn),每組實(shí)驗(yàn)重復(fù)5 次,持續(xù)24 h。實(shí)驗(yàn)結(jié)果如表1 和表2 所示,其中,Arrive 表示到達(dá)目標(biāo)點(diǎn)的次數(shù),TTE 表示第一次覆蓋到目標(biāo)站點(diǎn)花費(fèi)的時(shí)間,Improve 為改善因子,值為Afl-guide 的TTE 與Aflgo和Afl 的TTE 的商,表示相較于Afl 與Aflgo,Aflguide 的效率提升了多少。實(shí)驗(yàn)服務(wù)器設(shè)置為:AMD ryzen7 2700 處理器,64 GB 內(nèi)存,2 TB 固態(tài)硬盤,運(yùn)行Ubuntu 16.04(64 bit)操作系統(tǒng)。
表1 libming 目標(biāo)站點(diǎn)覆蓋Table 1 libming target site coverage
表2 GNU Binutils 目標(biāo)站點(diǎn)覆蓋Table 2 GNU Binutils target site coverage
在表1、表2 的數(shù)據(jù)中,除CVE-2016-4490 外,Afl-guide 與Aflgo 到達(dá)目標(biāo)區(qū)域的時(shí)間明顯小于Afl,證明了Afl-guide 與Aflgo 的導(dǎo)向性。在CVE-2016-4490 中,目標(biāo)站點(diǎn)在程序路徑的淺層容易被測(cè)試用例覆蓋,因此導(dǎo)向式模糊測(cè)試器在測(cè)試的過程中引入的資源消耗反而導(dǎo)致Afl-guide 與Aflgo 覆蓋目標(biāo)站點(diǎn)的速度慢于Afl。通過表1 和表2 中的數(shù)據(jù)還可以看出,利用本文方法實(shí)現(xiàn)的工具Afl-guide 在導(dǎo)向性上優(yōu)于Aflgo。在CVE-2018-7867 中提升最為顯著,Afl-guide 到達(dá)目標(biāo)點(diǎn)僅用了Aflgo 花費(fèi)時(shí)間的27.8%。實(shí)驗(yàn)結(jié)果表明,使用本文的方法可以快速生成覆蓋程序指定位置的測(cè)試用例,能夠大幅提高在已知程序脆弱區(qū)域、補(bǔ)丁檢測(cè)等情景下的模糊測(cè)試效率。
為進(jìn)一步說明在種子能量計(jì)算過程中引入種子迭代次數(shù)的對(duì)路徑收斂速度的影響。Aflgo 與Aflguide 路徑覆蓋率比對(duì)情況如表3、表4 所示。其中,Cov 表示第一次覆蓋到目標(biāo)區(qū)域時(shí)模糊測(cè)試器的路徑覆蓋率。AveC 表示Cov 與TTE 的比值,Better 值為Aflgo 的AveC 與Afl-guide 的AveC 的商,表示相較于Aflgo 的覆蓋率提升了多少。
表3 libming 路徑覆蓋率Table 3 libming path coverage
表4 GNU Binutils 路徑覆蓋率Table 4 GNU Binutils path coverage
從表3、表4 可以看出,Afl-guide 與Aflgo 在到達(dá)目標(biāo)位置時(shí)路徑覆蓋率基本一致,但考慮到所花費(fèi)的時(shí)間,單位時(shí)間內(nèi)Afl-guide 的路徑覆蓋要高于Aflgo。證明在種子能量計(jì)算中引入種子迭代次數(shù)達(dá)到了預(yù)期的目標(biāo),在測(cè)試初期快速探索路徑并隨著輪次的增加快速收斂到目標(biāo)區(qū)域。
本文對(duì)導(dǎo)向式灰盒模糊測(cè)試進(jìn)行研究,提出一種距離與權(quán)重相結(jié)合的導(dǎo)向式灰盒模糊測(cè)試方法。對(duì)距離計(jì)算方法進(jìn)行改進(jìn),提高了距離計(jì)算的精確性,增強(qiáng)模糊測(cè)試器的導(dǎo)向性。實(shí)驗(yàn)結(jié)果表明,該方法能夠有效提高模糊測(cè)試導(dǎo)向的效率以及對(duì)目標(biāo)區(qū)域覆蓋的概率。由于現(xiàn)在的靜態(tài)分析工具還無法有效識(shí)別程序中的間接調(diào)用,導(dǎo)致函數(shù)距離計(jì)算中存在一定的誤差,同時(shí)程序中存在校驗(yàn)和的情況使得種子無法覆蓋到目標(biāo)區(qū)域。下一步將對(duì)靜態(tài)分析方法進(jìn)行改進(jìn),以提高函數(shù)距離的精度,并將符號(hào)執(zhí)行與模糊測(cè)試相結(jié)合,使模糊測(cè)試可以對(duì)校驗(yàn)和程序進(jìn)行快速導(dǎo)向。