蔡軍,鄒鵬 ,馬金鑫,何駿
(1.裝備學(xué)院 復(fù)雜電子系統(tǒng)仿真實驗室,北京101416; 2.中國信息安全測評中心,北京100085)
21 世紀是網(wǎng)絡(luò)時代,信息網(wǎng)絡(luò)已經(jīng)成為全球經(jīng)濟中最重要的基礎(chǔ)設(shè)施,與此同時,網(wǎng)絡(luò)安全問題成為潛藏在我們每一個人身邊的現(xiàn)實威脅,軟件漏洞是網(wǎng)絡(luò)安全問題的根源之一,大部分網(wǎng)絡(luò)攻擊都是基于軟件漏洞來實施的.例如2014 年9 月發(fā)現(xiàn)的“ShellShock”漏洞,被稱為是歷來發(fā)現(xiàn)的最嚴重和最普遍的軟件漏洞之一,利用這一漏洞,遠程攻擊者可能在受影響的系統(tǒng)上執(zhí)行任意代碼,其危害性震撼全球.因此,軟件漏洞檢測在網(wǎng)絡(luò)安全領(lǐng)域受到了越來越多的關(guān)注.
本文主要研究面向二進制程序的動態(tài)漏洞檢測方法.目前主流的動態(tài)漏洞檢測方法包括模糊測試、動態(tài)符號執(zhí)行和動態(tài)污點分析3 種方法.模糊測試的基本思想是:構(gòu)造大量畸形輸入,交給目標程序執(zhí)行,如果程序產(chǎn)生異常(崩潰、掛起等),就有可能存在一個潛在的漏洞;動態(tài)污點分析追蹤用戶輸入在程序執(zhí)行過程中的傳播,通過檢查軟件中的安全敏感操作的輸入數(shù)據(jù)是否為污點數(shù)據(jù)來檢測漏洞.以上兩種方法都有各自的優(yōu)缺點,模糊測試使用簡單但是隨機性太強,動態(tài)污點分析能夠精確分析漏洞成因但是只能分析當前已經(jīng)執(zhí)行到的程序路徑,使用這兩種方法的共同缺點是難以獲得較高的代碼覆蓋率.代碼覆蓋率是軟件在測試中執(zhí)行到的代碼量占軟件代碼總量的比率.理論上,如果軟件在某次測試中能達到百分之百的代碼覆蓋率,就能發(fā)現(xiàn)其所有漏洞.與模糊測試、動態(tài)污點分析相比,動態(tài)符號執(zhí)行在提高軟件測試代碼覆蓋率方面具有很大的優(yōu)勢,成為漏洞檢測技術(shù)的研究熱點和發(fā)展趨勢.
本文針對現(xiàn)有動態(tài)符號執(zhí)行方法在通過約束求解生成測試用例時,生成的測試用例存在大量重復(fù)或近似重復(fù)的問題,提出了一種基于禁忌搜索(Tabu Search,TS)的動態(tài)符號執(zhí)行方法,并實現(xiàn)了一個相應(yīng)的工具原型SwordSE.SwordSE 的核心思想為:①以Valgrind VEX[1]中間表示作為符號執(zhí)行的基礎(chǔ),通過動態(tài)插樁來實現(xiàn)符號引入、符號傳播和約束收集;②使用Simple Theorem Prover(STP)[2]約束求解器求解路徑約束來生成測試用例,通過約束分析和求解緩存來提高求解效率;③以禁忌搜索算法作為路徑搜索算法,減少重復(fù)測試和避免循環(huán),提高路徑搜索效率.
禁忌搜索算法是一種亞啟發(fā)式(meta-heuristic)隨機搜索算法,它從一個初始可行解出發(fā),選擇一系列的特定搜索方向(移動)作為試探,選擇實現(xiàn)讓特定的目標函數(shù)值變化最多的移動.為了避免陷入局部最優(yōu)解,禁忌搜索采用禁忌表(tabu list)對已經(jīng)進行的優(yōu)化過程進行記錄和選擇,指導(dǎo)下一步的搜索方向[3-5].
禁忌搜索算法的特征由禁忌對象和長度、候選集和評價函數(shù)、停止規(guī)則和一些計算信息組成.具體可描述為[6]:
步驟1 初始化禁忌表H =?,選定一個初始解xnow.
步驟2 滿足停止規(guī)則時,停止計算,輸出結(jié)果;否則,在xnow的鄰域N(xnow)中選出滿足不受禁忌的候選集Can_N(xnow);在Can_N(xnow)中選一個評價值最佳的解xnext,xnow:=xnext;更新歷史記錄H,重復(fù)步驟2.
動態(tài)符號執(zhí)行以符號輸入代替實際輸入,以符號表達式代表程序變量,在模擬程序執(zhí)行過程中遇到分支時收集約束條件,通過求解約束條件并自動生成測試用例來遍歷程序中的所有可達路徑[7-9].從2005 年最早出現(xiàn)至今,已經(jīng)涌現(xiàn)出了一些優(yōu)秀的動態(tài)符號執(zhí)行工具,本文對它們做了一個對比分析,重點比較它們采用的路徑搜索算法.如表1 所示,可以看出,各個工具采用的路徑搜索算法不盡相同,DART 和CUTE 的算法最簡單,僅僅使用了深度優(yōu)先算法,S2E 的算法相對復(fù)雜,綜合使用了深度優(yōu)先、廣度優(yōu)先和隨機算法.總的來說,動態(tài)符號執(zhí)行的路徑搜索算法正朝著智能化、多樣化的方向發(fā)展,另外一個趨勢是由面向源碼向直接面向二進制程序發(fā)展.
表1 典型動態(tài)符號執(zhí)行工具對比Table 1 Contrast of typical dynamic symbolic execution tools
SwordSE 是在開源動態(tài)符號執(zhí)行工具Fuzzgrind[15]的基礎(chǔ)上設(shè)計實現(xiàn)的,其工作流程如圖1所示.種子輸入是提供給目標程序的初始輸入,分為兩類:一類是文件,一類是命令行參數(shù).符號引入、符號傳播和約束收集這3 個步驟借助Valgrind 插樁平臺完成,約束求解這一步驟借助STP求解器完成.給定一個種子輸入和一個目標程序,SwordSE 就會自動搜索程序的不同執(zhí)行路徑,并為每一條執(zhí)行路徑生成一個測試用例,如果在某條執(zhí)行路徑上有異常,就將相應(yīng)的測試用例保存到一個專門的文件夾中.SwordSE 的設(shè)計目標是在盡可能短的時間內(nèi)找到盡可能多的沒有重復(fù)的路徑,獲得盡可能高的代碼覆蓋率.
圖1 SwordSE 工作流程Fig.1 Workflow of SwordSE
Valgrind 是運行在Linux 系統(tǒng)上的一個開源的動態(tài)二進制插樁平臺,它使用VEX 中間表示(Intermediate Representation,IR)來實施代碼分析和插樁.使用中間表示的好處有兩點:①中間表示是體系結(jié)構(gòu)無關(guān)的,對于不同的指令體系表示是一致的;②中間表示將復(fù)雜的二進制指令轉(zhuǎn)換成了簡單的中間表達形式,相比直接分析二進制指令,分析中間表示要簡單得多.SwordSE 收集的路徑約束就是由中間表示構(gòu)成的公式,下面詳細介紹約束收集過程.
2.1.1 符號引入
符號引入是將用戶輸入符號化的過程.SwordSE 當前支持兩類輸入的符號化:一類是文件類輸入,一類是命令行輸入,兩類輸入均以字節(jié)為單位進行符號化,即一個字節(jié)對應(yīng)一個符號變量.
對于文件類輸入,通過編寫回調(diào)函數(shù),調(diào)用“VG_(needs_syscall_wrapper)”函數(shù)插樁文件相關(guān)系統(tǒng)調(diào)用來引入符號,首先插樁open 系統(tǒng)調(diào)用,如果打開的是指定的輸入文件,則將其文件描述符fd 加入到感興趣的描述符集合中;接下來插樁read 系統(tǒng)調(diào)用,如果讀取的是感興趣的描述符集合中的文件,則引入符號,即為每一個讀入的字節(jié)指派一個符號變量,并將這個字節(jié)在內(nèi)存中的存放地址加入到受依賴的地址集合.最后還要插樁close 系統(tǒng)調(diào)用,如果有打開的文件被關(guān)閉了,就將其對應(yīng)的fd 從感興趣的描述符集合中刪除.另外,還需要對mmap 系統(tǒng)調(diào)用做類似于read 的插樁,因為有些程序是通過mmap 讀入文件數(shù)據(jù)的.
對于命令行輸入,則調(diào)用“VG_(track_pre_thread_first_insn)”函數(shù)來插樁線程,捕捉傳遞給線程的命令行參數(shù)及參數(shù)的存放地址.每個參數(shù)是一個字符串,SwordSE 為字符串的每一個字節(jié)(字符)指派一個符號變量,并將其存放地址加入到受依賴的地址集合.SwordSE 不能同時將文件和命令行設(shè)為符號,要么符號化文件輸入,要么符號化命令行輸入.
2.1.2 符號傳播
符號傳播是根據(jù)程序執(zhí)行語義,追蹤程序變量對輸入的依賴,將程序變量由上一步引入的符號變量的表達式來表示.符號傳播也是通過插樁回調(diào)函數(shù)來實現(xiàn),SwordSE 直接在VEX IR 上做插樁,插樁的基本單位為中間表示超級塊(Intermediate Representation Super Block,IRSB).一 個IRSB 可以代表1 ~50 條匯編指令,它是一個單入口多出口的代碼塊.每個IRSB 由3 個部分組成:一個變量類型列表,指明了這個IRSB 中出現(xiàn)的所有臨時變量的類型;一個IR 語句序列,代表一條或多條匯編指令;一個跳轉(zhuǎn)語句,在IRSB 的末尾,指示這個IRSB 執(zhí)行完后下一個要執(zhí)行的IRSB 的地址(在IRSB 的中間可能還會有條件跳轉(zhuǎn)語句).圖2 是IRSB 的一個示例,可以看出這個IRSB 中有3 個臨時變量t0、t1、t2,類型均為I32(32 位整型);有6 條IR 語句(編號為1 ~6),其中第1 ~5 條語句就是一個IR 語句序列,代表了一條匯編指令(這個IRSB 是一個小型的IRSB,大的IRSB 由上百條的語句序列構(gòu)成,可以代表50 條匯編指令);最后一條IR 語句(第6 條)就是一個跳轉(zhuǎn)語句,是每個IRSB 末尾都要有的語句,可以是返回跳轉(zhuǎn)(return),也可以是條件跳轉(zhuǎn)(if).
IRSB 主要由IR 語句(statement)組成,而IR語句又由IR 表達式(expression)構(gòu)成.語句有Ist_IMark,Ist_Put,Ist_Store,Ist_Exit 等12 種類型;表達式也有Iex_Triop,Iex_Binop,Iex_Unop 等12 種類型.符號傳播的過程就是插樁每個IRSB,逐條分析IRSB 中的語句(有的語句類型還需進一步分析構(gòu)成它們的表達式類型,如Ist_WrTmp 語句),根據(jù)語句類型及構(gòu)成它們的表達式類型插樁相應(yīng)的回調(diào)函數(shù),記錄它們對符號變量進行的操作.
圖2 IRSB 示例Fig.2 An example of IRSB
2.1.3 約束收集
在上一步符號傳播的過程中,記錄了對符號變量的操作,并保存在一個數(shù)據(jù)結(jié)構(gòu)DEP 中,如圖3 所示,在DEP 中,value 記錄了符號變量的存放地址,buf 記錄了對符號變量的操作.SwordSE為每個符號變量維持一個這樣的數(shù)據(jù)結(jié)構(gòu).在程序運行過程中,會產(chǎn)生很多臨時變量,SwordSE 為每個臨時變量也維持一個DEP.
圖3 DEP 數(shù)據(jù)結(jié)構(gòu)Fig.3 DEP data structure
約束收集就是在遇到if 條件跳轉(zhuǎn)語句(Ist_Exit 語句)時,插入分析代碼,檢查條件表達式的值是否受輸入影響,這個值也是一個臨時變量,因此只需檢查這個臨時變量的DEP 中的buf 是否為空,如果不為空,則將當前指令地址和buf 中的內(nèi)容以一定格式輸出到一個文件中,這個buf 就是一個由IR 表示的路徑約束公式.圖4 是一個簡單的路徑約束示例,可以看出這條路徑僅受符號輸入“input(0)”(即輸入的第1 個字節(jié))影響.
圖4 IR 表示的路徑約束示例Fig.4 An example of path constraint represented by IR
對輸出的文件進行分析,查找所有的“depending on input”語句,將if 后面的約束公式提取出來,存放到一個集合中,這個集合就是路徑約束集合PC.
上一步進行了約束收集,得到一個用VEX IR表示的約束公式集合PC,接下來就要用求解器[18-22]對PC 中的約束公式逐個求解.
SwordSE 基于以下兩點選擇STP 作為約束求解器:①STP 開源且代碼量不大,且支持多種輸入格式;②STP 適合于求解位向量,而SwordSE 產(chǎn)生的約束公式正好是位向量.
求解過程分為兩步:①將IR 表示的約束公式集合PC 里的公式全部轉(zhuǎn)換為STP 支持的輸入格式,得到新的公式集合pc.例如,圖4 中的路徑約束轉(zhuǎn)換為STP 格式后如圖5 所示;②對pc 里的公式逐個取反求解,生成新的輸入.
圖5 圖4 中的路徑約束對應(yīng)的STP 格式Fig.5 STP format of path constraint showed in Fig.4
第2.1 ~2.2 節(jié)實現(xiàn)了一個基本的動態(tài)符號執(zhí)行功能,即給定一個種子輸入,能夠通過符號約束收集求解生成新的子輸入(也叫測試用例),這些測試用例能夠驅(qū)使程序走不同于種子輸入的執(zhí)行路徑.
在程序執(zhí)行過程中,會遇到很多的分支節(jié)點(條件跳轉(zhuǎn)語句),由此產(chǎn)生了不同的程序執(zhí)行路徑,如圖6 所示,①②④⑧、①③⑥、①②⑤○11○14、①②⑤⑩○12○16○17都是程序執(zhí)行路徑,程序分支節(jié)點越多,路徑數(shù)量就越大.SwordSE 的目的就是要在盡可能短的時間內(nèi)找到通向程序漏洞的路徑.
圖6 程序執(zhí)行路徑Fig.6 Program execution paths
動態(tài)符號執(zhí)行一次執(zhí)行只遍歷程序的一條路徑,一個測試用例就代表了程序的一條路徑,這樣在路徑遍歷時,就需要遵循一定的路徑搜索算法,如表1 所示.路徑搜索算法的好壞直接影響路徑搜索的效率.
Fuzzgrind 采用的路徑搜索算法是代搜索.該算法將種子輸入的執(zhí)行路徑作為第1 代路徑,收集路徑約束得到路徑約束集合pc,然后對pc 中的約束逐個取反,通過約束求解生成第1 代測試用例;然后按照深度優(yōu)先的原則從已生成的測試用例中選擇一個作為第2 代路徑的種子輸入,生成第2 代測試用例,接著按照同樣的方法生成第3代測試用例,依次類推,所有新生成的測試用例都將作為種子輸入,直到找出所有可能的程序路徑時停止搜索.
事實上,在對Fuzzgrind 做了大量測試后,發(fā)現(xiàn)它在生成測試用例時,生成了大量重復(fù)和近似重復(fù)的測試用例,而且很容易陷入局部鄰域搜索,導(dǎo)致路徑搜索效率很低.出現(xiàn)這個問題的原因主要在于種子輸入的選擇上,F(xiàn)uzzgrind 將所有生成的測試用例按照深度優(yōu)先的原則依次作為種子輸入,這樣存在兩個問題:①兩個相鄰代的種子之間差異可能很小甚至相同,由此找到的不同路徑很少;②將所有生成的測試用例都作為種子輸入,導(dǎo)致迭代的次數(shù)過多,甚至是陷入循環(huán).
針對上述問題,SwordSE 采用了禁忌搜索算法,禁忌搜索是一種全局逐步尋優(yōu)算法,正好能解決上述問題,這是因為:①禁忌搜索通過建立評價函數(shù),選擇評價好的子輸入作為種子輸入,而不是將所有的子輸入作為種子輸入,減少了迭代次數(shù);②禁忌搜索通過建立禁忌表,避免了重復(fù)搜索,避免了循環(huán).SwordSE 通過使用禁忌搜索算法,能夠在單位時間內(nèi)找到更多的沒有重復(fù)的路徑,大大提高了路徑搜索效率,進而提高了漏洞檢測效率.下面具體描述算法的實現(xiàn).
2.3.1 建立評價函數(shù)
建立評價函數(shù)的目的是為選擇合適的子輸入作為新的種子輸入提供依據(jù).SwordSE 以程序執(zhí)行到的IRSB 的數(shù)量來作為子輸入的評價值,如式(1)所示.評價值越大,說明該子輸入執(zhí)行到的IRSB 的數(shù)量越多.
要計算IRSB 的數(shù)量,只需寫一個簡單的Valgrind tool,對IRSB 進行插樁,設(shè)定一個全局變量N,每執(zhí)行一個IRSB,就將N 加1.
2.3.2 建立候選集
SwordSE 通過約束求解從一個種子輸入派生出多個子輸入,候選集Can_N(xnow)是這些子輸入的一個子集,如式(2)所示,候選集里的元素是將要作為種子的子輸入.
候選集的建立過程如下:首先,對每一個子輸入進行異常檢測,查看將它們作為目標程序的輸入時是否會導(dǎo)致程序異常,如果導(dǎo)致程序異常,就將該子輸入保存在crash 文件夾;接下來,對每個子輸入依據(jù)評價函數(shù)進行評價,然后進行去重處理,對評價值相同的多個子輸入,只保留一個進入候選集.
建立候選集后,對其按評價值進行排序,選取評價值最大的子輸入作為下一代種子輸入,如式(3)所示.每動態(tài)符號執(zhí)行一次,候選集就更新一次,每次動態(tài)符號執(zhí)行的種子輸入都是當前候選集中未作過種子的且評價值最大的子輸入.
2.3.3 建立禁忌表
禁忌表H 記錄的是已經(jīng)作過種子的測試用例的評價值,如式(4)所示.如果新找到的測試用例的評價值已經(jīng)在禁忌表中或者與禁忌表中的某一項十分接近(十分接近指數(shù)值相差很小,小于一個預(yù)先設(shè)定的差值上限,例如差值上限為3 表示數(shù)值相差在3 以內(nèi)),則該測試用例不能被選入候選集,從而避免了重復(fù).
2.3.4 建立停止規(guī)則
理論上,利用動態(tài)符號執(zhí)行技術(shù)可以找出所有的程序執(zhí)行路徑,但事實上到目前為止,受限于求解器的求解能力和符號模擬的精確程度,加之大型應(yīng)用程序的路徑數(shù)量相當龐大,國內(nèi)外還沒有哪一個動態(tài)符號執(zhí)行工具能做到這一點.現(xiàn)有的工具都是力爭在盡可能短的時間內(nèi)找到盡可能多的路徑,或者是直接尋找最有可能通向軟件漏洞的路徑,測試對象也基本都是小型程序.
SwordSE 的停止規(guī)則分為兩種情況:①自動停止,即當搜索完目標程序的所有執(zhí)行路徑(再也找不到新的路徑)時,自動停止搜索,適用于小型程序;②強制停止,即通過設(shè)定一些閾值,達到閾值后即停止搜索,閾值可以是約束公式的最大長度,也可以是禁忌表的最大元素個數(shù)等等,適用于中大型程序.
與Fuzzgrind 類似,SwordSE 提供一個配置文件“settings.cfg”來作為用戶接口.用戶可以通過編輯這個配置文件來設(shè)置第2.3.3 節(jié)提到的差值上限和本節(jié)提到的閾值等參數(shù),配置文件的格式如圖7 所示.例如要測試軟件“gzip”,只需按照圖7 的格式在配置文件中配置好各種參數(shù),然后在命令行終端運行“./SwordSE.py gzip”即可開始測試.
圖7 配置文件格式Fig.7 Format of configuration file
本節(jié)對SwordSE 進行實驗測試和性能評估,主要測試其兩個方面的能力:①路徑搜索能力,以經(jīng)典的動態(tài)二進制符號執(zhí)行工具Fuzzgrind 作為參照;②漏洞檢測能力,看它能否自動檢測出0day 漏洞.
測試環(huán)境為:Intel i5-4200M,CPU 主頻為2.5 GHz,內(nèi)存為4 G,操作系統(tǒng)為Ubuntu 12.04 32位系統(tǒng).測試對象為運行在Linux 系統(tǒng)下的一些常用的小型應(yīng)用軟件.
主要測試在相同的時間內(nèi),針對同一個目標程序,SwordSE 和Fuzzgrind 兩者誰找到的無重復(fù)路徑更多.需要說明的是Fuzzgrind 并不能直接運行在Ubuntu 12.04 系統(tǒng)上,而只能運行在版本比較陳舊的Ubuntu 9.04 系統(tǒng)上,且依賴于較低版本的Valgrind.SwordSE 對Fuzzgrind 做了以下幾個方面的改進:①將其匹配到較新的Valgrind 版本,使它能夠在Ubuntu 12.04 上運行;②增加了更多的指令支持,使它能測試代碼量更大的程序;③增加了命令行參數(shù)作為符號輸入;④引入了禁忌搜索算法.
因此,這一部分的實驗,重點是比較引入禁忌搜索算法后的SwordSE 和未引入禁忌搜索算法的Fuzzgrind(移植到Ubuntu 12.04 上 后的Fuzzgrind)的路徑搜索效率.
實驗過程如下:選取7 款軟件作為待測軟件,在配置文件中設(shè)置好各種參數(shù),其中SwordSE 的“MaxCons”均設(shè)置為200,“MaxDiff”均設(shè)置為1,“MaxH”均設(shè)置為無限大;Fuzzgirnd 沒有“Max-Diff”和“MaxH”參數(shù),“MaxCons”也均設(shè)置為200.對于同一款軟件,給定相同的種子輸入,開啟兩個命令行終端,同時開始運行SwordSE 和Fuzzgrind,并計時,每隔一段時間查看兩者產(chǎn)生的測試用例的數(shù)目,并檢查是否有重復(fù)的測試用例產(chǎn)生.
表2 記錄了在使用SwordSE 和Fuzzgrind 測試7 款軟件時,測試時間分別為5 min 和10 min 時兩者找到的路徑數(shù)目.從表2 可以看出,在相同的時間內(nèi),SwordSE 找到的路徑數(shù)目明顯多于Fuzzgrind.通過對二者產(chǎn)生的測試用例進行檢查,發(fā)現(xiàn)SwordSE 生成的測試用例沒有重復(fù)而Fuzzgrind 生成的測試用例存在較多重復(fù).此外,在實驗中還觀察到SwordSE 在達到閾值后能自動停止,而Fuzzgrind 有時會陷入局部循環(huán)搜索(即循環(huán)往復(fù)的生成重復(fù)的測試用例)而停不下來.綜上所述,SwordSE 的路徑搜索效率明顯優(yōu)于Fuzzgrind.
表2 SwordSE 和Fuzzgrind 路徑搜索能力比較Table 2 Comparison of SwordSE and Fuzzgrind’s path searching ability
這一部分實驗主要測試SwordSE 的0day 漏洞檢測能力.截至目前為止,SwordSE 在實驗中已經(jīng)發(fā)現(xiàn)了4 個0day 漏洞(這些漏洞用原始版本的Fuzzgrind 不可發(fā)現(xiàn)),包括兩個整數(shù)溢出漏洞、一個整數(shù)除0 漏洞和一個雙重釋放漏洞(double free),具體如表3 所示.
表3 SwordSE 已檢測到的0day 漏洞Table 3 0day vulnerabilities detected by SwordSE
以wav2swf 0.9.2 整數(shù)除0 漏洞為例進行分析.種子輸入為一個正常的wav 音頻文件yujian.wav,大小為172 KB,觸發(fā)漏洞的測試用例為第558個測試用例558.wav,對兩者的十六進制格式進行比較,發(fā)現(xiàn)它們的前19 個字節(jié)完全不同,其他字節(jié)均相同,如圖8 所示.
圖8 yujian.wav 與558.wav 前48 個字節(jié)Fig.8 The first 48 bytes of yujian.wav and 558.wav
漏洞現(xiàn)象如圖9 所示,當以558.wav 作為wav2swf 0.92 的輸入時,軟件發(fā)生異常終止,系統(tǒng)提示發(fā)生了“浮點數(shù)例外(核心已轉(zhuǎn)儲)”.通過進一步跟蹤調(diào)試,找到該漏洞的起因是發(fā)生了整數(shù)除0 異常,558.wav 的第33 個和第34 個字節(jié)代表的數(shù)值“0x0000”被作為了除數(shù).
圖9 wav2swf 0.9.2 整數(shù)除0 漏洞現(xiàn)象Fig.9 Phenomenon of wav2swf 0.9.2 integer division by zero vulnerability
本文提出了一種基于禁忌搜索的動態(tài)符號執(zhí)行方法,并實現(xiàn)了一個相應(yīng)的工具原型SwordSE.該方法充分利用了禁忌搜索算法的全局逐步尋優(yōu)能力,有效避免了重復(fù)路徑搜索和局部循環(huán)搜索問題,大大提高了路徑搜索效率.SwordSE 不依賴于軟件源碼,直接面向二進制程序,支持將文件和命令行參數(shù)這兩類輸入作為符號來實施動態(tài)符號執(zhí)行,實驗表明,相比現(xiàn)有動態(tài)符號執(zhí)行方法,SwordSE 能夠在相同的時間內(nèi)找到更多的無重復(fù)測試用例,且在實驗中已經(jīng)發(fā)現(xiàn)了4 個0day 漏洞,體現(xiàn)了較強的漏洞自動化檢測能力.
References)
[1] Armour-Brown C,Borntraeger C,F(xiàn)itzhardinge J,et al.Valgrind[EB/OL].[S.l.,s.n.][2015-05-15].http:∥valgrind.org/.
[2] Ganesh V,Hansen T.STP constraint solver[EB/OL].[S.l.,s.n.](2015-04-02)[2015-05-15].http:∥stp.github.io/.
[3] Glover F.Tabu search—Part I[J].ORSA Journal on Computing,1989,1(3):190-206.
[4] Glover F.Tabu search—Part II[J].ORSA Journal on Computing,1990,2(1):4-32.
[5]百度百科.禁忌搜索算法[EB/OL].[S.l.,s.n.][2015-05-15].http:∥baike.baidu.com/link?url=JqehYmMCAMqByyTSESOHM4_qjLUmbDLbM7L3iX2ZSu5vQRFpQgWXDR2Q2CDAR-qdgQfD4ORzYq5e3EvEUT_Ta.Baidu encyclopedia.Tabu search algorithm[EB/OL].[S.l.,s.n.][2015-05-15].http:∥baike.baidu.com/link?url = JqehYmMCAMqByyTSESOHM4_qjLUmbDLbM7L3iX2ZSu5vQRFp Qg-WXDR2Q2CDAR-qdgQfD4OR-zYq5e3EvEUT_Ta.
[6] 邢文訓(xùn),謝金星.現(xiàn)代優(yōu)化計算方法[M].第2 版.北京:清華大學(xué)出版社,2005:51-58.
Xing W X,Xie J X.Modern optimization methods[M].2nd ed.Beijing:Tsinghua University Press,2005:51-58.
[7] Cadar C,Godefroid P,Khurshid S,et al.Symbolic execution for software testing in practice:Preliminary assessment[C]∥Proceedings of the 33rd International Conference on Software Engineering.New York:ACM,2011:1066-1071.
[8] Avgerinos T,Rebert A,Cha S K,et al.Enhancing symbolic execution with veritesting[C]∥Proceedings of the 36th International Conference on Software Engineering.New York:ACM,2014:1083-1094.
[9] 王鐵磊.面向二進制程序的漏洞挖掘關(guān)鍵技術(shù)研究[D].北京:北京大學(xué),2011.
Wang T L.Research on binary-executable-oriented software vulnerability detection[D].Beijing:Peking University,2011(in Chinese).
[10] Godefroid P,Klarlund N,Sen K.Dart:Directed automated random testing[C]∥Proceedings of the 2005 ACM SIGPLAN Conference on Programming Language Design and Implementation.New York:ACM,2005:213-223.
[11] Sen K,Marinov D,Agha G.Cute:A concolic unit testing engine for C[C]∥Proceedings of the Joint 10th European Software Engineering Conference and 13th ACM SIGSOFT Symposium on the Foundations of Software Engineering.New York:ACM,2005:263-272.
[12] Cadar C,Ganesh V,Pawlowski P M,et al.EXE:Automatically generating inputs of death[J].ACM Transactions on Information and System Security,2008,12(2):10.
[13] Cadar C,Dunbar D,Engler D R.KLEE:Unassisted and automatic generation of high-coverage tests for complex systems programs[C]∥Proceedings of the 8th USENIX Symposium on Operating System Design and Implementation.Berkeley,CA:USENIX,2008,8:209-224.
[14] Godefroid P,Levin M,Molnar D.Automated whitebox fuzz testing[C]∥Proceedings of the 16th Annual Network and Distributed System Security Symposium.[s.l.]:The Internet Society,2008:151-166.
[15] Sogeti ESEC Lab.Fuzzgrind[EB/OL].[S.l.,s.n.][2015-05-15].http:∥esec-lab.sogeti.com/pages/fuzzgrind.html.
[16] Chipounov V,Kuznetsov V,Candea G.S2E:A platform for invivo multi-path analysis of software systems[J].ACM SIGARCH Computer Architecture News,2011,39(1):265-278.
[17] Martignoni L,McCamant S,Poosankam P,et al.Path-exploration lifting:Hi-fi tests for lo-fi emulators[J].ACM SIGARCH Computer Architecture News,2012,40(1):337-348.
[18] Moskewicz M W,Madigan C F,Zhao Y,et al.Chaff:Engineering an efficient SAT solver[C]∥Proceedings of the 38th Annual Design Automation Conference.New York:ACM,2001:530-535.
[19] Goldberg E,Novikov Y.BerkMin:A fast and robust SAT-solver[J].Discrete Applied Mathematics,2007,155(12):1549-1561.
[20] Hamadi Y,Jabbour S,Sais L.ManySAT:A parallel SAT solver[J].Journal on Satisfiability Boolean Modeling&Computation,2009,6(4):245-262.
[21] de Moura L,Bj?rner N.Tools and algorithms for the construction and analysis of systems[M].Berlin Heidelberg:Springer,2008:337-340.
[22] Bouton T,de Oliveira D C B,Déharbe D,et al.Automated deduction-CADE-22[M].Berlin Heidelberg:Springer,2009:151-156.