◆錢龍楊萌萌王理
?
基于定向模糊測試的軟件漏洞挖掘平臺的研究與設計
◆錢 龍1楊萌萌2王 理1
(1.信息工程大學 河南 450001;2.清華大學 北京 100000)
軟件安全問題追溯根源是因為安全漏洞的存在。模糊測試作為一種基于缺陷注入的自動化軟件測試技術,與許多其他漏洞挖掘技術相比,具備更智能更高效的特點,本文研究與設計的軟件漏洞挖掘平臺,在模糊測試技術的基礎上進行改進,能夠自動識別目標軟件的瓶頸分支,在提高代碼覆蓋率的同時,又加入了測試的定向性,測試結果表明,改進的平臺能夠幫助測試人員對特殊敏感區(qū)域的代碼進行定向測試,快速挖掘漏洞。
軟件安全;漏洞挖掘;模糊測試
近年來,利用軟件漏洞進行的攻擊行為層出不窮,軟件安全作為網(wǎng)絡空間安全的重要分支,其意義也愈來愈重要。隨著人們對軟件安全問題關注度的不斷提升,漏洞挖掘逐漸成為安全圈的熱點研究內(nèi)容。其中,模糊測試[1]利用隨機生成的樣本去挖掘軟件中的漏洞,相比其他漏洞挖掘技術更簡單,更高效。本文介紹的基于定向模糊測試的軟件漏洞挖掘平臺,在AFL(AmericanFuzzingLop)[2]測試技術的基礎上進行研究并改進,能夠自動識別目標軟件中瓶頸分支,在提高代碼覆蓋率的同時,又加入了測試的定向性,能夠幫助測試人員對特殊敏感區(qū)域的代碼實現(xiàn)定向測試,快速挖掘漏洞。
基于代碼覆蓋率的模糊測試[3]通過修改具有合法格式的輸入來生成新的測試輸入,該方法很少考慮輸入合法性,由于目標程序采用版本號、特殊字節(jié)、校驗和等檢查方式以防止惡意輸入對程序造成破壞,因此在實際測試中,僅有少數(shù)的變異輸入會執(zhí)行程序控制流中更深層的代碼,間接影響了代碼覆蓋率[4]。作為衡量測試效率的一重要指標,代碼覆蓋率在一定程度上反映目標程序代碼執(zhí)行的充分度。AFLfast[5]的研究工作者發(fā)現(xiàn)單純的通過增加測試輸入的數(shù)量來占用更多的計算、時間資源難以保證代碼覆蓋率的提高。Vuzzer[6]提取控制流與數(shù)據(jù)流特征來作為應用程序的基本特征,但該方法無法解決程序內(nèi)存在校驗和檢查問題。隨著程序處理的數(shù)據(jù)類型不斷增多,數(shù)據(jù)格式規(guī)范愈加完善,所采用的校驗和算法復雜度也不斷提高。因而通過程序內(nèi)部的檢測,間接提高模糊測試效率是一項重要挑戰(zhàn)。
針對如何提高代碼覆蓋率的問題,我們首先定義了目標程序控制流中具有特殊字節(jié)、校驗和等檢查功能的執(zhí)行分支為瓶頸分支。為了自動識別瓶頸分支,該平臺在進行目標程序源碼編譯時,利用程序插樁技術將覆蓋率信息采集模塊植入被測程序。在測試過程中,該采集模塊將記錄控制流中每條分支被執(zhí)行情況。測試結束后,瓶頸分支識別模塊利用程序靜態(tài)分析技術,同時結合運行時分支執(zhí)行記錄結果,定位瓶頸分支。
該平臺利用距離計算模塊測量控制流中所有分支與瓶頸分支的相對距離,并將距離信息也插入目標程序。在定向測試過程中,根據(jù)輸入執(zhí)行路徑上所有分支與瓶頸分支的平均距離,為該輸入動態(tài)分配能量,進而調整該輸入的變異次數(shù),實現(xiàn)針對控制流中瓶頸分支的定向模糊測試。
該平臺主要包含四部分模塊,下面按照測試過程中執(zhí)行順序介紹各模塊。
覆蓋率信息采集模塊主要基于AFL測試技術上改進,在進行目標源碼編譯時,該模塊在程序基本塊中插入分支信息采集指令,實現(xiàn)功能如圖1所示。
(1) cur_loc =
shared_mem數(shù)組存儲在64KB共享內(nèi)存區(qū)域,數(shù)組中的元素代表執(zhí)行分支在測試過程中被執(zhí)行次數(shù)。為了不影響運行時測試效率,數(shù)組將在測試結束時被一次性記入文件中。
瓶頸分支定位模塊基于IDA_Python實現(xiàn),通過靜態(tài)分析獲取程序控制流,同時結合shared_mem信息,定位瓶頸分支。具體算法如圖2所示。
輸入1:Target_program輸入2:shared_mem(1) CFG(Target_program)->cfg; 獲取程序控制流(2) Get_loc(Target_program)->(loc); 獲取基本塊中隨機值(3) FOR(BB in cfg); 遍歷控制流中的每個基本塊IF BB have two son BB1,BB2; 判斷基本塊BB是否有兩個子節(jié)點BB1,BB2edge1=XOR((BB_loc>>1),BB1); 計算與兩個子節(jié)點之間分支鍵值edge2=XOR((BB_loc>>1),BB1);IF sharedd_mem[edge1]>>shared_mem[edge2] 分支1執(zhí)行頻率遠大于or sharedd_mem[edge1]< 距離度量模塊將以瓶頸分支作為目標,計算控制流中每條分支到目標分支的所有路徑的平均距離。在這里我們定義兩條分支E1, E2之間的距離為E1到E2之間的分支個數(shù)。 定向模糊測試模塊將距離信息插入目標程序,同時采用AFLGO[7]的逼近思想,利用模擬退火算法根據(jù)測試輸入執(zhí)行路徑情況為其分配能量,具體策略如圖3所示。AFLGO測試目標為基本塊,而該平臺性能更佳,測試目標為瓶頸分支,同時也可以將若干相鄰分支組合作為測試目標,極大地通過定向策略提高代碼覆蓋率。 (1) REPEAT(2) input=CHOOSE(isInteresting_queue); 從測試隊列中按順序選取輸入(3) P = ASSIGN_ENERGY(input); 根據(jù)測試輸入執(zhí)行情況為其分配能量P(4) for i from 1 to P; 對測試輸入執(zhí)行P次變異(5) input’=MUTATE(input);(6) if Target_program crashes;(7) ADD input’ to crash_queue;(8) else if isInteresting(input’);(9) ADD seed’s to isInteresting_queue;(10)end if(11) end for (1)自動識別瓶頸分支 本平臺在對目標程序擁有零知識的前提下,充分把握了瓶頸分支運行時特征,在AFL輕量級插樁基礎上進行改進,在不影響運行時效率的前提下記錄覆蓋率信息,同時利用靜態(tài)分析相結合的策略自動識別瓶頸分支。 (2)針對瓶頸分支定向模糊測試以提高代碼覆蓋率 基于覆蓋率的模糊測試以能否提高代碼覆蓋率為性能標準。本平臺定位瓶頸分支為待測目標,并對瓶頸分支及后續(xù)分支實施定向測試,在提高代碼覆蓋率的同時減少無關分支測試,節(jié)省了計算資源,縮短了漏洞發(fā)現(xiàn)時耗。 (1)樣本程序測試 我們采用Docker技術將該平臺搭建在Ubuntu操作系統(tǒng)中,為了驗證該平臺針對瓶頸分支測試的有效性,我們最初編寫三個目標程序樣本,并在代碼中分別加入一種程序檢查方式:特殊字節(jié)校驗、文件大小識別以及校驗和檢查,同時在每個樣本中植入一個已知漏洞。同時采用AFL作為測試基準進行比較。 考慮到模糊測試隨機性特征[8],我們共進行30次獨立測試,每次測試8小時,使用相同初始輸入。如圖4所示,在針對特殊字節(jié)樣本測試中,該平臺在平均時長1-2小時便可觸發(fā)漏洞,而AFL需要4-5小時。 圖4 針對特殊字節(jié)識別樣本測試對比 而在針對文件大小檢查樣本的測試中,該平臺需要3-4小時,而AFL需要6-7小時,如圖5所示。 圖5 針對文件大小檢查樣本測試對比 圖6所示,針對算法更復雜,檢查更嚴格的校驗和檢查樣本,AFL沒有在預定時間內(nèi)觸發(fā)漏洞,而我們平臺需要6-7小時。 圖6 針對校驗和檢查樣本的測試對比 (2)真實程序測試 為了檢驗該平臺在實際環(huán)境中的測試性能,我們還對五款常用真實程序pngfix,tiffinfo,magick,tcpflow, tiffset最新版本進行測試,同時采用AFL作對比,進行30次獨立測試,每次測試24小時,取單次最佳測試結果,如表1所示,表格中數(shù)值為測試過程中發(fā)現(xiàn)的unique crash數(shù)量。對比中發(fā)現(xiàn),該平臺在相同測試時間內(nèi),漏洞挖掘效率高于AFL。 表1 真實程序測試效果 基于定向模糊測試的軟件漏洞挖掘平臺通過輕量級程序插樁與靜態(tài)分析相結合的方法,自動識別瓶頸分支,同時又加入了測試的定向性。實驗結果表明該平臺在提高代碼覆蓋率的同時還能觸發(fā)更深層次程序路徑中的漏洞,在未來漏洞挖掘工作中,該平臺對幫助測試人員解決瓶頸分支導致代碼覆蓋率受限,快速挖掘深層代碼中潛在漏洞具有極大幫助。 [1]李紅輝,齊佳,劉峰,楊芳南.模糊測試技術研究.中國科學 : 信息科學2014年 第44卷 第10期 :1305–1322. [2]Michal Zalewski. American fuzzy lop[EB/OL]. http://lcamtuf.coredump.cx/afl/. [3]Wu Z Y, Wang H C, Sun L C, et al. Survey on Fuzzing. Appl Res Comput, 2010: 830–831 吳志勇, 王紅川, 孫樂昌,等. Fuzzing 技術綜述. 計算機應用研究, 2010: 830–831]. [4]Wang T,Wei T,Gu G,et al.Taintscope:A A survey of coverage directed fuzzing tool for automatic software vulnerability detection[C]//Security and privacy (SP),2010 IEEE symposium on.[S.l.]:IEEE,2010:497512. [5]B?hme M,Pham V T,Roychoudhury A.Coverage-based greybox fuzzing as markov chain [C]//Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security.[S.l.]:ACM,2016:1032–1043. [6]Rawat S,Jain V,Kumar A,et al.Vuzzer:Application-aware evolutionary fuzzing[C]//Proceedings of the Network and Distributed System Security Symposium (NDSS).[S.l.:s.n.], 2017. [7]B?hme M,Pham V T,Nguyen M D,et al.Directed greybox fuzzing[C]//Proceedings of the 2017 ACM SIGSAC Conference on Computer and Communications Security (CCS17).[S.l.: s.n.],2017. [8]George Klees, Andrew Ruef, Benji Cooper,Shiyi Wei,and Michael Hicks.2018.Evaluating Fuzz Testing.ACM SIGSAC Conference on Computer and Communications Security (CCS 18). 清華大學NISL實驗室:基于學習的智能化漏洞挖掘關鍵技術研究。2.3 距離度量模塊
2.4 定向模糊測試模塊
3 基于定向模糊測試的軟件漏洞挖掘平臺的創(chuàng)新點
4 實驗結果
5 結論