国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

結(jié)合路徑標(biāo)簽和數(shù)據(jù)變異的模糊測(cè)試關(guān)鍵數(shù)據(jù)定位方法

2020-10-21 07:21焦龍龍羅森林劉望桐潘麗敏
關(guān)鍵詞:字節(jié)變異關(guān)鍵

焦龍龍, 羅森林, 劉望桐, 潘麗敏

(北京理工大學(xué) 信息與電子學(xué)院,北京 100081)

模糊測(cè)試是威斯康星大學(xué)麥迪遜分校的Takanen等[1]在1988年提出的一種自動(dòng)化漏洞挖掘方法[2]. 它首先生成大量畸形測(cè)試數(shù)據(jù),然后監(jiān)控被測(cè)程序處理這些畸形測(cè)試數(shù)據(jù)的過(guò)程,最后當(dāng)被測(cè)程序發(fā)生異常時(shí),就發(fā)現(xiàn)了一個(gè)潛在的安全漏洞[3]. 目前主要存在兩種模糊測(cè)試方法:基于生成的模糊測(cè)試和基于變異的模糊測(cè)試[4].

基于生成的模糊測(cè)試需要利用輸入規(guī)范來(lái)構(gòu)建輸入數(shù)據(jù)模型. 然而,在沒(méi)有輸入規(guī)范或者輸入規(guī)范極端復(fù)雜的情況下,構(gòu)建模型將是一件非常困難的事情[5],使基于生成的模糊測(cè)試并不能夠直接對(duì)輸入規(guī)范未知的程序進(jìn)行測(cè)試. 基于變異的模糊測(cè)試通過(guò)對(duì)原有的測(cè)試數(shù)據(jù)進(jìn)行變異來(lái)生成新的測(cè)試數(shù)據(jù),能夠在沒(méi)有輸入規(guī)范的情況下完成測(cè)試工作. 由于很多程序并沒(méi)有對(duì)輸入進(jìn)行嚴(yán)格的檢測(cè),這種方法同樣是一種很有效的測(cè)試方法[6].

國(guó)內(nèi)外的研究人員已經(jīng)對(duì)格式未知的輸入數(shù)據(jù)中的關(guān)鍵數(shù)據(jù)定位問(wèn)題進(jìn)行了比較多的研究,主要有人工定位、基于污點(diǎn)分析的定位方法和基于程序執(zhí)行路徑的定位方法.

人工定位是在分析輸入數(shù)據(jù)格式信息的基礎(chǔ)上,對(duì)其中包含的關(guān)鍵數(shù)據(jù)進(jìn)行定位. 人工定位對(duì)分析人員的要求比較高,且一般需要比較長(zhǎng)的時(shí)間. 另外人工定位依賴于格式逆向分析的結(jié)果,但是由于程序中使用的混淆、加密等方法,這類逆向分析的代價(jià)會(huì)變得非常大[7]. 以Samba項(xiàng)目為例,分析人員花費(fèi)了12年的時(shí)間才成功完成SMB的逆向分析工作[8].

污點(diǎn)分析主要可以分為兩類:粗粒度污點(diǎn)分析和細(xì)粒度污點(diǎn)分析. 粗粒度污點(diǎn)分析中,僅存在污染和未污染兩個(gè)標(biāo)簽,最終的分析結(jié)果只能判斷出某個(gè)位置是否被污染[9],不能定位到污染的具體來(lái)源,比如陳廳[10]基于粗粒度污點(diǎn)分析實(shí)現(xiàn)的分析工具TVM. 細(xì)粒度污點(diǎn)分析為輸入數(shù)據(jù)中每一個(gè)區(qū)域分配了不同的標(biāo)簽. 在分析結(jié)果中通過(guò)這些標(biāo)簽?zāi)軌驅(qū)ξ廴緛?lái)源進(jìn)行定位,比如王鐵磊[11]、梁曉兵[12]等實(shí)現(xiàn)的輸入數(shù)據(jù)分析方法. 污點(diǎn)分析需要利用指令級(jí)的插樁來(lái)搜集數(shù)據(jù),對(duì)程序的執(zhí)行過(guò)程影響較大,搜集到的跟蹤數(shù)據(jù)也比較龐大,整體的資源消耗較大. 另外,污點(diǎn)分析過(guò)程中,沒(méi)有考慮程序?qū)斎霐?shù)據(jù)的驗(yàn)證過(guò)程,其定位結(jié)果存在比較多的誤報(bào).

Michal[13]提出一種利用程序執(zhí)行路徑信息對(duì)輸入數(shù)據(jù)進(jìn)行分析的方法. 該方法首先記錄程序處理變異輸入數(shù)據(jù)時(shí)的執(zhí)行路徑,然后通過(guò)分析執(zhí)行路徑的變化并結(jié)合輸入數(shù)據(jù)本身的數(shù)字特征確定輸入數(shù)據(jù)中各個(gè)部分的數(shù)據(jù)類型. 這種方法考慮了程序執(zhí)行路徑對(duì)分析結(jié)果的影響,但通過(guò)數(shù)字特征進(jìn)行輔助定位的方式使結(jié)果中存在比較多的誤報(bào).

在使用變異的方式生成測(cè)試數(shù)據(jù)時(shí),變異過(guò)程針對(duì)的是整個(gè)輸入空間,而一個(gè)程序的輸入空間通常是非常大的[14]. 但是,對(duì)于一個(gè)程序的輸入數(shù)據(jù)而言,其中與安全敏感的危險(xiǎn)操作(如內(nèi)存分配、內(nèi)存拷貝、字符串操作、含有格式化參數(shù)的函數(shù)等)相關(guān)的關(guān)鍵數(shù)據(jù)通常是非常少的. 這些關(guān)鍵數(shù)據(jù)控制著被測(cè)程序中的危險(xiǎn)操作,對(duì)其進(jìn)行變異具有更大的可能會(huì)觸發(fā)程序中相關(guān)的漏洞,有助于提高模糊測(cè)試的效率[15]. 在缺乏輸入規(guī)范的情況下,無(wú)法通過(guò)格式信息進(jìn)行關(guān)鍵數(shù)據(jù)定位. 而現(xiàn)有的關(guān)鍵數(shù)據(jù)定位方法則存在資源消耗大、誤報(bào)率高等問(wèn)題.

針對(duì)這些問(wèn)題,本文提出一種結(jié)合路徑標(biāo)簽和數(shù)據(jù)變異的模糊測(cè)試關(guān)鍵數(shù)據(jù)定位方法,該方法通過(guò)插樁監(jiān)控二進(jìn)制程序處理輸入的測(cè)試數(shù)據(jù)的過(guò)程,分析輸入數(shù)據(jù)變異前后的處理過(guò)程的差異從而對(duì)輸入數(shù)據(jù)中與安全敏感操作相關(guān)的關(guān)鍵數(shù)據(jù)進(jìn)行定位.

1 關(guān)鍵數(shù)據(jù)定位方法

1.1 原理框架

針對(duì)模糊測(cè)試關(guān)鍵數(shù)據(jù)定位中存在的資源消耗大、誤報(bào)率較高等問(wèn)題,本文提出一種結(jié)合路徑標(biāo)簽和數(shù)據(jù)變異的模糊測(cè)試關(guān)鍵數(shù)據(jù)定位方法,其原理如圖1所示. 首先通過(guò)靜態(tài)分析獲取二進(jìn)制程序及其依賴庫(kù)中危險(xiǎn)操作的位置;其次在動(dòng)態(tài)分析的過(guò)程中使用動(dòng)態(tài)插樁技術(shù)對(duì)危險(xiǎn)操作進(jìn)行監(jiān)控并跟蹤被測(cè)二進(jìn)制程序處理輸入數(shù)據(jù)的過(guò)程;然后結(jié)合輸入數(shù)據(jù)的變異,得到程序處理這些數(shù)據(jù)的跟蹤數(shù)據(jù);最后通過(guò)分析跟蹤數(shù)據(jù)獲取關(guān)鍵數(shù)據(jù)的位置.

1.2 靜態(tài)分析

通過(guò)靜態(tài)分析能夠?qū)ΧM(jìn)制程序中的危險(xiǎn)操作進(jìn)行定位,從而輔助輸入數(shù)據(jù)中關(guān)鍵數(shù)據(jù)的定位工作. 靜態(tài)分析包含兩方面的工作:分析程序的依賴庫(kù);對(duì)程序及其依賴庫(kù)中的危險(xiǎn)操作進(jìn)行定位.

一個(gè)程序在執(zhí)行時(shí)通常需要多個(gè)動(dòng)態(tài)庫(kù)的輔助,即程序的依賴庫(kù). 這些庫(kù)中同樣會(huì)包含一些危險(xiǎn)操作. 依賴庫(kù)的分析可以使用程序文件對(duì)應(yīng)的可執(zhí)行文件分析工具完成,比如Linux下使用ldd命令即可查看ELF格式的可執(zhí)行文件的依賴庫(kù).

程序中內(nèi)存分配、內(nèi)存拷貝、字符串操作、含有格式化參數(shù)的函數(shù)等容易引起安全問(wèn)題,對(duì)這些代碼進(jìn)行測(cè)試有更大的可能發(fā)現(xiàn)問(wèn)題[12]. 因此將這些函數(shù)定義為危險(xiǎn)操作,主要危險(xiǎn)函數(shù)如表1所示. 程序執(zhí)行過(guò)程所需的函數(shù)信息會(huì)記錄在程序文件的某個(gè)區(qū)域(如符號(hào)表、導(dǎo)入表),利用程序逆向分析技術(shù)即可通過(guò)文件格式信息對(duì)這些函數(shù)進(jìn)行定位.

表1 包含危險(xiǎn)操作的函數(shù)

1.3 動(dòng)態(tài)分析

動(dòng)態(tài)分析部分完成實(shí)際的關(guān)鍵數(shù)據(jù)定位工作,具體過(guò)程如下:首先,利用插樁技術(shù)跟蹤監(jiān)控被測(cè)程序的執(zhí)行過(guò)程以及其中包含的危險(xiǎn)操作;其次,記錄被測(cè)程序?qū)Τ跏驾斎霐?shù)據(jù)的處理過(guò)程以及其中包含的危險(xiǎn)操作;然后逐個(gè)變異初始輸入數(shù)據(jù)中的每個(gè)字節(jié),記錄被測(cè)程序處理這些變異數(shù)據(jù)的過(guò)程以及其中包含的危險(xiǎn)操作;最后通過(guò)對(duì)比分析輸入數(shù)據(jù)變異前后記錄到的程序跟蹤數(shù)據(jù)來(lái)進(jìn)行關(guān)鍵數(shù)據(jù)定位.

1.3.1數(shù)據(jù)變異

使用變異操作能夠以初始輸入數(shù)據(jù)為模板,生成大量新的輸入數(shù)據(jù). 變異的過(guò)程無(wú)需輸入數(shù)據(jù)的規(guī)范,適用于各種格式的數(shù)據(jù). 假設(shè)初始輸入數(shù)據(jù)為X,共包含n字節(jié),當(dāng)對(duì)X中的第k字節(jié)使用變異操作m后將得到新的輸入數(shù)據(jù)Xm,k,這樣的一次變異過(guò)程可以使用一個(gè)函數(shù)來(lái)表示,即Xm,k=m(X,k)(1≤k≤n).

本文方法在關(guān)鍵數(shù)據(jù)定位過(guò)程中主要通過(guò)數(shù)據(jù)變異的方式觀察二進(jìn)制程序執(zhí)行過(guò)程的變化. 定位過(guò)程中并不會(huì)嘗試使用變異的方式遍歷整個(gè)輸入空間,僅利用位翻轉(zhuǎn)的方式依次對(duì)X中每一個(gè)字節(jié)進(jìn)行輕微變異,將這個(gè)變異操作記為mb,那么針對(duì)第k字節(jié)的變異將得到新的輸入數(shù)據(jù)Xmb,k. 該變異過(guò)程同樣可以使用一個(gè)函數(shù)來(lái)表示,即Xmb,k=mb(X,k)(1≤k≤n).

1.3.2程序跟蹤

程序跟蹤主要是監(jiān)控并記錄被測(cè)程序的執(zhí)行過(guò)程. 程序執(zhí)行過(guò)程中需要依賴庫(kù)的支持,因此程序跟蹤需要能夠同時(shí)對(duì)程序及其依賴庫(kù)中的代碼執(zhí)行過(guò)程進(jìn)行監(jiān)控. 每一個(gè)程序及其依賴庫(kù)都是同一種格式的可執(zhí)行文件. 使用E表示一個(gè)可執(zhí)行文件,同時(shí)假設(shè)程序及其依賴庫(kù)共有w個(gè)可執(zhí)行文件,那么可將這些可執(zhí)行文件視為集合P={E1,E2,…,Ew}. 可執(zhí)行文件E的代碼可以被劃分成很多基本塊. 使用B表示一個(gè)基本塊,同時(shí)假設(shè)可執(zhí)行文件Ei的代碼可劃分為L(zhǎng)i個(gè)基本塊,那么可將Ei視為基本塊的集合EBi={Bi,1,Bi,2,…,Bi,Li}.

PB=∪EBi={B1,B2,…,BL}.

(1)

程序執(zhí)行的過(guò)程就是按照某種順序執(zhí)行集合PB中的基本塊,因此執(zhí)行過(guò)程的監(jiān)控可以轉(zhuǎn)換為監(jiān)控正在執(zhí)行的基本塊,執(zhí)行過(guò)程的記錄則可以轉(zhuǎn)換為記錄執(zhí)行過(guò)的基本塊序列.

一個(gè)基本塊B有且只有一個(gè)入口和一個(gè)出口,在其執(zhí)行過(guò)程中僅會(huì)從入口處開始執(zhí)行并從出口處結(jié)束,故使用基本塊的入口地址b能夠代表一個(gè)基本塊并且具有唯一性. 利用基本塊插樁能夠在基本塊B的入口處獲取到基本塊的入口地址b. 因此,基本塊的集合PB可以使用基本塊的入口地址的集合Pb表示,即PB≡Pb={b1,b2,…,bL}.

使用S代表程序的執(zhí)行過(guò)程,那么當(dāng)程序執(zhí)行過(guò)j個(gè)基本塊時(shí),其執(zhí)行過(guò)程可記為一個(gè)由j個(gè)基本塊入口地址組成的序列Sj=(b1,b2,…,bj),其中?1≤i≤j∶bi∈Pb.

程序在執(zhí)行時(shí)可能包含多個(gè)線程,每個(gè)線程均有自己的執(zhí)行過(guò)程,需要分別記錄每個(gè)線程的基本塊序列,使用線程ID區(qū)分不同線程的基本塊序列,即將線程x的基本塊序列記為Sx,j. 綜上所述,程序跟蹤將得到一個(gè)或多個(gè)基本塊序列,每個(gè)基本塊序列對(duì)應(yīng)程序中一個(gè)線程的執(zhí)行過(guò)程.

1.3.3危險(xiǎn)操作監(jiān)控

對(duì)危險(xiǎn)操作的監(jiān)控需要記錄危險(xiǎn)操作對(duì)應(yīng)的函數(shù)的名稱、路徑標(biāo)簽和參數(shù). 通過(guò)靜態(tài)分析能夠得到函數(shù)的位置,進(jìn)而利用動(dòng)態(tài)插樁技術(shù)在函數(shù)的起始位置處進(jìn)行插樁,就可以在函數(shù)實(shí)際執(zhí)行前記錄函數(shù)的相關(guān)信息.

將某個(gè)危險(xiǎn)操作D對(duì)應(yīng)的函數(shù)名稱記為fn. 在動(dòng)態(tài)插樁時(shí),可以從靜態(tài)分析的結(jié)果得到fn的相關(guān)信息. 因此可將名稱fn的記錄工作寫入插樁的代碼中,在執(zhí)行到危險(xiǎn)操作D時(shí)直接進(jìn)行fn的記錄.

假設(shè)危險(xiǎn)操作D所在的線程x在執(zhí)行到D時(shí)共執(zhí)行過(guò)j個(gè)基本塊,那么危險(xiǎn)操作D對(duì)應(yīng)的執(zhí)行路徑就是Sx,j. 執(zhí)行路徑Sx,j本質(zhì)上是一個(gè)地址序列,可以當(dāng)作一個(gè)基本塊入口地址組成的數(shù)組來(lái)處理,將這個(gè)數(shù)組通過(guò)哈希運(yùn)算得到哈希值h作為路徑標(biāo)簽t. 那么執(zhí)行到危險(xiǎn)操作D時(shí)的程序執(zhí)行路徑可使用路徑標(biāo)簽t表示.

將哈希運(yùn)算視為一個(gè)函數(shù)H(salt,data),其中salt為計(jì)算哈希值時(shí)使用的初始值,data為需要計(jì)算哈希值的數(shù)據(jù). 哈希運(yùn)算H將一個(gè)基本塊地址b作為哈希計(jì)算的基本單位,設(shè)哈希運(yùn)算H中對(duì)一個(gè)基本塊地址b進(jìn)行哈希計(jì)算的過(guò)程為函數(shù)HH(salt,b).

當(dāng)data中只有一個(gè)基本塊地址b時(shí),直接使用HH進(jìn)行哈希計(jì)算,即h=H(salt,b)=HH(salt,b). 當(dāng)data中含有多個(gè)基本塊地址時(shí),設(shè)data=Sx,j=(b1,b2,…,bj),采取依次對(duì)每一個(gè)基本塊進(jìn)行哈希的方式進(jìn)行計(jì)算,并且將前一個(gè)地址得到的哈希值作為下一個(gè)地址進(jìn)行哈希計(jì)算時(shí)的salt,整個(gè)過(guò)程如式(2)所示.

(2)

使用上述計(jì)算過(guò)程,意味著路徑Sx,j的哈希值hj可以在執(zhí)行到基本塊bj時(shí),通過(guò)前一個(gè)路徑狀態(tài)Sx,j-1的哈希值hj-1經(jīng)過(guò)一次簡(jiǎn)單的哈希計(jì)算得出,無(wú)需從b1開始進(jìn)行計(jì)算,能夠減少許多不必要的計(jì)算. 綜上,可將Sx,j的哈希值hj作為危險(xiǎn)操作D的路徑標(biāo)簽t.

函數(shù)參數(shù)的記錄需根據(jù)運(yùn)行環(huán)境進(jìn)行區(qū)分. 不同的運(yùn)行環(huán)境下,每個(gè)函數(shù)的參數(shù)有不同的儲(chǔ)存方式,通過(guò)函數(shù)的調(diào)用約定可以獲取其參數(shù)的儲(chǔ)存位置. 例如x86平臺(tái)下主要有cdecl、stdcall和fastcall 3種函數(shù)調(diào)用約定,所有調(diào)用約定中,函數(shù)參數(shù)均儲(chǔ)存在寄存器或線程棧中. 因此,在函數(shù)執(zhí)行前根據(jù)調(diào)用約定和函數(shù)定義讀取寄存器和線程棧中的數(shù)據(jù)即可獲取函數(shù)參數(shù). 當(dāng)函數(shù)有g(shù)個(gè)參數(shù)時(shí),函數(shù)參數(shù)可按照從左到右的順序記為一個(gè)參數(shù)序列PA=(p1,p2,…,pg). 定義函數(shù)gp()為從參數(shù)序列PA中獲取第k個(gè)參數(shù),那么pk=gp(PA,k)(1≤k≤g).

綜上所述,對(duì)于一個(gè)危險(xiǎn)操作D,通過(guò)危險(xiǎn)操作監(jiān)控將得到D的函數(shù)名fn、路徑標(biāo)簽t、參數(shù)序列PA. 使用一個(gè)三元組(fn,t,PA)表示危險(xiǎn)操作D的相關(guān)信息并將其記為I,即I=(fn,t,PA). 同時(shí)分別使用I[0]、I[1]、I[2]代表三元組I中的數(shù)據(jù)fn、t、PA.

將程序跟蹤和危險(xiǎn)操作監(jiān)控的過(guò)程抽象為一個(gè)函數(shù)Trace(),那么一個(gè)輸入數(shù)據(jù)X在經(jīng)過(guò)函數(shù)Trace()的處理后,將得到一組關(guān)于危險(xiǎn)操作的跟蹤數(shù)據(jù),使用集合T表示這組跟蹤數(shù)據(jù),整個(gè)過(guò)程如式(3)所示為

T=Trace(P,X)={I1,I2,I3,…}.

(3)

1.3.4跟蹤數(shù)據(jù)分析

設(shè)初始輸入數(shù)據(jù)X對(duì)應(yīng)的跟蹤數(shù)據(jù)集合為T0=Trace(P,X),變異輸入數(shù)據(jù)Xmb,k對(duì)應(yīng)的跟蹤數(shù)據(jù)集合為Tk=Trace(P,Xmb,k)(1≤k≤n).

危險(xiǎn)操作D對(duì)應(yīng)的函數(shù)為fn,如果函數(shù)fn的某個(gè)參數(shù)來(lái)源于輸入數(shù)據(jù),那么輸入數(shù)據(jù)就能夠?qū)@個(gè)參數(shù)進(jìn)行一定程度的控制. 輸入數(shù)據(jù)中能夠控制危險(xiǎn)函數(shù)參數(shù)的數(shù)據(jù)就是所要查找的關(guān)鍵數(shù)據(jù). 也就是說(shuō),如果存在Ia∈T0、Ib∈Tk、c使Ia[0]=Ib[0]、Ia[1]=Ib[1]以及gp(Ia[2],c)≠gp(Ib[2],c)均成立,那么第k字節(jié)變異后的輸入數(shù)據(jù)造成了同樣位置的相同危險(xiǎn)函數(shù)的參數(shù)發(fā)生變化,即第k字節(jié)能夠控制危險(xiǎn)操作的參數(shù),因此將第k字節(jié)標(biāo)記為關(guān)鍵數(shù)據(jù). 通過(guò)這種方式逐個(gè)分析輸入數(shù)據(jù)X中的每一個(gè)字節(jié),能夠獲取到所有符合要求的字節(jié),并得到關(guān)鍵數(shù)據(jù)的集合SK.

跟蹤數(shù)據(jù)分析的過(guò)程可以使用算法1來(lái)表示,其中函數(shù)GetElement(T,t)(第2行)是從跟蹤數(shù)據(jù)集合T中取出路徑標(biāo)簽是t的跟蹤數(shù)據(jù). 如果以路徑標(biāo)簽為鍵(Key)將跟蹤數(shù)據(jù)集合T0轉(zhuǎn)換為一個(gè)哈希表,那么可以將從集合中取數(shù)據(jù)的操作優(yōu)化為常數(shù)時(shí)間,因此每一輪的分析工作耗時(shí)將僅與Tk的大小相關(guān). 另外,從算法中可以看出,在定位過(guò)程中,需要長(zhǎng)期儲(chǔ)存的僅有初始輸入數(shù)據(jù)X的跟蹤數(shù)據(jù)集合T0.

算法1跟蹤數(shù)據(jù)分析

輸入T0:初始輸入數(shù)據(jù)X的跟蹤數(shù)據(jù)集合

Tk:變異輸入數(shù)據(jù)Xmb,k的跟蹤數(shù)據(jù)集合

SK:關(guān)鍵數(shù)據(jù)位置集合

輸出SK:更新后的關(guān)鍵數(shù)據(jù)位置集合

1.foreachIainTkdo

2.Ib=GetElement(T0,Ia[1])

3.ifIb!= null do

4.ifIa[0]==Ib[0] do

5.g=Ia[2]中元素的個(gè)數(shù)

6.forc= 1 →gdo

7.ifgp(Ia[2],c)!=gp(Ib[2],c) do

8.SK=SK∪k

9.returnSK

10.endif

11.endfor

12.endif

13.endif

14.endfor

15.returnSK

2 實(shí)驗(yàn)分析

2.1 實(shí)驗(yàn)?zāi)康暮蛿?shù)據(jù)源

使用本實(shí)驗(yàn)測(cè)試本文提出的方法進(jìn)行關(guān)鍵數(shù)據(jù)定位時(shí)的準(zhǔn)確性,并與模糊測(cè)試工具AFL[13]中的AFL-Analyze模塊進(jìn)行對(duì)比. 使用4個(gè)常見的文件處理型程序作為實(shí)驗(yàn)中的被測(cè)程序:圖片格式轉(zhuǎn)換程序ImageMagick convert(IMC)7.0.5-6[16]和XnSoft NCONVERT(XSN)v6.88[17];ZIP文件解壓縮程序UnZip 6.00[18];ELF文件分析程序GNU readelf 2.24[19].

2.2 實(shí)驗(yàn)環(huán)境和條件

本實(shí)驗(yàn)主要在一個(gè)VMware上搭建的Ubuntu 14.04虛擬機(jī)中進(jìn)行,為其分配4核2.50 GHz的CPU和4 GB內(nèi)存. 數(shù)據(jù)格式分析部分在Windows 7下使用010 Editor進(jìn)行.

2.3 評(píng)價(jià)方法

測(cè)試中使用的輸入數(shù)據(jù)均是格式已知的數(shù)據(jù)文件,可以通過(guò)格式分析獲取其中每個(gè)字節(jié)代表的意義. 與危險(xiǎn)操作相關(guān)的敏感數(shù)據(jù)主要包括長(zhǎng)度值、寬度值、數(shù)量值、大小等類型的數(shù)據(jù),這些敏感數(shù)據(jù)中的部分?jǐn)?shù)據(jù)在變異后將無(wú)法通過(guò)程序的驗(yàn)證或者不能改變程序的執(zhí)行過(guò)程和結(jié)果,去除這些數(shù)據(jù)的影響,將剩下的敏感數(shù)據(jù)標(biāo)記為關(guān)鍵數(shù)據(jù).

使用關(guān)鍵數(shù)據(jù)定位的精確率P、查全率R、誤報(bào)率F作為評(píng)價(jià)標(biāo)準(zhǔn),其計(jì)算方法如式(4)~(6)所示.

P=PT/(PT+PF)×100%.

(4)

R=PT/(PT+NF)×100%.

(5)

F=PF/(PF+NT)×100%.

(6)

式中:PT為將輸入數(shù)據(jù)中的關(guān)鍵數(shù)據(jù)正確判定為關(guān)鍵數(shù)據(jù)的個(gè)數(shù);NT為將輸入數(shù)據(jù)中的非關(guān)鍵數(shù)據(jù)判定為非關(guān)鍵數(shù)據(jù)的個(gè)數(shù);PF為將輸入數(shù)據(jù)中的非關(guān)鍵數(shù)據(jù)判定為關(guān)鍵數(shù)據(jù)的個(gè)數(shù);NF為將輸入數(shù)據(jù)中的關(guān)鍵數(shù)據(jù)判定為非關(guān)鍵數(shù)據(jù)的個(gè)數(shù).

2.4 實(shí)驗(yàn)過(guò)程和參數(shù)

① 準(zhǔn)備輸入數(shù)據(jù). 為IMC和XSN準(zhǔn)備9個(gè)不同格式的圖片文件(BMP、DDS、GIF、ICO、JPEG、PCX、PNG、TGA、TIFF),為UnZip準(zhǔn)備ZIP格式的文件,為readelf準(zhǔn)備ELF格式的文件. 使用010 Editor中分析這些作為輸入數(shù)據(jù)的文件,記錄文件大小、文件中的敏感數(shù)據(jù). 使用各個(gè)被測(cè)程序處理這些文件,統(tǒng)計(jì)處理過(guò)程中程序執(zhí)行過(guò)的指令數(shù).

② 分析輸入數(shù)據(jù). 依次變異步驟1中記錄的敏感數(shù)據(jù)(每次僅變異一個(gè)字節(jié)),使用相應(yīng)的被測(cè)程序處理變異后的數(shù)據(jù). 查看處理結(jié)果,記錄其中變異后無(wú)法通過(guò)程序驗(yàn)證或者不能改變執(zhí)行過(guò)程和結(jié)果的數(shù)據(jù). 其中,對(duì)于readelf,將變異后僅能造成程序顯示的結(jié)果中的數(shù)字發(fā)生變化的字節(jié)也標(biāo)記為不能改變程序執(zhí)行過(guò)程的項(xiàng).

③ 使用本文的方法分別對(duì)各個(gè)被測(cè)程序進(jìn)行測(cè)試,記錄被標(biāo)記的字節(jié)、跟蹤文件的大小、每次分析的耗時(shí). 將標(biāo)記的字節(jié)與步驟1、2中的分析結(jié)果進(jìn)行對(duì)比并記錄結(jié)果.

④ 使用AFL-Analyze分別對(duì)各個(gè)被測(cè)程序進(jìn)行測(cè)試,記錄標(biāo)記為長(zhǎng)度類型的字節(jié)、每次分析的耗時(shí). 將標(biāo)記的字節(jié)與步驟1、2中的分析結(jié)果進(jìn)行對(duì)比并記錄結(jié)果.

2.5 實(shí)驗(yàn)結(jié)果

初始輸入數(shù)據(jù)的分析結(jié)果如表2所示. 按不同的文件格式考慮,輸入數(shù)據(jù)中包含的敏感數(shù)據(jù)共440字節(jié),占輸入數(shù)據(jù)的3.83%. 考慮不同被測(cè)程序?qū)斎氲奶幚恚瑒t敏感數(shù)據(jù)有704字節(jié),所有的敏感數(shù)據(jù)中有246字節(jié)在變異后無(wú)法通過(guò)被測(cè)程序的驗(yàn)證,335字節(jié)在變異后無(wú)法造成變化,兩種數(shù)據(jù)共581字節(jié),即輸入數(shù)據(jù)中共包含關(guān)鍵數(shù)據(jù)123字節(jié).

表2 初始輸入數(shù)據(jù)分析結(jié)果

關(guān)鍵數(shù)據(jù)的定位結(jié)果如表3所示. 本文的方法的分析耗時(shí)在分鐘級(jí),跟蹤文件的大小在kB級(jí),共將146字節(jié)標(biāo)記為關(guān)鍵數(shù)據(jù),其中確實(shí)是敏感數(shù)據(jù)的有137字節(jié),是關(guān)鍵數(shù)據(jù)的有91字節(jié). 本文方法的關(guān)鍵數(shù)據(jù)定位精確率為62.33%,查全率為73.98%,誤報(bào)率為0.266%. AFL-Analyze的分析耗時(shí)在分鐘級(jí),共將410字節(jié)標(biāo)記為關(guān)鍵數(shù)據(jù),其中確實(shí)是敏感數(shù)據(jù)的有157字節(jié),是關(guān)鍵數(shù)據(jù)的有17字節(jié). AFL-Analyze的關(guān)鍵數(shù)據(jù)定位精確率為4.15%,查全率為13.8%,誤報(bào)率為1.90%.

表3 關(guān)鍵數(shù)據(jù)定位結(jié)果

3 討 論

實(shí)驗(yàn)中使用的輸入數(shù)據(jù)共包含關(guān)鍵數(shù)據(jù)123字節(jié),在所有數(shù)據(jù)中占比僅為0.6%. 本文方法對(duì)91字節(jié)的關(guān)鍵數(shù)據(jù)進(jìn)行準(zhǔn)確定位,是AFL-Analyze的5.35倍;本文方法的定位精確率為62.3%,是AFL-Analyze的15.02倍;AFL-Analyze將393字節(jié)的數(shù)據(jù)誤報(bào)為關(guān)鍵數(shù)據(jù),是本文方法的7.15倍. 本文方法有32字節(jié)的關(guān)鍵數(shù)據(jù)未能定位到,對(duì)這32字節(jié)的數(shù)據(jù)進(jìn)行分析發(fā)現(xiàn),這些字節(jié)變異后,被測(cè)程序在處理變異后的輸入數(shù)據(jù)時(shí),程序執(zhí)行過(guò)程會(huì)發(fā)生部分改變,導(dǎo)致危險(xiǎn)操作的路徑標(biāo)簽發(fā)生改變,進(jìn)而影響本文方法的定位過(guò)程.

如果將誤報(bào)率的計(jì)算范圍縮小到敏感數(shù)據(jù),那么本文方法的誤報(bào)率為7.92%,AFL-Analyze的誤報(bào)率為24.1%. 如果將定位結(jié)果的判定標(biāo)準(zhǔn)擴(kuò)大到敏感數(shù)據(jù),那么本文方法的精確率為93.8%,查全率為19.5%,誤報(bào)率為0.045%;AFL-Analyze的精確率為38.29%,查全率為22.3%,誤報(bào)率為4.15%. 本文方法的精確率和誤報(bào)率優(yōu)于AFL-Analyze,但在查全率上低于AFL-Analyze. 這兩種情況說(shuō)明AFL-Analyze更傾向于將可疑數(shù)據(jù)標(biāo)記為敏感的關(guān)鍵數(shù)據(jù),使其能夠發(fā)現(xiàn)更多的敏感數(shù)據(jù),同時(shí)也會(huì)造成較多的誤判導(dǎo)致精確率下降. 而本文方法通過(guò)路徑標(biāo)簽和數(shù)據(jù)變異排除程序中數(shù)據(jù)驗(yàn)證過(guò)程的影響,降低了誤報(bào)率. 對(duì)兩種方法誤判的字節(jié)進(jìn)行分析發(fā)現(xiàn),本文方法誤判的字節(jié)雖然并不是關(guān)鍵數(shù)據(jù),但其在變異后會(huì)導(dǎo)致被測(cè)程序在處理數(shù)據(jù)時(shí)出現(xiàn)偏差,影響到部分危險(xiǎn)操作的參數(shù);AFL-Analyze誤判的字節(jié)中很多為類型標(biāo)志,變異后將導(dǎo)致輸入數(shù)據(jù)無(wú)法通過(guò)驗(yàn)證.

AFL-Analyze的分析過(guò)程不需要額外的數(shù)據(jù)存儲(chǔ),而本文方法需要儲(chǔ)存跟蹤數(shù)據(jù),并且被測(cè)程序處理輸入時(shí)使用的指令數(shù)越多,跟蹤數(shù)據(jù)越大,相應(yīng)的分析耗時(shí)也會(huì)越長(zhǎng). 其中,本文方法在以UnZip為被測(cè)程序的定位實(shí)驗(yàn)中,總的耗時(shí)明顯與其指令數(shù)不相符. 這主要是因?yàn)楸疚姆椒ㄔ诟櫛粶y(cè)程序時(shí)利用了fork機(jī)制對(duì)整個(gè)分析過(guò)程進(jìn)行加速,而UnZip并不能夠很好地與這種加速方法兼容,導(dǎo)致運(yùn)行速度相對(duì)較慢進(jìn)而影響了整體的分析耗時(shí). 另外,在針對(duì)DDS格式的輸入數(shù)據(jù)進(jìn)行的定位實(shí)驗(yàn)中,本文方法和AFL-Analyze的分析耗時(shí)均明顯小于其他圖片格式. 這主要是因?yàn)楸疚姆椒ê虯FL-Analyze在分析過(guò)程中均需要對(duì)輸入數(shù)據(jù)的每一個(gè)字節(jié)都進(jìn)行變異,整個(gè)分析過(guò)程的耗時(shí)會(huì)隨著輸入數(shù)據(jù)長(zhǎng)度的增加而提高. 實(shí)驗(yàn)中使用的DDS格式的輸入數(shù)據(jù)的長(zhǎng)度約為其他圖片數(shù)據(jù)的60%,因此DDS格式的輸入數(shù)據(jù)的分析耗時(shí)會(huì)更少.

與細(xì)粒度污點(diǎn)分析方法相比,本文方法在跟蹤被測(cè)程序時(shí)記錄的數(shù)據(jù)量更少. 通過(guò)模擬一般細(xì)粒度污點(diǎn)分析記錄跟蹤數(shù)據(jù)的過(guò)程,得到細(xì)粒度污點(diǎn)分析的跟蹤數(shù)據(jù)的大小,如表4和表5所示. 本文方法記錄的kB級(jí)跟蹤數(shù)據(jù)遠(yuǎn)小于一般細(xì)粒度污點(diǎn)分析的MB級(jí)跟蹤文件. 另外,細(xì)粒度污點(diǎn)分析方法沒(méi)有對(duì)得到的結(jié)果做過(guò)多的分析,不能區(qū)分變異后無(wú)法通過(guò)驗(yàn)證的數(shù)據(jù),會(huì)存在比較多的誤報(bào).

表4 細(xì)粒度污點(diǎn)分析跟蹤文件的大小(1)

表5 細(xì)粒度污點(diǎn)分析跟蹤文件的大小(2)

4 結(jié) 論

提出了一種結(jié)合路徑標(biāo)簽和數(shù)據(jù)變異的模糊測(cè)試關(guān)鍵數(shù)據(jù)定位方法,該方法首先通過(guò)靜態(tài)逆向分析對(duì)二進(jìn)制程序中的危險(xiǎn)操作進(jìn)行定位;然后利用基本塊插樁記錄程序的執(zhí)行路徑,同時(shí)利用函數(shù)插樁獲取程序執(zhí)行過(guò)程中危險(xiǎn)操作的參數(shù),并將執(zhí)行到某個(gè)危險(xiǎn)操作時(shí)程序執(zhí)行過(guò)的基本塊序列的哈希作為該危險(xiǎn)操作的路徑標(biāo)簽;最后通過(guò)分析輸入數(shù)據(jù)變異前后相同路徑標(biāo)簽下同一個(gè)危險(xiǎn)操作的參數(shù)變化來(lái)進(jìn)行關(guān)鍵數(shù)據(jù)定位. 實(shí)驗(yàn)結(jié)果表明,本文方法能夠以較低的資源消耗對(duì)輸入數(shù)據(jù)中的關(guān)鍵數(shù)據(jù)進(jìn)行定位,整體的精確率為62.33%,查全率為73.98%,誤報(bào)率為0.266%. 本文方法仍然存在一些無(wú)法發(fā)現(xiàn)的關(guān)鍵數(shù)據(jù),為了解決這一問(wèn)題,下一步將研究如何利用細(xì)粒度污點(diǎn)分析的思想提高關(guān)鍵數(shù)據(jù)定位的查全率.

猜你喜歡
字節(jié)變異關(guān)鍵
硝酸甘油,用對(duì)是關(guān)鍵
No.8 字節(jié)跳動(dòng)將推出獨(dú)立出口電商APP
高考考好是關(guān)鍵
變異
No.10 “字節(jié)跳動(dòng)手機(jī)”要來(lái)了?
變異的蚊子
病毒的變異
蔣百里:“關(guān)鍵是中國(guó)人自己要努力”
人類進(jìn)入“澤它時(shí)代”
鵬鵬豬
兰考县| 志丹县| 尼玛县| 巴青县| 古蔺县| 周口市| 黔西| 荆门市| 江华| 冷水江市| 南开区| 永吉县| 华容县| 岑溪市| 大方县| 灵台县| 西宁市| 奇台县| 吴旗县| 德庆县| 平阴县| 黑山县| 精河县| 湖口县| 克什克腾旗| 宿迁市| 金昌市| 含山县| 桐梓县| 平邑县| 深水埗区| 宁夏| 鄂州市| 双城市| 称多县| 临海市| 鄢陵县| 平顶山市| 金沙县| 汨罗市| 江山市|