焦龍龍, 羅森林, 劉望桐, 潘麗敏
(北京理工大學(xué) 信息與電子學(xué)院,北京 100081)
模糊測試是威斯康星大學(xué)麥迪遜分校的Takanen等[1]在1988年提出的一種自動化漏洞挖掘方法[2]. 它首先生成大量畸形測試數(shù)據(jù),然后監(jiān)控被測程序處理這些畸形測試數(shù)據(jù)的過程,最后當(dāng)被測程序發(fā)生異常時,就發(fā)現(xiàn)了一個潛在的安全漏洞[3]. 目前主要存在兩種模糊測試方法:基于生成的模糊測試和基于變異的模糊測試[4].
基于生成的模糊測試需要利用輸入規(guī)范來構(gòu)建輸入數(shù)據(jù)模型. 然而,在沒有輸入規(guī)范或者輸入規(guī)范極端復(fù)雜的情況下,構(gòu)建模型將是一件非常困難的事情[5],使基于生成的模糊測試并不能夠直接對輸入規(guī)范未知的程序進行測試. 基于變異的模糊測試通過對原有的測試數(shù)據(jù)進行變異來生成新的測試數(shù)據(jù),能夠在沒有輸入規(guī)范的情況下完成測試工作. 由于很多程序并沒有對輸入進行嚴(yán)格的檢測,這種方法同樣是一種很有效的測試方法[6].
國內(nèi)外的研究人員已經(jīng)對格式未知的輸入數(shù)據(jù)中的關(guān)鍵數(shù)據(jù)定位問題進行了比較多的研究,主要有人工定位、基于污點分析的定位方法和基于程序執(zhí)行路徑的定位方法.
人工定位是在分析輸入數(shù)據(jù)格式信息的基礎(chǔ)上,對其中包含的關(guān)鍵數(shù)據(jù)進行定位. 人工定位對分析人員的要求比較高,且一般需要比較長的時間. 另外人工定位依賴于格式逆向分析的結(jié)果,但是由于程序中使用的混淆、加密等方法,這類逆向分析的代價會變得非常大[7]. 以Samba項目為例,分析人員花費了12年的時間才成功完成SMB的逆向分析工作[8].
污點分析主要可以分為兩類:粗粒度污點分析和細粒度污點分析. 粗粒度污點分析中,僅存在污染和未污染兩個標(biāo)簽,最終的分析結(jié)果只能判斷出某個位置是否被污染[9],不能定位到污染的具體來源,比如陳廳[10]基于粗粒度污點分析實現(xiàn)的分析工具TVM. 細粒度污點分析為輸入數(shù)據(jù)中每一個區(qū)域分配了不同的標(biāo)簽. 在分析結(jié)果中通過這些標(biāo)簽?zāi)軌驅(qū)ξ廴緛碓催M行定位,比如王鐵磊[11]、梁曉兵[12]等實現(xiàn)的輸入數(shù)據(jù)分析方法. 污點分析需要利用指令級的插樁來搜集數(shù)據(jù),對程序的執(zhí)行過程影響較大,搜集到的跟蹤數(shù)據(jù)也比較龐大,整體的資源消耗較大. 另外,污點分析過程中,沒有考慮程序?qū)斎霐?shù)據(jù)的驗證過程,其定位結(jié)果存在比較多的誤報.
Michal[13]提出一種利用程序執(zhí)行路徑信息對輸入數(shù)據(jù)進行分析的方法. 該方法首先記錄程序處理變異輸入數(shù)據(jù)時的執(zhí)行路徑,然后通過分析執(zhí)行路徑的變化并結(jié)合輸入數(shù)據(jù)本身的數(shù)字特征確定輸入數(shù)據(jù)中各個部分的數(shù)據(jù)類型. 這種方法考慮了程序執(zhí)行路徑對分析結(jié)果的影響,但通過數(shù)字特征進行輔助定位的方式使結(jié)果中存在比較多的誤報.
在使用變異的方式生成測試數(shù)據(jù)時,變異過程針對的是整個輸入空間,而一個程序的輸入空間通常是非常大的[14]. 但是,對于一個程序的輸入數(shù)據(jù)而言,其中與安全敏感的危險操作(如內(nèi)存分配、內(nèi)存拷貝、字符串操作、含有格式化參數(shù)的函數(shù)等)相關(guān)的關(guān)鍵數(shù)據(jù)通常是非常少的. 這些關(guān)鍵數(shù)據(jù)控制著被測程序中的危險操作,對其進行變異具有更大的可能會觸發(fā)程序中相關(guān)的漏洞,有助于提高模糊測試的效率[15]. 在缺乏輸入規(guī)范的情況下,無法通過格式信息進行關(guān)鍵數(shù)據(jù)定位. 而現(xiàn)有的關(guān)鍵數(shù)據(jù)定位方法則存在資源消耗大、誤報率高等問題.
針對這些問題,本文提出一種結(jié)合路徑標(biāo)簽和數(shù)據(jù)變異的模糊測試關(guān)鍵數(shù)據(jù)定位方法,該方法通過插樁監(jiān)控二進制程序處理輸入的測試數(shù)據(jù)的過程,分析輸入數(shù)據(jù)變異前后的處理過程的差異從而對輸入數(shù)據(jù)中與安全敏感操作相關(guān)的關(guān)鍵數(shù)據(jù)進行定位.
針對模糊測試關(guān)鍵數(shù)據(jù)定位中存在的資源消耗大、誤報率較高等問題,本文提出一種結(jié)合路徑標(biāo)簽和數(shù)據(jù)變異的模糊測試關(guān)鍵數(shù)據(jù)定位方法,其原理如圖1所示. 首先通過靜態(tài)分析獲取二進制程序及其依賴庫中危險操作的位置;其次在動態(tài)分析的過程中使用動態(tài)插樁技術(shù)對危險操作進行監(jiān)控并跟蹤被測二進制程序處理輸入數(shù)據(jù)的過程;然后結(jié)合輸入數(shù)據(jù)的變異,得到程序處理這些數(shù)據(jù)的跟蹤數(shù)據(jù);最后通過分析跟蹤數(shù)據(jù)獲取關(guān)鍵數(shù)據(jù)的位置.
通過靜態(tài)分析能夠?qū)ΧM制程序中的危險操作進行定位,從而輔助輸入數(shù)據(jù)中關(guān)鍵數(shù)據(jù)的定位工作. 靜態(tài)分析包含兩方面的工作:分析程序的依賴庫;對程序及其依賴庫中的危險操作進行定位.
一個程序在執(zhí)行時通常需要多個動態(tài)庫的輔助,即程序的依賴庫. 這些庫中同樣會包含一些危險操作. 依賴庫的分析可以使用程序文件對應(yīng)的可執(zhí)行文件分析工具完成,比如Linux下使用ldd命令即可查看ELF格式的可執(zhí)行文件的依賴庫.
程序中內(nèi)存分配、內(nèi)存拷貝、字符串操作、含有格式化參數(shù)的函數(shù)等容易引起安全問題,對這些代碼進行測試有更大的可能發(fā)現(xiàn)問題[12]. 因此將這些函數(shù)定義為危險操作,主要危險函數(shù)如表1所示. 程序執(zhí)行過程所需的函數(shù)信息會記錄在程序文件的某個區(qū)域(如符號表、導(dǎo)入表),利用程序逆向分析技術(shù)即可通過文件格式信息對這些函數(shù)進行定位.
表1 包含危險操作的函數(shù)
動態(tài)分析部分完成實際的關(guān)鍵數(shù)據(jù)定位工作,具體過程如下:首先,利用插樁技術(shù)跟蹤監(jiān)控被測程序的執(zhí)行過程以及其中包含的危險操作;其次,記錄被測程序?qū)Τ跏驾斎霐?shù)據(jù)的處理過程以及其中包含的危險操作;然后逐個變異初始輸入數(shù)據(jù)中的每個字節(jié),記錄被測程序處理這些變異數(shù)據(jù)的過程以及其中包含的危險操作;最后通過對比分析輸入數(shù)據(jù)變異前后記錄到的程序跟蹤數(shù)據(jù)來進行關(guān)鍵數(shù)據(jù)定位.
1.3.1數(shù)據(jù)變異
使用變異操作能夠以初始輸入數(shù)據(jù)為模板,生成大量新的輸入數(shù)據(jù). 變異的過程無需輸入數(shù)據(jù)的規(guī)范,適用于各種格式的數(shù)據(jù). 假設(shè)初始輸入數(shù)據(jù)為X,共包含n字節(jié),當(dāng)對X中的第k字節(jié)使用變異操作m后將得到新的輸入數(shù)據(jù)Xm,k,這樣的一次變異過程可以使用一個函數(shù)來表示,即Xm,k=m(X,k)(1≤k≤n).
本文方法在關(guān)鍵數(shù)據(jù)定位過程中主要通過數(shù)據(jù)變異的方式觀察二進制程序執(zhí)行過程的變化. 定位過程中并不會嘗試使用變異的方式遍歷整個輸入空間,僅利用位翻轉(zhuǎn)的方式依次對X中每一個字節(jié)進行輕微變異,將這個變異操作記為mb,那么針對第k字節(jié)的變異將得到新的輸入數(shù)據(jù)Xmb,k. 該變異過程同樣可以使用一個函數(shù)來表示,即Xmb,k=mb(X,k)(1≤k≤n).
1.3.2程序跟蹤
程序跟蹤主要是監(jiān)控并記錄被測程序的執(zhí)行過程. 程序執(zhí)行過程中需要依賴庫的支持,因此程序跟蹤需要能夠同時對程序及其依賴庫中的代碼執(zhí)行過程進行監(jiān)控. 每一個程序及其依賴庫都是同一種格式的可執(zhí)行文件. 使用E表示一個可執(zhí)行文件,同時假設(shè)程序及其依賴庫共有w個可執(zhí)行文件,那么可將這些可執(zhí)行文件視為集合P={E1,E2,…,Ew}. 可執(zhí)行文件E的代碼可以被劃分成很多基本塊. 使用B表示一個基本塊,同時假設(shè)可執(zhí)行文件Ei的代碼可劃分為Li個基本塊,那么可將Ei視為基本塊的集合EBi={Bi,1,Bi,2,…,Bi,Li}.
PB=∪EBi={B1,B2,…,BL}.
(1)
程序執(zhí)行的過程就是按照某種順序執(zhí)行集合PB中的基本塊,因此執(zhí)行過程的監(jiān)控可以轉(zhuǎn)換為監(jiān)控正在執(zhí)行的基本塊,執(zhí)行過程的記錄則可以轉(zhuǎn)換為記錄執(zhí)行過的基本塊序列.
一個基本塊B有且只有一個入口和一個出口,在其執(zhí)行過程中僅會從入口處開始執(zhí)行并從出口處結(jié)束,故使用基本塊的入口地址b能夠代表一個基本塊并且具有唯一性. 利用基本塊插樁能夠在基本塊B的入口處獲取到基本塊的入口地址b. 因此,基本塊的集合PB可以使用基本塊的入口地址的集合Pb表示,即PB≡Pb={b1,b2,…,bL}.
使用S代表程序的執(zhí)行過程,那么當(dāng)程序執(zhí)行過j個基本塊時,其執(zhí)行過程可記為一個由j個基本塊入口地址組成的序列Sj=(b1,b2,…,bj),其中?1≤i≤j∶bi∈Pb.
程序在執(zhí)行時可能包含多個線程,每個線程均有自己的執(zhí)行過程,需要分別記錄每個線程的基本塊序列,使用線程ID區(qū)分不同線程的基本塊序列,即將線程x的基本塊序列記為Sx,j. 綜上所述,程序跟蹤將得到一個或多個基本塊序列,每個基本塊序列對應(yīng)程序中一個線程的執(zhí)行過程.
1.3.3危險操作監(jiān)控
對危險操作的監(jiān)控需要記錄危險操作對應(yīng)的函數(shù)的名稱、路徑標(biāo)簽和參數(shù). 通過靜態(tài)分析能夠得到函數(shù)的位置,進而利用動態(tài)插樁技術(shù)在函數(shù)的起始位置處進行插樁,就可以在函數(shù)實際執(zhí)行前記錄函數(shù)的相關(guān)信息.
將某個危險操作D對應(yīng)的函數(shù)名稱記為fn. 在動態(tài)插樁時,可以從靜態(tài)分析的結(jié)果得到fn的相關(guān)信息. 因此可將名稱fn的記錄工作寫入插樁的代碼中,在執(zhí)行到危險操作D時直接進行fn的記錄.
假設(shè)危險操作D所在的線程x在執(zhí)行到D時共執(zhí)行過j個基本塊,那么危險操作D對應(yīng)的執(zhí)行路徑就是Sx,j. 執(zhí)行路徑Sx,j本質(zhì)上是一個地址序列,可以當(dāng)作一個基本塊入口地址組成的數(shù)組來處理,將這個數(shù)組通過哈希運算得到哈希值h作為路徑標(biāo)簽t. 那么執(zhí)行到危險操作D時的程序執(zhí)行路徑可使用路徑標(biāo)簽t表示.
將哈希運算視為一個函數(shù)H(salt,data),其中salt為計算哈希值時使用的初始值,data為需要計算哈希值的數(shù)據(jù). 哈希運算H將一個基本塊地址b作為哈希計算的基本單位,設(shè)哈希運算H中對一個基本塊地址b進行哈希計算的過程為函數(shù)HH(salt,b).
當(dāng)data中只有一個基本塊地址b時,直接使用HH進行哈希計算,即h=H(salt,b)=HH(salt,b). 當(dāng)data中含有多個基本塊地址時,設(shè)data=Sx,j=(b1,b2,…,bj),采取依次對每一個基本塊進行哈希的方式進行計算,并且將前一個地址得到的哈希值作為下一個地址進行哈希計算時的salt,整個過程如式(2)所示.
(2)
使用上述計算過程,意味著路徑Sx,j的哈希值hj可以在執(zhí)行到基本塊bj時,通過前一個路徑狀態(tài)Sx,j-1的哈希值hj-1經(jīng)過一次簡單的哈希計算得出,無需從b1開始進行計算,能夠減少許多不必要的計算. 綜上,可將Sx,j的哈希值hj作為危險操作D的路徑標(biāo)簽t.
函數(shù)參數(shù)的記錄需根據(jù)運行環(huán)境進行區(qū)分. 不同的運行環(huán)境下,每個函數(shù)的參數(shù)有不同的儲存方式,通過函數(shù)的調(diào)用約定可以獲取其參數(shù)的儲存位置. 例如x86平臺下主要有cdecl、stdcall和fastcall 3種函數(shù)調(diào)用約定,所有調(diào)用約定中,函數(shù)參數(shù)均儲存在寄存器或線程棧中. 因此,在函數(shù)執(zhí)行前根據(jù)調(diào)用約定和函數(shù)定義讀取寄存器和線程棧中的數(shù)據(jù)即可獲取函數(shù)參數(shù). 當(dāng)函數(shù)有g(shù)個參數(shù)時,函數(shù)參數(shù)可按照從左到右的順序記為一個參數(shù)序列PA=(p1,p2,…,pg). 定義函數(shù)gp()為從參數(shù)序列PA中獲取第k個參數(shù),那么pk=gp(PA,k)(1≤k≤g).
綜上所述,對于一個危險操作D,通過危險操作監(jiān)控將得到D的函數(shù)名fn、路徑標(biāo)簽t、參數(shù)序列PA. 使用一個三元組(fn,t,PA)表示危險操作D的相關(guān)信息并將其記為I,即I=(fn,t,PA). 同時分別使用I[0]、I[1]、I[2]代表三元組I中的數(shù)據(jù)fn、t、PA.
將程序跟蹤和危險操作監(jiān)控的過程抽象為一個函數(shù)Trace(),那么一個輸入數(shù)據(jù)X在經(jīng)過函數(shù)Trace()的處理后,將得到一組關(guān)于危險操作的跟蹤數(shù)據(jù),使用集合T表示這組跟蹤數(shù)據(jù),整個過程如式(3)所示為
T=Trace(P,X)={I1,I2,I3,…}.
(3)
1.3.4跟蹤數(shù)據(jù)分析
設(shè)初始輸入數(shù)據(jù)X對應(yīng)的跟蹤數(shù)據(jù)集合為T0=Trace(P,X),變異輸入數(shù)據(jù)Xmb,k對應(yīng)的跟蹤數(shù)據(jù)集合為Tk=Trace(P,Xmb,k)(1≤k≤n).
危險操作D對應(yīng)的函數(shù)為fn,如果函數(shù)fn的某個參數(shù)來源于輸入數(shù)據(jù),那么輸入數(shù)據(jù)就能夠?qū)@個參數(shù)進行一定程度的控制. 輸入數(shù)據(jù)中能夠控制危險函數(shù)參數(shù)的數(shù)據(jù)就是所要查找的關(guān)鍵數(shù)據(jù). 也就是說,如果存在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ù)造成了同樣位置的相同危險函數(shù)的參數(shù)發(fā)生變化,即第k字節(jié)能夠控制危險操作的參數(shù),因此將第k字節(jié)標(biāo)記為關(guān)鍵數(shù)據(jù). 通過這種方式逐個分析輸入數(shù)據(jù)X中的每一個字節(jié),能夠獲取到所有符合要求的字節(jié),并得到關(guān)鍵數(shù)據(jù)的集合SK.
跟蹤數(shù)據(jù)分析的過程可以使用算法1來表示,其中函數(shù)GetElement(T,t)(第2行)是從跟蹤數(shù)據(jù)集合T中取出路徑標(biāo)簽是t的跟蹤數(shù)據(jù). 如果以路徑標(biāo)簽為鍵(Key)將跟蹤數(shù)據(jù)集合T0轉(zhuǎn)換為一個哈希表,那么可以將從集合中取數(shù)據(jù)的操作優(yōu)化為常數(shù)時間,因此每一輪的分析工作耗時將僅與Tk的大小相關(guān). 另外,從算法中可以看出,在定位過程中,需要長期儲存的僅有初始輸入數(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]中元素的個數(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
使用本實驗測試本文提出的方法進行關(guān)鍵數(shù)據(jù)定位時的準(zhǔn)確性,并與模糊測試工具AFL[13]中的AFL-Analyze模塊進行對比. 使用4個常見的文件處理型程序作為實驗中的被測程序:圖片格式轉(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].
本實驗主要在一個VMware上搭建的Ubuntu 14.04虛擬機中進行,為其分配4核2.50 GHz的CPU和4 GB內(nèi)存. 數(shù)據(jù)格式分析部分在Windows 7下使用010 Editor進行.
測試中使用的輸入數(shù)據(jù)均是格式已知的數(shù)據(jù)文件,可以通過格式分析獲取其中每個字節(jié)代表的意義. 與危險操作相關(guān)的敏感數(shù)據(jù)主要包括長度值、寬度值、數(shù)量值、大小等類型的數(shù)據(jù),這些敏感數(shù)據(jù)中的部分數(shù)據(jù)在變異后將無法通過程序的驗證或者不能改變程序的執(zhí)行過程和結(jié)果,去除這些數(shù)據(jù)的影響,將剩下的敏感數(shù)據(jù)標(biāo)記為關(guān)鍵數(shù)據(jù).
使用關(guān)鍵數(shù)據(jù)定位的精確率P、查全率R、誤報率F作為評價標(biāo)準(zhǔn),其計算方法如式(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ù)的個數(shù);NT為將輸入數(shù)據(jù)中的非關(guān)鍵數(shù)據(jù)判定為非關(guān)鍵數(shù)據(jù)的個數(shù);PF為將輸入數(shù)據(jù)中的非關(guān)鍵數(shù)據(jù)判定為關(guān)鍵數(shù)據(jù)的個數(shù);NF為將輸入數(shù)據(jù)中的關(guān)鍵數(shù)據(jù)判定為非關(guān)鍵數(shù)據(jù)的個數(shù).
① 準(zhǔn)備輸入數(shù)據(jù). 為IMC和XSN準(zhǔn)備9個不同格式的圖片文件(BMP、DDS、GIF、ICO、JPEG、PCX、PNG、TGA、TIFF),為UnZip準(zhǔn)備ZIP格式的文件,為readelf準(zhǔn)備ELF格式的文件. 使用010 Editor中分析這些作為輸入數(shù)據(jù)的文件,記錄文件大小、文件中的敏感數(shù)據(jù). 使用各個被測程序處理這些文件,統(tǒng)計處理過程中程序執(zhí)行過的指令數(shù).
② 分析輸入數(shù)據(jù). 依次變異步驟1中記錄的敏感數(shù)據(jù)(每次僅變異一個字節(jié)),使用相應(yīng)的被測程序處理變異后的數(shù)據(jù). 查看處理結(jié)果,記錄其中變異后無法通過程序驗證或者不能改變執(zhí)行過程和結(jié)果的數(shù)據(jù). 其中,對于readelf,將變異后僅能造成程序顯示的結(jié)果中的數(shù)字發(fā)生變化的字節(jié)也標(biāo)記為不能改變程序執(zhí)行過程的項.
③ 使用本文的方法分別對各個被測程序進行測試,記錄被標(biāo)記的字節(jié)、跟蹤文件的大小、每次分析的耗時. 將標(biāo)記的字節(jié)與步驟1、2中的分析結(jié)果進行對比并記錄結(jié)果.
④ 使用AFL-Analyze分別對各個被測程序進行測試,記錄標(biāo)記為長度類型的字節(jié)、每次分析的耗時. 將標(biāo)記的字節(jié)與步驟1、2中的分析結(jié)果進行對比并記錄結(jié)果.
初始輸入數(shù)據(jù)的分析結(jié)果如表2所示. 按不同的文件格式考慮,輸入數(shù)據(jù)中包含的敏感數(shù)據(jù)共440字節(jié),占輸入數(shù)據(jù)的3.83%. 考慮不同被測程序?qū)斎氲奶幚?,則敏感數(shù)據(jù)有704字節(jié),所有的敏感數(shù)據(jù)中有246字節(jié)在變異后無法通過被測程序的驗證,335字節(jié)在變異后無法造成變化,兩種數(shù)據(jù)共581字節(jié),即輸入數(shù)據(jù)中共包含關(guān)鍵數(shù)據(jù)123字節(jié).
表2 初始輸入數(shù)據(jù)分析結(jié)果
關(guān)鍵數(shù)據(jù)的定位結(jié)果如表3所示. 本文的方法的分析耗時在分鐘級,跟蹤文件的大小在kB級,共將146字節(jié)標(biāo)記為關(guān)鍵數(shù)據(jù),其中確實是敏感數(shù)據(jù)的有137字節(jié),是關(guān)鍵數(shù)據(jù)的有91字節(jié). 本文方法的關(guān)鍵數(shù)據(jù)定位精確率為62.33%,查全率為73.98%,誤報率為0.266%. AFL-Analyze的分析耗時在分鐘級,共將410字節(jié)標(biāo)記為關(guān)鍵數(shù)據(jù),其中確實是敏感數(shù)據(jù)的有157字節(jié),是關(guān)鍵數(shù)據(jù)的有17字節(jié). AFL-Analyze的關(guān)鍵數(shù)據(jù)定位精確率為4.15%,查全率為13.8%,誤報率為1.90%.
表3 關(guān)鍵數(shù)據(jù)定位結(jié)果
實驗中使用的輸入數(shù)據(jù)共包含關(guān)鍵數(shù)據(jù)123字節(jié),在所有數(shù)據(jù)中占比僅為0.6%. 本文方法對91字節(jié)的關(guān)鍵數(shù)據(jù)進行準(zhǔn)確定位,是AFL-Analyze的5.35倍;本文方法的定位精確率為62.3%,是AFL-Analyze的15.02倍;AFL-Analyze將393字節(jié)的數(shù)據(jù)誤報為關(guān)鍵數(shù)據(jù),是本文方法的7.15倍. 本文方法有32字節(jié)的關(guān)鍵數(shù)據(jù)未能定位到,對這32字節(jié)的數(shù)據(jù)進行分析發(fā)現(xiàn),這些字節(jié)變異后,被測程序在處理變異后的輸入數(shù)據(jù)時,程序執(zhí)行過程會發(fā)生部分改變,導(dǎo)致危險操作的路徑標(biāo)簽發(fā)生改變,進而影響本文方法的定位過程.
如果將誤報率的計算范圍縮小到敏感數(shù)據(jù),那么本文方法的誤報率為7.92%,AFL-Analyze的誤報率為24.1%. 如果將定位結(jié)果的判定標(biāo)準(zhǔn)擴大到敏感數(shù)據(jù),那么本文方法的精確率為93.8%,查全率為19.5%,誤報率為0.045%;AFL-Analyze的精確率為38.29%,查全率為22.3%,誤報率為4.15%. 本文方法的精確率和誤報率優(yōu)于AFL-Analyze,但在查全率上低于AFL-Analyze. 這兩種情況說明AFL-Analyze更傾向于將可疑數(shù)據(jù)標(biāo)記為敏感的關(guān)鍵數(shù)據(jù),使其能夠發(fā)現(xiàn)更多的敏感數(shù)據(jù),同時也會造成較多的誤判導(dǎo)致精確率下降. 而本文方法通過路徑標(biāo)簽和數(shù)據(jù)變異排除程序中數(shù)據(jù)驗證過程的影響,降低了誤報率. 對兩種方法誤判的字節(jié)進行分析發(fā)現(xiàn),本文方法誤判的字節(jié)雖然并不是關(guān)鍵數(shù)據(jù),但其在變異后會導(dǎo)致被測程序在處理數(shù)據(jù)時出現(xiàn)偏差,影響到部分危險操作的參數(shù);AFL-Analyze誤判的字節(jié)中很多為類型標(biāo)志,變異后將導(dǎo)致輸入數(shù)據(jù)無法通過驗證.
AFL-Analyze的分析過程不需要額外的數(shù)據(jù)存儲,而本文方法需要儲存跟蹤數(shù)據(jù),并且被測程序處理輸入時使用的指令數(shù)越多,跟蹤數(shù)據(jù)越大,相應(yīng)的分析耗時也會越長. 其中,本文方法在以UnZip為被測程序的定位實驗中,總的耗時明顯與其指令數(shù)不相符. 這主要是因為本文方法在跟蹤被測程序時利用了fork機制對整個分析過程進行加速,而UnZip并不能夠很好地與這種加速方法兼容,導(dǎo)致運行速度相對較慢進而影響了整體的分析耗時. 另外,在針對DDS格式的輸入數(shù)據(jù)進行的定位實驗中,本文方法和AFL-Analyze的分析耗時均明顯小于其他圖片格式. 這主要是因為本文方法和AFL-Analyze在分析過程中均需要對輸入數(shù)據(jù)的每一個字節(jié)都進行變異,整個分析過程的耗時會隨著輸入數(shù)據(jù)長度的增加而提高. 實驗中使用的DDS格式的輸入數(shù)據(jù)的長度約為其他圖片數(shù)據(jù)的60%,因此DDS格式的輸入數(shù)據(jù)的分析耗時會更少.
與細粒度污點分析方法相比,本文方法在跟蹤被測程序時記錄的數(shù)據(jù)量更少. 通過模擬一般細粒度污點分析記錄跟蹤數(shù)據(jù)的過程,得到細粒度污點分析的跟蹤數(shù)據(jù)的大小,如表4和表5所示. 本文方法記錄的kB級跟蹤數(shù)據(jù)遠小于一般細粒度污點分析的MB級跟蹤文件. 另外,細粒度污點分析方法沒有對得到的結(jié)果做過多的分析,不能區(qū)分變異后無法通過驗證的數(shù)據(jù),會存在比較多的誤報.
表4 細粒度污點分析跟蹤文件的大小(1)
表5 細粒度污點分析跟蹤文件的大小(2)
提出了一種結(jié)合路徑標(biāo)簽和數(shù)據(jù)變異的模糊測試關(guān)鍵數(shù)據(jù)定位方法,該方法首先通過靜態(tài)逆向分析對二進制程序中的危險操作進行定位;然后利用基本塊插樁記錄程序的執(zhí)行路徑,同時利用函數(shù)插樁獲取程序執(zhí)行過程中危險操作的參數(shù),并將執(zhí)行到某個危險操作時程序執(zhí)行過的基本塊序列的哈希作為該危險操作的路徑標(biāo)簽;最后通過分析輸入數(shù)據(jù)變異前后相同路徑標(biāo)簽下同一個危險操作的參數(shù)變化來進行關(guān)鍵數(shù)據(jù)定位. 實驗結(jié)果表明,本文方法能夠以較低的資源消耗對輸入數(shù)據(jù)中的關(guān)鍵數(shù)據(jù)進行定位,整體的精確率為62.33%,查全率為73.98%,誤報率為0.266%. 本文方法仍然存在一些無法發(fā)現(xiàn)的關(guān)鍵數(shù)據(jù),為了解決這一問題,下一步將研究如何利用細粒度污點分析的思想提高關(guān)鍵數(shù)據(jù)定位的查全率.