崔鵬宇
摘要:本文探討了處于動態(tài)符號執(zhí)行架構(gòu)下的漏洞挖掘技術(shù),研究分析了多漏洞主動式集成挖掘平臺。
關(guān)鍵詞:漏洞發(fā)掘;挖掘效率;MLIIMP
中圖分類號:TP393.08 文獻(xiàn)標(biāo)識碼:A 文章編號:1007-9416(2018)09-0197-01
隨著越來越多的軟件開發(fā)項(xiàng)目的進(jìn)行,軟件測試也越來越受到關(guān)注。其中,漏洞發(fā)掘作為軟件測試的主要目的之一,不少專家對其相關(guān)技術(shù)展開了積極的研究工作[1-2]。動態(tài)符號執(zhí)行技術(shù)因在漏洞發(fā)掘方面具有非常突出的優(yōu)勢,使其成了關(guān)鍵技術(shù)。因動態(tài)符號執(zhí)行將對被測試程序執(zhí)行,能夠獲得其具體運(yùn)行時(shí)產(chǎn)生的數(shù)據(jù),所以相對于靜態(tài)分析技術(shù)來說,具有更高的準(zhǔn)確性。與過去的黑盒測試技術(shù)對比來說,這一個技術(shù)具有相對較高的代碼覆蓋率,正因如此,其可以將更多的漏洞發(fā)掘出[3]。為了克服不足之處,筆者首先探討了處于動態(tài)符號執(zhí)行架構(gòu)下的漏洞挖掘技術(shù),然后開發(fā)出相應(yīng)的多漏洞主動式集成挖掘平臺,MLIIMP結(jié)合了動態(tài)符號執(zhí)行方法以及主動式挖掘技術(shù)的優(yōu)勢,并采用先進(jìn)的路徑搜索方法,對軟件測試的漏洞檢測準(zhǔn)確性起到了非常大的作用。
1 MLIIMP的設(shè)計(jì)與實(shí)現(xiàn)
1.1 主動式漏洞發(fā)掘
長期以來,業(yè)界通常使用被動式的漏洞發(fā)掘技術(shù)方法,而MLIIMP則為一種主動式的技術(shù)。所謂主動式漏洞發(fā)掘,即測試用例并未將漏洞觸發(fā),然而在具體執(zhí)行的時(shí)候,利用某特定的技術(shù)產(chǎn)生了約束,之后對這一個約束進(jìn)行求解,形成新測試用例,從而將漏洞觸發(fā)。為對路徑可變漏洞進(jìn)行發(fā)掘,該系統(tǒng)提出了漏洞約束,相對于一般的約束來說,其在形式上并不存在很大的差異,然而它的功能并非探索其他的程序路徑,而是將當(dāng)前路徑上存在的漏洞檢測出來。具體見圖1所示。
當(dāng)x符合約束時(shí),在這種情況下能夠確保觸發(fā)語句6的漏洞,在這里屬于普通約束,如果滿足這一條件,就能夠確保路徑被執(zhí)行,而為漏洞約束,如果滿足這一條件,就能夠確保這一個路徑上的漏洞被觸發(fā)。為了達(dá)到主動式漏洞發(fā)掘的目標(biāo),MLIIMP監(jiān)控了被測試程序,當(dāng)那些存在形成漏洞可能性的指令被執(zhí)行時(shí),則主動將漏洞約束注入到路徑條件中,在此基礎(chǔ)上對其加以標(biāo)記,通過這種方式來對普通與漏洞約束進(jìn)行有效區(qū)分。探究路徑過程中,并沒有對漏洞約束實(shí)施否定,這是由于其并非用來表示程序分支的。
1.2 漏洞檢測器
作為一個漏洞發(fā)掘系統(tǒng),MLIIMP能夠?qū)崿F(xiàn)若干種漏洞的發(fā)掘。我們開發(fā)的MLIIMP系統(tǒng)能夠?qū)崿F(xiàn)以下四種漏洞發(fā)掘,接下來筆者將簡要闡明各種類型。
(1)數(shù)組越界檢測器。其作用是對數(shù)組越界錯誤進(jìn)行檢測,比如圖1之中語句6的漏洞。其主要涉及到三項(xiàng)關(guān)鍵技術(shù):首先為符號索引跟蹤,也就是對符號自其他變量向數(shù)組傳播進(jìn)行跟蹤的索引,其次為數(shù)組操作識別,最后為數(shù)組界限檢測,也就是對數(shù)組的合法區(qū)域進(jìn)行檢測。
具體來說,其運(yùn)行流程如下所示:首先是對符號傳播進(jìn)行跟蹤,當(dāng)發(fā)現(xiàn)符號作為索引來訪問數(shù)組的時(shí)候,即會對當(dāng)前棧幀范圍進(jìn)行查詢,通過這種方式得到數(shù)組界限,并且形成違反條件的漏洞約束,同時(shí)在當(dāng)前的路徑條件中將其注入。具體來說,所形成的新路徑條件可通過下面的公式描述:
(1)
式中,pc和pc'分別是指新、老的路徑條件,e指符號索引的符號表達(dá)式,代表注入的漏洞約束,與依次指數(shù)組的上、下界。因此,滿足新的路徑條件必將觸發(fā)數(shù)組越界錯誤。
(2)除0錯誤檢測器。其主要作用是對除0錯誤漏洞進(jìn)行發(fā)掘,其具體的流程如下所示:首先對符號傳播進(jìn)行跟蹤,當(dāng)符號作為除數(shù)時(shí),形成相應(yīng)的漏洞約束,之后在路徑條件中將其注入,接下來對新路徑條件進(jìn)行求解,利用這種方式得到能夠觸發(fā)除0錯誤的測試用例。具體來說,所得到的新路徑條件可通過下面的公式描述:
(2)
式中,與兩者依次是指新、舊路徑條件,e表示的含義與上文相同。這樣我們就能夠得知,當(dāng)滿足時(shí),必然會將除0錯誤觸發(fā)。
1.3 優(yōu)化路徑搜索
MLIIMP開發(fā)出優(yōu)化的路徑搜索方法,其一方面避免了對相同路徑的重復(fù)執(zhí)行,另一方面還可以提高發(fā)掘速度。這一個方法的基本工作原理如下所示:首先,在路徑探索過程中,僅僅將普通約束否定,原因是漏洞約束的作用不是表示程序分支的。其次,先執(zhí)行關(guān)鍵函數(shù)與指令多的路徑,原因是其數(shù)目越多,表明這一個路徑里面就越有可能有漏洞。
2 實(shí)驗(yàn)與分析
MS06-001漏洞為Windows Meta File(WMF)文件格式的,一般情況下,WMF文件往往是在圖像存儲中使用的。其格式中具有1個WMFHEAD頭與許多WMFRECORD數(shù)據(jù)結(jié)構(gòu)。后者決定著調(diào)用什么GDI函數(shù),其函數(shù)成員的低8位當(dāng)做索引。當(dāng)索引值是0x26時(shí),在這種情況下,將會調(diào)用Escape函數(shù),其還能夠?qū)etAbortProc函數(shù)進(jìn)行調(diào)用。由于WMFRECORD中的第9個字節(jié)代表輸入結(jié)構(gòu)的字節(jié)數(shù),這樣在對WMFRECORD結(jié)構(gòu)進(jìn)行解析過程中,所有從首個0x90起的代碼均得到執(zhí)行。因此,為能夠?qū)S06-001漏洞觸發(fā),一定要將WMFRECORD的第9個字節(jié)設(shè)定成0x16,具體可以通過下面的圖形進(jìn)行描述。
黑盒測試技術(shù)觸發(fā)MS06-001的難度非常大,由于這一個漏洞觸發(fā)的條件有兩個,分別為:(1)WMFRECORD的第5個字節(jié)是0x26,通過這種方法所形成的測試用例之中,僅僅1/256的能夠符合該條件。(2)WMFRECORD的第9個字節(jié)是0x16,通過這種方法滿足該要求的可能性同樣僅僅為1/256。因此,該技術(shù)觸發(fā)的可能性僅僅為1/65536。但在具體的實(shí)踐中,因會受到其他條件的制約,該技術(shù)觸發(fā)MS06-001的可能性比上面的數(shù)值小得多。
與傳統(tǒng)算法相比,MLIIMP在消耗相對偏少的資源與時(shí)間的情況下觸發(fā)MS06-001漏洞。通過驗(yàn)證可以看出,路徑條件的deepth平均是906,這就說明存在的約束數(shù)目為906個,平均執(zhí)行為1763456條指令數(shù),符號化了14581個字節(jié)的輸入。MLIIMP總計(jì)形成測試用例372個,其中47個能夠?qū)S06-001漏洞觸發(fā),這47個所形成的路徑條件的深度平均是72。從中發(fā)現(xiàn),MS06-001處在相對較淺的程序路徑上。所需要的測試時(shí)間總共是234分鐘。
3 結(jié)語
本文主要是探討了動態(tài)符號執(zhí)行架構(gòu)下的漏洞自動化發(fā)掘技術(shù),設(shè)計(jì)并實(shí)現(xiàn)新的MLIIMP系統(tǒng)。到現(xiàn)在為止,這一個系統(tǒng)能夠發(fā)掘四種漏洞。其存在幾方面優(yōu)勢:多種漏洞檢測器、主動式漏洞發(fā)掘、優(yōu)化路徑搜索方法。但是,考慮到這一系統(tǒng)對于那些因長度造成的緩沖區(qū)溢出的漏洞發(fā)掘不支持,這也是下一步優(yōu)化研究的方向。
參考文獻(xiàn)
[1]黃暉,陸余良,夏陽.基于動態(tài)符號執(zhí)行的二進(jìn)制程序缺陷發(fā)現(xiàn)系統(tǒng)[J].計(jì)算機(jī)應(yīng)用研究,2013,(9):2810-2812.
[2]邵巳航,蘇亭,顧斌,等.基于過程間動態(tài)符號執(zhí)行的C語言測試框架[J].計(jì)算機(jī)工程與設(shè)計(jì),2014,(8):2746-2751.
[3]邢玉鳳.二進(jìn)制代碼的漏洞挖掘技術(shù)研究[J].計(jì)算機(jī)測量與控制,2014,(12):4111-4114.