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