亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        結(jié)合混合符號執(zhí)行的導(dǎo)向式灰盒模糊測試技術(shù)

        2020-08-19 07:01:00陸余良朱凱龍
        計算機(jī)工程 2020年8期
        關(guān)鍵詞:程序

        戴 渭,陸余良,朱凱龍

        (國防科技大學(xué) 電子對抗學(xué)院,合肥 230037)

        0 概述

        模糊測試是一種重要的軟件漏洞分析技術(shù),其向程序提供大量的特殊或者隨機(jī)的測試用例,然后監(jiān)控程序運行過程中的異常情況,通過人工輔助分析異常測試用例數(shù)據(jù),從而定位軟件中的漏洞位置。模糊測試是一種簡單有效的強(qiáng)制性技術(shù),雖然測試存在盲目性,但是因為模糊測試具有良好的可伸縮性,所以它在應(yīng)對大型應(yīng)用程序時,相較于其他漏洞分析技術(shù)具有更高的效率和更低的開銷,隨著軟件的規(guī)模和復(fù)雜度不斷增大,模糊測試具有其他漏洞挖掘技術(shù)無法比擬的優(yōu)勢[1]。因此,模糊測試是漏洞分析技術(shù)在現(xiàn)實應(yīng)用中的主流,也是發(fā)現(xiàn)漏洞最多的技術(shù)。

        導(dǎo)向式灰盒模糊測試是指能夠快速達(dá)到程序目標(biāo)區(qū)域且發(fā)現(xiàn)漏洞的模糊測試技術(shù)。當(dāng)目標(biāo)只集中在程序中的某一部分時,普通的模糊測試會將大量時間浪費在不相關(guān)的區(qū)域,而無法集中在期望的區(qū)域,導(dǎo)向式模糊測試可以將大量的時間預(yù)算用于達(dá)到這些特定的目標(biāo)位置,以及對這些區(qū)域進(jìn)行更多、更集中的測試,從而更加高效地發(fā)現(xiàn)目標(biāo)區(qū)域的漏洞,并且減少不必要的開銷。文獻(xiàn)[2]提出的導(dǎo)向式灰盒模糊測試器AFLGO是在模糊測試框架AFL[3]的基礎(chǔ)上,通過前期對程序進(jìn)行靜態(tài)分析得到的控制流圖(Control Flow Graphs,CFGs)以及函數(shù)調(diào)用圖(Call Graph,CG)來計算每個基本塊到若干個目標(biāo)位置的距離,將目標(biāo)的可達(dá)性作為一種優(yōu)化,使用啟發(fā)式算法來提升距離更近的種子的能量,使其生成的測試用例能快速達(dá)到程序的目標(biāo)區(qū)域,從而實現(xiàn)了模糊測試的導(dǎo)向性。

        符號執(zhí)行作為一種重要的程序分析方法,可以為程序測試提供高覆蓋率的測試用例,以觸發(fā)深層的程序錯誤[4]。由于在符號執(zhí)行過程中,針對代碼執(zhí)行路徑會生成相應(yīng)路徑的約束條件,如果軟件較大或存在大量循環(huán)操作,可能導(dǎo)致路徑約束非常大,甚至呈現(xiàn)爆炸式增長[5]?;旌戏枅?zhí)行[6]是結(jié)合了符號執(zhí)行和具體執(zhí)行的一種動態(tài)符號執(zhí)行技術(shù),其主要思想是生成具體的輸入來執(zhí)行目標(biāo)程序,目標(biāo)是通過自動生成測試用例來盡量覆蓋程序中的可行路徑,進(jìn)而發(fā)現(xiàn)程序內(nèi)的缺陷[7]。在程序運行的過程中,收集路徑約束條件,按順序搜索程序路徑,利用約束求解器求解上一執(zhí)行中收集到的約束集,從而得到下一次執(zhí)行的測試用例;在下一次執(zhí)行結(jié)束后,按一定的策略選擇其中某一分支判斷點進(jìn)行約束取反,得到新的約束集,再用約束求解器對其進(jìn)行求解,得到下一執(zhí)行的測試用例。如此反復(fù),可以避免執(zhí)行重復(fù)路徑,從而以盡可能少的測試集達(dá)到高測試覆蓋的目的[4]。

        導(dǎo)向式符號執(zhí)行是利用符號執(zhí)行、程序分析和約束求解等重型技術(shù)來系統(tǒng)有效地搜索可行路徑的狀態(tài)空間[9]。一旦識別出能夠到達(dá)目標(biāo)的可行路徑,就生成滿足相應(yīng)路徑約束的測試用例。導(dǎo)向式符號執(zhí)行已被用于到達(dá)程序的高危區(qū)域,例如關(guān)鍵系統(tǒng)調(diào)用[9]、覆蓋補(bǔ)丁位置[10-11]以及崩潰再現(xiàn)[12]等。導(dǎo)向式符號執(zhí)行技術(shù)與導(dǎo)向式模糊測試技術(shù)相比,缺點很明顯,它需要重量級的程序分析和約束求解,要花費巨大的開銷與時間,不適用于現(xiàn)實中的大型程序[1],但相較于導(dǎo)向式模糊測試,它能夠?qū)Τ绦蜻M(jìn)行更加深入的理解,在不考慮路徑爆炸和時間開銷的情況下,能夠覆蓋更全的程序路徑。而導(dǎo)向式模糊測試因為具有隨機(jī)性,在面對魔術(shù)字節(jié)等檢查語句時,難以生成通過檢查的測試用例,導(dǎo)致對路徑的覆蓋率較低。

        本文對導(dǎo)向式模糊測試和混合符號執(zhí)行技術(shù)進(jìn)行研究,結(jié)合混合符號執(zhí)行與導(dǎo)向式模糊測試技術(shù),將符號執(zhí)行只應(yīng)用于導(dǎo)向式模糊測試不能通過的程序路徑,輔助測試用例的生成,從而繼承符號執(zhí)行的優(yōu)點,保證模糊測試的高效率和良好的可伸縮性,提高導(dǎo)向式模糊測試對程序目標(biāo)區(qū)域的覆蓋率,以對目標(biāo)區(qū)域進(jìn)行更深入和更有效的檢測。

        1 導(dǎo)向式灰盒模糊測試技術(shù)

        在導(dǎo)向式灰盒模糊測試中,目標(biāo)區(qū)域為由若干個目標(biāo)函數(shù)組成的函數(shù)集,其基本思想是以種子到目標(biāo)區(qū)域的距離為依據(jù),控制種子的能量,距離越近,能量也越大,變異生成的測試用例就越多,這樣生成的測試用例能夠快速達(dá)到目標(biāo)區(qū)域,從而達(dá)到導(dǎo)向的目的。通過靜態(tài)分析得到被測程序的CFGs以及CG,以此計算程序基本塊到目標(biāo)區(qū)域的距離,通過跟蹤種子在程序中所執(zhí)行的基本塊,定義種子到目標(biāo)位置的距離,以距離的大小來分配種子在遺傳變異中的能量,即生成測試用例的數(shù)量,從而實現(xiàn)模糊測試的導(dǎo)向性,整體架構(gòu)如圖1所示。

        圖1 導(dǎo)向式灰盒模糊測試技術(shù)框架Fig.1 Framework of directed gray-box fuzzing test technology

        對一個程序進(jìn)行導(dǎo)向式模糊測試,目標(biāo)區(qū)域為程序中的若干個函數(shù)組成的函數(shù)集,模糊測試的流程如下:

        1)在目標(biāo)程序運行之前,對程序進(jìn)行靜態(tài)分析,通過CFGs和CG計算程序所有基本塊到目標(biāo)區(qū)域的距離,將計算得到的距離信息插樁進(jìn)入目標(biāo)程序。

        2)從種子集中按順序選取一個種子,執(zhí)行程序,根據(jù)它執(zhí)行的基本塊和基本塊的距離信息來計算種子到目標(biāo)區(qū)域的距離。

        3)通過動態(tài)調(diào)控函數(shù)動態(tài)地調(diào)控種子的能量,以此來調(diào)控變異生成測試用例的數(shù)量。

        4)如果變異生成的測試用例執(zhí)行了新的路徑,則將此測試用例加入種子集,如果產(chǎn)生Crash,則加入Crash集合,直到該種子生成的測試用例達(dá)到預(yù)定數(shù)量。

        5)如果模糊測試長時間沒有產(chǎn)生新的狀態(tài)轉(zhuǎn)換,啟用混合符號執(zhí)行,產(chǎn)生覆蓋了新路徑的種子,加入種子隊列,參與模糊測試。

        重復(fù)流程2)~流程5),當(dāng)種子集中的所有種子都被選取為一次迭代,繼續(xù)從頭開始選取種子進(jìn)行下一次迭代,直到時間結(jié)束。流程1)~流程4)為本文設(shè)計的基于動態(tài)能量調(diào)控的導(dǎo)向式模糊測試技術(shù),實現(xiàn)了模糊測試的導(dǎo)向性。流程5)為本文要著重研究的技術(shù),輔助導(dǎo)向式模糊測試用例生成的混合符號執(zhí)行技術(shù)。

        2 導(dǎo)向式灰盒模糊測試技術(shù)實現(xiàn)

        2.1 導(dǎo)向式模糊測試

        為實現(xiàn)模糊測試的導(dǎo)向性,本文設(shè)計了基于動態(tài)能量調(diào)控的導(dǎo)向式模糊測試,主要分為靜態(tài)分析和動態(tài)執(zhí)行兩個部分。

        靜態(tài)分析的輸入為目標(biāo)程序和給定的目標(biāo)區(qū)域(若干個函數(shù)組成的函數(shù)集),結(jié)果是插樁了基本塊到目標(biāo)區(qū)域距離信息的二進(jìn)制程序;首先計算程序基本塊到目標(biāo)區(qū)域的距離,通過給定的目標(biāo)程序源代碼(或者二進(jìn)制程序)構(gòu)建程序的CG和每個函數(shù)的CFGs,再根據(jù)給定的目標(biāo)區(qū)域計算基本塊到目標(biāo)的距離,輸出程序所有基本塊到目標(biāo)區(qū)域的距離信息。

        動態(tài)執(zhí)行的目標(biāo)為插樁后的二進(jìn)制程序,輸入為選定的種子集,輸出為導(dǎo)致目標(biāo)產(chǎn)生Crash的測試用例,或者達(dá)到預(yù)定時間。在得到靜態(tài)分析的結(jié)果后,將種子集輸入執(zhí)行插樁程序,跟蹤程序的基本塊轉(zhuǎn)換,并且記錄執(zhí)行的所有基本塊距離之和,以此來計算出所有種子級別的目標(biāo)距離。在進(jìn)行模糊測試時,從種子集中依次選取種子,使用動態(tài)能量調(diào)控技術(shù)并根據(jù)種子距離為種子分配不同的能量,種子到目標(biāo)距離越近,分配的能量就越多,種子根據(jù)能量變異生成不同數(shù)量的測試用例執(zhí)行目標(biāo)程序,同時繼續(xù)跟蹤程序的基本塊執(zhí)行情況和距離信息,如果產(chǎn)生了新種子,則加入種子集參與循環(huán)。

        2.1.1 種子到目標(biāo)區(qū)域距離的計算

        為實現(xiàn)模糊測試的導(dǎo)向性,使更加接近目標(biāo)區(qū)域的種子生成更多的測試用例,需要計算一個種子到目標(biāo)區(qū)域的距離,再根據(jù)距離來決定這個種子能夠生成多少測試用例。為精確地計算種子到目標(biāo)區(qū)域的距離,本文對程序靜態(tài)分析技術(shù)進(jìn)行了研究和拓展,首先運用靜態(tài)分析獲取程序的CFGs和CG,用于計算函數(shù)級別和基本塊級別的距離。使用CFGs和CG中的最短路徑的邊數(shù)來表示函數(shù)間和基本塊間的距離,通過Dijkstra’s算法[13]即可分別計算目標(biāo)區(qū)域中每個目標(biāo)函數(shù)到各個基本塊的最短距離,但這種表示方法不夠準(zhǔn)確,因為兩個函數(shù)間可能不止一種調(diào)用方法,被調(diào)用函數(shù)也可能不止一個進(jìn)入點,這樣相鄰函數(shù)間的邊應(yīng)該被賦予不同的權(quán)值,它們的可達(dá)路徑不止一種,不能直接簡單地用邊的條數(shù)來表示距離。為了更好地定義相鄰函數(shù)間的距離,用Nf來表示被調(diào)用函數(shù)在調(diào)用方法中的個數(shù),Nb表示被調(diào)用函數(shù)在調(diào)用函數(shù)中出現(xiàn)次數(shù),用d′1和d′2表示Nf和Nb的影響因子,d′f則表示兩個相鄰函數(shù)之間邊的權(quán)值。通過程序和CG即可計算出函數(shù)間邊的權(quán)值,將其作為兩個相鄰函數(shù)之間的距離,再利用Dijkstra’s算法來分別計算每個目標(biāo)函數(shù)到所有函數(shù)的最短距離,這樣便得到了加權(quán)后每個函數(shù)在調(diào)用圖中分別到各個目標(biāo)函數(shù)的最短距離df(f,tf)。

        (1)

        (2)

        d′f(f1,f2)=d′1·d′2

        (3)

        1)函數(shù)級別距離計算

        函數(shù)級別的距離計算用來計算CG中的每個函數(shù)到所有目標(biāo)函數(shù)的平均距離。對于一個函數(shù)f到多個目標(biāo)函數(shù)的距離計算,根據(jù)它到每個目標(biāo)函數(shù)的最短距離,使用調(diào)和平均值來計算出它到目標(biāo)函數(shù)的平均距離作為到目標(biāo)區(qū)域的距離,得到函數(shù)級別距離的計算公式:

        (4)

        其中,df(f,tf)為函數(shù)f到目標(biāo)函數(shù)tf的最短距離,Tf為所有目標(biāo)函數(shù)的集合,R(f,Tf)為函數(shù)f能夠達(dá)到的所有目標(biāo)函數(shù)的集合。

        2)基本塊級別距離計算

        雖然種子的距離是程序間的,但是本文的計算只需要對CG和每個程序間CFGs進(jìn)行一次分析,將基本塊級別的計算近似到了函數(shù)級別的計算。在同一個程序間CFGs中,將相鄰基本塊之間的邊作為它們的距離,兩個基本塊之間距離為它們之間的最短路徑的邊數(shù)。不在同一個CFGs的基本塊目標(biāo)距離通過基本塊能夠調(diào)用的函數(shù)來確定,以調(diào)用函數(shù)的函數(shù)級距離的常數(shù)倍來近似計算,當(dāng)一個基本塊沒有可以調(diào)用的函數(shù)時,就通過它所能達(dá)到的所有可以調(diào)用函數(shù)的基本塊來確定?;緣K到目標(biāo)區(qū)域的距離計算公式如下:

        db(b,Tb)=

        (5)

        其中,db(b,Tb)表示基本塊b到目標(biāo)區(qū)域的距離,Btf為目標(biāo)函數(shù)的基本塊集合,N(b)為基本塊b可以調(diào)用的函數(shù)集合,且滿足?b∈T,N(b)≠φ,db(b,t)為兩個基本塊b、t之間最短路徑的連接邊數(shù),a為一個常數(shù)。

        3)種子級別的距離計算

        前兩個級別的距離計算是在靜態(tài)分析階段進(jìn)行的,而種子級別的距離計算則是在模糊測循環(huán)開始后動態(tài)地實現(xiàn)的。本文通過跟蹤種子執(zhí)行了哪些基本塊來計算種子到目標(biāo)區(qū)域的距離,在AFL和LibFuzzer[14]等灰盒模糊測試器中,使用了輕量級的插樁來獲取程序的覆蓋信息,這種插樁能夠獲取基本塊的轉(zhuǎn)換信息,以及粗略的分支命中計數(shù),本文在此基礎(chǔ)上進(jìn)行拓展,將得到的所有基本塊距離向量加入程序的插樁,得到插樁后的二進(jìn)制程序,這樣就可以追蹤種子執(zhí)行的基本塊,計算出種子到目標(biāo)區(qū)域的平均距離:

        (6)

        最后將得到的種子距離歸一化來得到最終的距離向量:

        (7)

        其中,dmax(s,Tb)和dmin(s,Tb)分別為所有種子中離目標(biāo)最大的距離和最小的距離。

        2.1.2 種子的動態(tài)能量調(diào)控技術(shù)

        種子的能量調(diào)控用來調(diào)控一個選中的種子的變異次數(shù),如果當(dāng)前的種子距離目標(biāo)區(qū)域更加接近,那么就要給它分配更多的能量,變異生成更多的測試用例,這樣就能夠更大概率生成所期望的測試用例(到達(dá)目標(biāo)區(qū)域)。本文使用基于蟻群算法[15]的動態(tài)能量調(diào)控函數(shù)來動態(tài)地調(diào)控種子的能量。

        蟻群算法是一種用來尋找最優(yōu)化路徑的概率型算法,它具有分布計算、信息正反饋和啟發(fā)式搜索的特征,本質(zhì)上是進(jìn)化算法中的一種啟發(fā)式全局優(yōu)化算法,它的基本方法如下:

        1)N只螞蟻從一個出發(fā)點到四周搜索食物,N只螞蟻都搜索完畢為一輪迭代。

        2)每只螞蟻在行進(jìn)的路上釋放信息素,信息素的量和解的質(zhì)量成正比,當(dāng)找到食物時回到出發(fā)點,在路徑留下信息素,留下的量和距離成正相關(guān),在第一次搜尋時,所有的路徑具有相同的信息素,同時每次迭代后信息素按比例減少。

        3)螞蟻選擇一個路徑的概率和信息素的量成正比。

        4)量高的路徑在每次迭代中信息素濃度越來越高,經(jīng)過的螞蟻也越來越多,而質(zhì)量差的路徑信息素慢慢變得越來越少,這樣在迭代中,螞蟻從剛開始的隨機(jī)搜尋慢慢地往最優(yōu)解收斂,從最開始的接受較差解到最后的只接受更優(yōu)解,在一定程度上緩解過早收斂的問題。

        設(shè)定模糊測試中的種子為螞蟻搜索的路徑,種子與目標(biāo)的距離遠(yuǎn)近設(shè)定為解的質(zhì)量,即距離越近,質(zhì)量越高,那么每次迭代留下來的信息素也就越多。將螞蟻選擇路徑的概率用作能量調(diào)控,通過迭代次數(shù)的增加,信息素的量在增加,這個種子的能量也在慢慢增加,由此來實現(xiàn)動態(tài)能量調(diào)控函數(shù)。

        基于蟻群算法的動態(tài)能量調(diào)控函數(shù)如下:

        t:迭代次數(shù)

        si:種子i

        di:種子i到目標(biāo)區(qū)域的距離

        τi:ti路徑上的信息素

        ρ:信息素蒸發(fā)系數(shù)0<ρ<1

        Ei(t):第t次迭代時si的啟發(fā)度

        τi(0)=C

        Δτi(t)=Q·Ei(t)·(1-di),Q為常數(shù)

        τi(t+1)=(1-ρ)τi(t)+Δτi(t)

        Pi(t)=(1-di)·(1-ei)+ei

        其中,τi(t)為種子si在模糊測試第t輪迭代時路徑上的信息素,Ei(t)為種子si在第t輪迭代時的啟發(fā)度(即蟻群算法中選取一個路徑的概率),Pi(t)為種子si在第t輪迭代時的能量,啟發(fā)度Ei(t)的大小和信息素的多少成正相關(guān),而Ei(t)決定著能量Pi(t)的大小。被測程序剛剛開始運行時,種子集中所有種子的信息素為相同的數(shù)值,那么它們的路徑也都有著相同的啟發(fā)度和能量,到了新一輪迭代時,上一輪的信息素會以按照蒸發(fā)系數(shù)ρ的比率減小,同時會增加新得到的信息素Δτi(t),Δτi(t)大小根據(jù)種子到目標(biāo)的距離遠(yuǎn)近以及上一輪信息素的多少來決定,這樣在一輪輪的迭代下,距離目標(biāo)更近種子的路徑上的信息素會越來越多,能量也會越來越大,不同種子的能量便在迭代之中產(chǎn)生了差距。

        2.2 混合符號執(zhí)行

        導(dǎo)向式模糊測試可以快速地生成測試用例到達(dá)程序目標(biāo)區(qū)域,繼而發(fā)現(xiàn)目標(biāo)區(qū)域中不同的路徑,但是某些帶有特定值檢查的語句對于模糊測試是非常具有挑戰(zhàn)性的。當(dāng)模糊測試長時間沒有觸發(fā)新的狀態(tài)轉(zhuǎn)換時,主要原因是因為模糊測試器無法生成特定的輸入滿足代碼中的復(fù)雜檢查,混合符號執(zhí)行利用約束求解器,將達(dá)到但無法滿足復(fù)雜檢查的現(xiàn)有輸入轉(zhuǎn)換為達(dá)到并滿足此類檢查的新輸入。當(dāng)調(diào)用混合符號執(zhí)行時,跟蹤每一個新加入種子隊列的種子,以識別模糊測試無法滿足的狀態(tài)轉(zhuǎn)換,當(dāng)這種轉(zhuǎn)換被識別時,混合符號執(zhí)行產(chǎn)生輸入通過這種狀態(tài)轉(zhuǎn)換。

        在目標(biāo)區(qū)域中,某條語句需要輸入的測試用例中的某段偏移位置為特定的值才能通過,面對這種魔術(shù)字節(jié),模糊測試很難隨機(jī)地生成通過檢查的測試用例,導(dǎo)致無法覆蓋這條分支,從而無法觸發(fā)這條路徑上可能的崩潰點。

        函數(shù)示例如下:

        int main (void)

        {

        if (x=0xACDB3061)

        CRASH

        }

        混合執(zhí)行結(jié)合了具體執(zhí)行和符號執(zhí)行,是動態(tài)符號執(zhí)行的一種。其主要思想是用具體輸入執(zhí)行程序,在程序運行的過程中,通過程序插樁手段收集路徑約束條件,按順序搜索程序路徑,利用約束求解器求解上一執(zhí)行中收集到的約束集,從而得到下一次執(zhí)行的測試用例;在下一次執(zhí)行結(jié)束后,按一定的策略選擇其中某一分支判斷點進(jìn)行約束取反,得到新的約束集,再用約束求解器對其進(jìn)行求解,得到下一執(zhí)行的測試用例[16]?;旌蠄?zhí)行的優(yōu)點在于,它能夠探索和查找約束求解器可以滿足的任何路徑的輸入,這使得它有助于識別復(fù)雜比較(包括某些哈希函數(shù))的解決方案[17]。在多數(shù)情況下模糊測試可以覆蓋大部分的路徑,它只需通過一些簡單高效的突變策略就能快速地找到更多的新路徑,而混合符號執(zhí)行只需解決更困難的約束。

        當(dāng)模糊測試長時間沒有觸發(fā)新的路徑時,本文便認(rèn)為模糊測試遇到了難以通過的狀態(tài)變換,此時啟用混合符號執(zhí)行,調(diào)用最近覆蓋了新的路徑而加入隊列的種子,符號化地跟蹤這些種子,識別模糊測試無法滿足的狀態(tài)轉(zhuǎn)換,使用混合符號執(zhí)行產(chǎn)生滿足這種狀態(tài)變換的測試用例,將結(jié)果加入種子隊列繼續(xù)進(jìn)行模糊測試。這種方法能夠避免符號執(zhí)行的路徑爆炸。

        在啟用混合符號執(zhí)行時,將種子符號化建模為一種符號狀態(tài),使應(yīng)用程序的二進(jìn)制代碼轉(zhuǎn)換為中間表示,確定程序代碼對符號狀態(tài)的影響,這種符號狀態(tài)使用符號變量表示來自用戶的輸入或者其他非常量數(shù)據(jù),例如來自環(huán)境的數(shù)據(jù),其他的值被建模為具體值(如一些常量)。符號變量是一個變量,它可以產(chǎn)生許多可能的具體解,隨著具體的執(zhí)行,符號約束被添加到這些變量中,這些約束是對符號值的潛在解的限制性陳述(如x>0),分析引擎在整個執(zhí)行過程中跟蹤符號狀態(tài)中的所有具體值和符號值。在到達(dá)的程序中的任何節(jié)點上,都可以執(zhí)行約束求解來確定滿足狀態(tài)中所有可能的符號約束,當(dāng)使用滿足這些約束的具體值來代替符號值時,就是一個滿足這個約束的測試用例。當(dāng)跟蹤到有條件的控制流轉(zhuǎn)換時,會檢查反轉(zhuǎn)這個條件是否會導(dǎo)致發(fā)現(xiàn)新的狀態(tài)變換,如果可以,則將生成一個示例輸入通過新的狀態(tài)轉(zhuǎn)換而不是沿著原來的控制流執(zhí)行。這樣就能夠到達(dá)程序中未被覆蓋過的位置,在產(chǎn)生輸入之后,會繼續(xù)沿著匹配的路徑尋找新的狀態(tài)轉(zhuǎn)換。

        混合符號執(zhí)行使用了預(yù)約來確保能夠保持執(zhí)行結(jié)果與跟蹤的種子所執(zhí)行的結(jié)果相同,同時保持發(fā)現(xiàn)新的狀態(tài)轉(zhuǎn)換的能力。在預(yù)約束執(zhí)行中,輸入的每個字節(jié)都被約束為與種子的實際字節(jié)相匹配,當(dāng)發(fā)現(xiàn)新的基本塊轉(zhuǎn)換時,短暫地取消預(yù)約束,求解出滿足變換的輸入。如混合符號執(zhí)行首先約束輸入中的所有字節(jié),匹配跟蹤的輸入,當(dāng)執(zhí)行到魔術(shù)字節(jié)的檢查時,識別到一個之前未識別的狀態(tài)轉(zhuǎn)換,此時刪除開始添加的預(yù)約束,獲取這個位置的路徑約束(x=0xACDB3061),這樣便可以生成一個在特定位置包含了魔術(shù)字節(jié)的輸入,通過這個路徑轉(zhuǎn)換。

        在得到了通過新的狀態(tài)轉(zhuǎn)換的測試用例后,將其加入種子集,并將新加入的種子優(yōu)先選擇繼續(xù)進(jìn)行模糊測試,重復(fù)整個導(dǎo)向式模糊測試的循環(huán)。

        3 實驗與評估

        為實現(xiàn)和評估混合符號執(zhí)行在導(dǎo)向式模糊測試中的效果,本文在模糊測試框架AFL的基礎(chǔ)上設(shè)計了導(dǎo)向式模糊測試器AFL-Ant。該設(shè)計以python腳本的形式實現(xiàn)距離計算器,輸入為程序的CFGs、CG以及目標(biāo)函數(shù)集,用networkx包來解析圖形,再使用Djikstra’s 算法來計算基本塊到目標(biāo)的距離,計算并輸出基本塊距離信息BB-distance。AFL-Ant 拓展了AFL的插樁,將BB-distance 插樁到目標(biāo)程序的基本塊,在記錄基本塊轉(zhuǎn)換的同時,也記錄所執(zhí)行基本塊的距離累積值,該項目使用 ASAN[18]構(gòu)建。AFL-Ant 的模糊測試器基于2.40b版本的 AFL,它通過記錄的基本塊距離累計值來計算當(dāng)前的種子距離,使用本文所設(shè)計的基于蟻群算法的動態(tài)能量調(diào)控方法來調(diào)控種子能量。同時設(shè)計了基于Angr[19]的混合符號執(zhí)行引擎,這個引擎是基于Mayhem[20]和S2E[21]拓展和改進(jìn)的。為評估結(jié)合混合符號執(zhí)行的導(dǎo)向式模糊測試器在模糊測試中對目標(biāo)區(qū)域的覆蓋效果,本文通過補(bǔ)丁檢測來測試它的能力。

        結(jié)合當(dāng)前最近的導(dǎo)向式模糊測試器AFLGO所做的工作,本文選取了GNU Diffutils和GNU Binutils[22]兩組工具集作為目標(biāo)程序,選取了它們在特定版本的補(bǔ)丁,將補(bǔ)丁所覆蓋的位置作為目標(biāo)區(qū)域,設(shè)置了相同的初始種子集,分別使用AFL和AFL-Ant對它們進(jìn)行導(dǎo)向式模糊測試,測試時間設(shè)置為8 h,最終比較它們在模糊測試中所覆蓋的目標(biāo)區(qū)域基本塊的數(shù)量。

        GNU Diffutils工具集測試工具為Diff、sdiff、diff3、cmp,程序大小為42 930行,選定補(bǔ)丁版本為2016-11-09—2017-05-12的175份commits。

        GNU Binutil工具集測試工具為addr2line、ar、cxxfilt、elfedit、nm、objcopy、objdump、ranlib、readelf,程序大小為68 830行,選定補(bǔ)丁版本為2017-04-12—2017-08-11的181份commits。補(bǔ)丁情況如表1所示。

        表1 補(bǔ)丁測試中的基本塊覆蓋情況Table 1 Basic block coverage in patch testing 塊

        表1展示了補(bǔ)丁測試的結(jié)果,Diffutils的補(bǔ)丁基本塊數(shù)量為166塊,在實驗中,AFLGO覆蓋了其中的61塊,而AFL-Ant覆蓋了69塊,相比于AFLGO提高了13.1%;Binutils的補(bǔ)丁基本塊數(shù)量為852塊,AFLGO在實驗中覆蓋了其中的163塊,而AFL-Ant覆蓋了其中的178塊,相比于AFLGO提高了9.2%。合計AFL-Ant在補(bǔ)丁測試中對目標(biāo)區(qū)域基本塊的覆蓋數(shù)量為247塊,相較于AFLGO的224塊提高了10.2%。

        圖2統(tǒng)計了兩個導(dǎo)向式模糊測試器測試結(jié)果的交叉情況,兩個測試器總共覆蓋了補(bǔ)丁中的252個基本塊,其中有219塊是它們共同覆蓋到的。在AFLGO覆蓋的基本塊中,有5個是AFL-Ant未覆蓋到的,而AFL-Ant能夠覆蓋28個AFLGO無法覆蓋到的基本塊。

        圖2 補(bǔ)丁測試覆蓋情況文氏示意圖Fig.2 Venn schematic diagram of patch test coverage

        為了評估AFL-Ant和AFLGO在覆蓋目標(biāo)區(qū)域的效率,在219個共同覆蓋的基本塊中,隨機(jī)選取了其中的120塊,將其分為了3組作為新的目標(biāo)區(qū)域,用AFL-Ant和AFLGO分別對每組進(jìn)行導(dǎo)向式模糊測試,實驗的時間上限設(shè)置為2 h,比較它們每組實驗中覆蓋所有目標(biāo)所花費的時間。

        實驗結(jié)果如表2所示,AFL-Ant在3組實驗中均能覆蓋到目標(biāo)區(qū)域的所有基本塊,而在第3組實驗中,AFLGO未能在2 h內(nèi)覆蓋所有的目標(biāo)基本塊。同時,AFL-Ant覆蓋所有基本塊的時間均比AFLGO更快,這歸功于它更加高效的動態(tài)能量調(diào)控方法以及混合符號執(zhí)行輔助通過復(fù)雜節(jié)點能力。

        表2 補(bǔ)丁測試時間Table 2 Patch test time min

        通過上述實驗可以看出,使用了混合符號執(zhí)行的AFL-Ant能夠提高對目標(biāo)區(qū)域的覆蓋率,發(fā)現(xiàn)更多的程序狀態(tài)變換,同時能夠覆蓋目標(biāo)區(qū)域,更加高效地去挖掘漏洞。

        4 結(jié)束語

        本文對混合符號執(zhí)行技術(shù)在導(dǎo)向式模糊測試中的應(yīng)用進(jìn)行研究,提出一種新的導(dǎo)向式模糊測試策略,即使用混合符號執(zhí)行輔助導(dǎo)向式模糊測試的測試用例生成的方法,幫助導(dǎo)向式模糊測試到達(dá)一些脆弱的區(qū)域。實驗結(jié)果表明,該方法能夠提高導(dǎo)向式模糊測試對目標(biāo)區(qū)域的覆蓋率,加快到達(dá)并覆蓋整個目標(biāo)區(qū)域的速度,提高發(fā)現(xiàn)目標(biāo)區(qū)域漏洞的概率。本文導(dǎo)向式模糊測試中使用CG和CFGs來進(jìn)行種子的距離計算,但未考慮到間接調(diào)用關(guān)系,導(dǎo)致間接調(diào)用的函數(shù)間距離計算不夠準(zhǔn)確,在未來工作中將通過改進(jìn)靜態(tài)分析方法識別程序中的間接調(diào)用關(guān)系來完善種子的距離計算過程。同時,可將靜態(tài)分析技術(shù)和本文提出的混合符號執(zhí)行引擎結(jié)合,以更大概率地去觸發(fā)程序漏洞。

        猜你喜歡
        程序
        給Windows添加程序快速切換欄
        電腦愛好者(2020年6期)2020-05-26 09:27:33
        試論我國未決羈押程序的立法完善
        失能的信仰——走向衰亡的民事訴訟程序
        “程序猿”的生活什么樣
        英國與歐盟正式啟動“離婚”程序程序
        基于VMM的程序行為異常檢測
        偵查實驗批準(zhǔn)程序初探
        我國刑事速裁程序的構(gòu)建
        創(chuàng)衛(wèi)暗訪程序有待改進(jìn)
        恐怖犯罪刑事訴訟程序的完善
        精品国产乱码久久久久久口爆网站| 免费看黄色亚洲一区久久| 成人区人妻精品一区二区三区| 人妻久久久一区二区三区| 98bb国产精品视频| 成年女人片免费视频播放A| 女优av性天堂网男人天堂| 亚洲精品无码永久在线观看| 亚洲av无码av制服丝袜在线| 欧美日韩中文亚洲另类春色| 国产av一区麻豆精品久久| 黄片视频免费在线观看国产| 99久久国产综合精品五月天| 国产成人乱色伦区小说| 精品在线视频免费在线观看视频| 亚洲一区二区在线观看网址| 人妻少妇精品无码专区二区| 亚洲av日韩aⅴ无码电影| 午夜国产在线精彩自拍视频| 欲香欲色天天天综合和网| 青青草原综合久久大伊人| 日韩av一区二区三区四区av| 亚洲乱熟妇一区二区三区蜜桃| 国产精品国产三级国产av品爱网| 国产在线精品一区二区三区不卡| 欧洲AV秘 无码一区二区三| 在线免费观看蜜桃视频| 久久精品国产亚洲av无码娇色| 一国产区在线观看| 女同视频网站一区二区| 99re6在线视频精品免费| 成人做爰视频www| 国产精品国产三级国产AvkTV| 性色av色香蕉一区二区蜜桃| 久久国产精品99精品国产| 国产欧美久久久另类精品| 日本熟女视频一区二区三区| 无码国产精品一区二区免费式芒果| 日本老熟欧美老熟妇| 熟妇与小伙子露脸对白| 在线观看国产成人av天堂野外|