趙 磊,輝 濤,蔣可洋,曹彭程
(1.武漢大學(xué) 空天信息安全與可信計(jì)算教育部重點(diǎn)實(shí)驗(yàn)室,湖北 武漢 430000;2.武漢大學(xué) 國家網(wǎng)絡(luò)安全學(xué)院,湖北 武漢 430000)
在自動(dòng)化的漏洞檢測和挖掘相關(guān)工作中,模糊測試技術(shù)是一項(xiàng)高效且簡潔的測試解決方案,其優(yōu)勢在于在未知被測程序或系統(tǒng)相關(guān)先驗(yàn)知識(shí)的條件下,可以自動(dòng)化地進(jìn)行測試工作。模糊測試技術(shù)的核心思想是給程序提供大量的特殊或隨機(jī)的測試用例,通過監(jiān)控程序運(yùn)行過程中的異常情況,定位軟件中的潛在漏洞位置,從而協(xié)助安全研究者快速發(fā)現(xiàn)程序的潛在漏洞點(diǎn)。
如今,AFL及其拓展等模糊測試工具正在被廣泛地應(yīng)用于各個(gè)漏洞挖掘領(lǐng)域中。但是,隨機(jī)生成的測試用例往往難以突破程序中的復(fù)雜條件約束,如程序中廣泛存在的“magic number”或者“checksum”的檢測。這使得模糊測試技術(shù)通常只能對程序的淺層代碼進(jìn)行檢測,而難以訪問被復(fù)雜條件保護(hù)的程序深層代碼區(qū)域。
在漏洞挖掘領(lǐng)域中,符號執(zhí)行也是一項(xiàng)重要的技術(shù),得益于其求解復(fù)雜條件約束的能力,常被用于漏洞的條件分析;針對模糊測試的不足,模糊測試與符號執(zhí)行相互協(xié)作的混合式漏洞挖掘方法被提出,旨在利用符號執(zhí)行中的約束求解來突破程序中復(fù)雜條件的限制,引導(dǎo)模糊測試進(jìn)入程序的深層代碼邏輯。目前,圍繞著模糊測試模塊與符號執(zhí)行模塊之間不同的協(xié)作方式,研究人員實(shí)現(xiàn)了不同的混合式漏洞挖掘工作:Pak等使用符號執(zhí)行模塊收集路徑約束,并且將滿足約束的輸入轉(zhuǎn)移給模糊測試模塊。Stephens等提出了工具Driller,其側(cè)重于利用模糊測試模塊探索大部分路徑;而當(dāng)模糊測試模塊進(jìn)入停滯狀態(tài)時(shí),會(huì)啟動(dòng)符號執(zhí)行模塊來求解可以通過約束的輸入。Wang等提出用一個(gè)最優(yōu)策略模型來評估路徑約束求解的花銷來指導(dǎo)混合式漏洞挖掘的路徑選擇,但是該評估模型本身占用了大量資源。Haller等使用靜態(tài)分析和污點(diǎn)分析來指導(dǎo)混合模糊測試中的符號執(zhí)行模塊。Yun等提出了工具QSYM,在混合式漏洞挖掘中實(shí)現(xiàn)更細(xì)粒度的、指令級的符號模擬。Huang等提出了增量混合模糊測試框架,通過優(yōu)化混合式漏洞挖掘方法中緩存和重用的計(jì)算結(jié)果很少的問題,在符號執(zhí)行模塊中實(shí)現(xiàn)了更有效的突變和約束求解。
現(xiàn)有的這些混合式漏洞挖掘的研究工作,主要集中在如何提高符號執(zhí)行模塊的性能,以及如何在模糊測試模塊和符號執(zhí)行模塊中傳遞更適合的測試用例,忽略了兩個(gè)模塊由于原理與實(shí)現(xiàn)上的差異所帶來的實(shí)際信息同步中的問題。具體來說,當(dāng)前的混合式漏洞挖掘方案通常僅將符號執(zhí)行模塊生成的測試用例簡單地傳遞給模糊測試模塊以進(jìn)行信息同步。這種簡單的處理方式并不能很好地同步符號執(zhí)行模塊在探索程序狀態(tài)時(shí)的運(yùn)行時(shí)信息,造成了符號執(zhí)行模塊生成測試用例的導(dǎo)入數(shù)量少和模糊測試模塊對符號執(zhí)行模塊生成的測試用例使用不當(dāng)?shù)膯栴},并進(jìn)一步制約了混合式漏洞挖掘的漏洞挖掘效率。
為了更好地優(yōu)化混合式漏洞挖掘方案中符號執(zhí)行模塊和模糊測試模塊的同步問題,本文提出了一種基于程序關(guān)鍵點(diǎn)的測試用例同步方法(Sol-QSYM)。該方法挖掘了符號執(zhí)行模塊執(zhí)行過程中被忽略的程序關(guān)鍵點(diǎn)信息,并基于關(guān)鍵點(diǎn)來增強(qiáng)符號執(zhí)行模塊中的測試用例生成和指導(dǎo)模糊測試模塊中測試用例調(diào)度與變異過程,在兩個(gè)模塊之間實(shí)現(xiàn)了更細(xì)粒度的測試用例同步,進(jìn)而提升了整體的漏洞挖掘效率。
混合式漏洞挖掘框架可以分為模糊測試和符號執(zhí)行兩個(gè)模塊。兩者所做的工作均是基于給定的測試用例所對應(yīng)的程序狀態(tài)來探索未知的程序狀態(tài),但是,兩個(gè)模塊進(jìn)行探索的方式、工作流程及對于測試用例的利用方式是不同的。模糊測試模塊執(zhí)行速度快,但不易求解出特殊路徑約束,適合于快速探索解空間大的路徑;符號執(zhí)行模塊求解速度慢,但能夠生成沿特定路徑執(zhí)行的輸入,適合于探索解空間小的路徑。
圖1為本文總結(jié)現(xiàn)有混合式漏洞挖掘工作的流程框架圖。由圖1可知:現(xiàn)有混合式漏洞挖掘工作中模糊測試模塊與符號執(zhí)行模塊的協(xié)同方式是通過測試用例的同步和交換實(shí)現(xiàn)的。模糊測試模塊作為程序測試的主體,在得到一個(gè)測試用例后,先經(jīng)過測試用例執(zhí)行狀態(tài)檢測、測試用例調(diào)度、測試用例變異這3個(gè)主要步驟,再對目標(biāo)程序進(jìn)行測試,并返回當(dāng)前的代碼覆蓋率信息來指導(dǎo)接下來的測試過程。當(dāng)測試過程陷入瓶頸無法發(fā)現(xiàn)新的代碼覆蓋率時(shí),會(huì)將種子集合中的一個(gè)測試用例和當(dāng)前已經(jīng)測試得到的程序狀態(tài)同步提供給符號執(zhí)行模塊。符號執(zhí)行模塊先根據(jù)得到的測試用例和代碼覆蓋率信息,經(jīng)過路徑分析與約束求解后會(huì)得到一些觸及此測試用例執(zhí)行路徑上的其他分支路徑的求解結(jié)果;再根據(jù)這些求解結(jié)果構(gòu)造相應(yīng)的測試用例,提供給模糊測試模塊來為測試過程引入新的代碼覆蓋。
圖1 混合式漏洞挖掘流程圖Fig. 1 Workflow of hybrid fuzzing
但是,由于模糊測試與符號執(zhí)行在實(shí)現(xiàn)方式上的差異,單純依靠測試用例進(jìn)行模塊間協(xié)同的方式會(huì)使模糊測試模塊難以同步符號執(zhí)行求解的程序空間。這就導(dǎo)致了符號執(zhí)行模塊消耗了大量系統(tǒng)資源的同時(shí),無法將所得信息全部提供給模糊測試模塊來輔助漏洞挖掘,進(jìn)而影響了軟件測試效率。具體來說,現(xiàn)有測試用例的同步方式不能很好地同步符號執(zhí)行模塊得到的信息,該問題體現(xiàn)在兩個(gè)方面:
1)符號執(zhí)行模塊生成測試用例的導(dǎo)入數(shù)量少
導(dǎo)入數(shù)量指的是符號執(zhí)行模塊生成的所有測試用例中被模糊測試模塊接收并使用的數(shù)量。由于模糊測試模塊中對于測試用例的使用是以程序執(zhí)行狀態(tài)為首要的檢測標(biāo)準(zhǔn),在測試過程中只會(huì)使用能夠使程序以正常狀態(tài)退出的測試用例。但是,符號執(zhí)行模塊受限于對于外部環(huán)境的模擬及約束求解的能力問題,其只是簡單地通過求解與分支相關(guān)的部分輸入,再在原有基礎(chǔ)上以替換的方式來生成新的測試用例。這導(dǎo)致符號執(zhí)行模塊得到的測試用例大部分是不完整的,而這些不完整的測試用例會(huì)由于無法滿足程序狀態(tài)檢測而在模糊測試模塊中被丟棄,即符號執(zhí)行模塊生成的測試用例只有很少一部分被模糊測試模塊導(dǎo)入。
為了量化分析該問題,本文從模糊測試和混合式漏洞挖掘相關(guān)研究工作所廣泛使用的測試程序集中,隨機(jī)選取了12個(gè)開源的Linux應(yīng)用程序。針對經(jīng)典混合式漏洞挖掘工具QSYM實(shí)驗(yàn)統(tǒng)計(jì)了其模糊測試模塊對于符號執(zhí)行模塊求解結(jié)果的利用情況,實(shí)驗(yàn)結(jié)果可見表1。從表1中可以看出,QSYM中模糊測試模塊對于符號執(zhí)行模塊求解結(jié)果的利用率普遍較低,整體的符號執(zhí)行求解結(jié)果的導(dǎo)入率僅為7.19%。
表1 QSYM中符號執(zhí)行模塊生成測試用例利用情況
Tab. 1 Utilization of testcases generated by symbolic execution module in QSYM
被測程序 求解結(jié)果個(gè)數(shù) 導(dǎo)入個(gè)數(shù) 導(dǎo)入率/%cjpeg 153 22 14.38 exiv2 517 35 6.77 infotocap 1 638 15 0.92 jhead 955 57 5.97 nm 56 3 5.36 objdump 313 1 0.32 pdfimages 891 53 5.95 pngfix 739 222 30.04 readelf 1 458 153 10.49 size 24 2 8.33 tiffdump 368 5 1.36 xmlwf 1 082 21 1.94平均 682.83 49.08 7.19
2)對符號執(zhí)行模塊生成的測試用例使用不當(dāng)
當(dāng)前混合式漏洞挖掘方案中,模糊測試模塊并不會(huì)特殊對待符號執(zhí)行得到的測試用例,而采用與隨機(jī)變異得到的測試用例同樣的處理方式。
由于忽略了符號執(zhí)行自身的特點(diǎn),這種測試用例處理方式并不是最佳的。一方面,根據(jù)混合式漏洞挖掘的工作流程,符號執(zhí)行模塊生成的測試用例有更大可能突破當(dāng)前模糊測試的瓶頸,這種不加區(qū)別的處理方式會(huì)讓符號執(zhí)行模塊的優(yōu)勢被削弱。另一方面,測試用例中不同部分對于被測程序的狀態(tài)影響是不同的,符號執(zhí)行模塊生成的測試用例中往往包含了能影響程序決定分支的關(guān)鍵字信息,而不加區(qū)別的處理方式會(huì)浪費(fèi)并破壞掉這些信息。
針對上述測試用例的同步問題,本文提出了基于程序關(guān)鍵點(diǎn)的測試用例同步方法,旨在提高混合式漏洞挖掘?qū)Ψ枅?zhí)行模塊所得信息的利用效率,并進(jìn)一步提升漏洞挖掘效果。
基于程序關(guān)鍵點(diǎn)的測試用例同步方法基本思想在于充分利用符號執(zhí)行的求解結(jié)果來構(gòu)造出更完整的覆蓋程序潛在分支的測試用例,并利用程序關(guān)鍵點(diǎn)信息指導(dǎo)模糊測試的測試用例調(diào)度與變異過程,使得符號執(zhí)行的求解信息得到區(qū)分與利用。改進(jìn)的測試用例同步方法流程如圖2所示,主要分為3部分內(nèi)容:關(guān)鍵點(diǎn)與關(guān)鍵分支信息提取、基于關(guān)鍵點(diǎn)的測試用例生成和程序關(guān)鍵點(diǎn)引導(dǎo)的測試用例處理。
圖2 基于關(guān)鍵點(diǎn)的測試用例同步方法流程Fig. 2 Workflow of testcase synchronization method based on keypoints
本文對關(guān)鍵點(diǎn)與關(guān)鍵分支的定義如下:如果一個(gè)程序分支的約束條件對應(yīng)的解空間很小,在符號求解中花費(fèi)較多的資源,那么,將該程序分支路徑當(dāng)成一個(gè)關(guān)鍵分支,此分支的前驅(qū)節(jié)點(diǎn)及對應(yīng)的變量集合為程序關(guān)鍵點(diǎn)。程序的關(guān)鍵分支具備如下兩個(gè)特點(diǎn):一是,符號執(zhí)行能夠求解出滿足該條件分支的具體解;二是,當(dāng)前的測試用例到達(dá)了關(guān)鍵點(diǎn)下的其他分支路徑。
在符號執(zhí)行模塊探索過程中對關(guān)鍵點(diǎn)和關(guān)鍵分支信息進(jìn)行提取,具體地,符號執(zhí)行模塊通過判斷該分支是否滿足上述兩個(gè)特點(diǎn)從而進(jìn)行關(guān)鍵分支的識(shí)別。下文基于關(guān)鍵點(diǎn)的測試用例生成與程序關(guān)鍵點(diǎn)引導(dǎo)的測試用例處理均是針對關(guān)鍵點(diǎn)與關(guān)鍵分支進(jìn)行。
為了充分利用符號執(zhí)行得到的求解結(jié)果,受文獻(xiàn)[17]啟發(fā),本文利用信息組合的思路設(shè)計(jì)了新的測試用例生成方法。該方法通過組合不同程序分支對應(yīng)的變量值來生成新的測試用例。由此得到的測試用例集合會(huì)攜帶更多的符號執(zhí)行求解信息,并且在實(shí)際執(zhí)行中更容易到達(dá)被求解的程序分支。這樣能夠在不引入新的符號執(zhí)行求解操作的前提下,更好地挖掘符號執(zhí)行求解結(jié)果的利用潛力。
求解信息組合思路如圖3所示。
圖3中: φ為符號執(zhí)行中的約束集合,每個(gè)方框代表了與分支相關(guān)的某一程序的變量; σ為給定的初始化求解對象,代表了當(dāng)前約束集合 φ的一個(gè)求解結(jié)果;方框中,1代表了該變量的符號約束被求解,而0則代表了沒有。
圖3 求解信息組合Fig. 3 Idea of solving results combination
若將約束集合 φ對應(yīng)的所有程序分支集合表示為V
。對于集合V
中的任意分支v
(v
∈V
),則能到達(dá)該分支的求解結(jié)果為 σ。 σ為由符號執(zhí)行在初始解 σ基礎(chǔ)上僅針對特定分支的約束求解得到的結(jié)果,求解結(jié)果也只與該分支相關(guān)的變量有關(guān)。將針對分支v
求解過程中涉及的變量集合定義為 δ。 δ也就是 σ 與σ的差異部分,表達(dá)式為 δ=σ⊕σ 。通過 δ,建立了程序狀態(tài)分支與程序變量集合的對應(yīng)關(guān)系。對于給定的初始解 σ,通過上述操作,將V
中的分支v
的求解結(jié)果作為基礎(chǔ)的變異集合,如圖3中的δ和 δ。之后,將關(guān)鍵變量進(jìn)行進(jìn)一步匹配組合,具體表現(xiàn)為變量集之間的或操作,即 δ∨δ。這樣,在現(xiàn)有求解結(jié)果的基礎(chǔ)上,只需計(jì)算 σ ⊕δ∨δ,可以得到一個(gè)全新的解 σ?, 而 σ? 相 較于 σ 同 時(shí)包含了 δ和 δ的求解信息。求解信息組合的基本思想在于,既然 δ和 δ中分別包含了針對分支a
與b
的 求解信息,那么 σ?很有可能同時(shí)滿足分支a
與b
。利用上述思想,符號執(zhí)行求解引擎只需要求解得出基礎(chǔ)的變異集合,通過隨機(jī)的簡單變異組合就能得到新的解集合,而不再需要符號執(zhí)行模塊重新對程序的路徑約束進(jìn)行符號化,然后求解。這些生成的測試用例及對應(yīng)的關(guān)鍵分支信息會(huì)被提供給模糊測試模塊。
模糊測試模塊在得到測試用例與關(guān)鍵點(diǎn)信息后,需要解決的問題是如何讓攜帶關(guān)鍵點(diǎn)信息的測試用例引導(dǎo)測試過程進(jìn)行特定區(qū)域的探索,如何根據(jù)關(guān)鍵分支信息為不同測試用例中不同類型的變量與對應(yīng)的輸入?yún)^(qū)域分配不同的變異策略,使得變異過程中在當(dāng)前測試用例的基礎(chǔ)上能更高概率地生成有效的測試用例。
本文在現(xiàn)有混合式漏洞框架的基礎(chǔ)上對模糊測試模塊的測試用例調(diào)度算法與變異算法進(jìn)行了改進(jìn),幫助模糊測試模塊更好地利用符號執(zhí)行模塊中得到的關(guān)鍵點(diǎn)信息。
2.3.1 測試用例調(diào)度算法改進(jìn)
在模糊測試模塊中,隨著測試用例規(guī)模的不斷增大,在有限的時(shí)間和資源內(nèi)需要對測試用例進(jìn)行調(diào)度,以幫助模糊測試模塊選擇最有價(jià)值的測試用例進(jìn)行測試。當(dāng)前的模糊測試工具,如AFL,為了挑選出有價(jià)值的測試用例來進(jìn)行變異,會(huì)為每一個(gè)已覆蓋的程序分支e
挑選出最優(yōu)的測試用例s
,并保存在測試用例集合T
中。即T
記錄的是每條分支對應(yīng)的最優(yōu)測試用例。對于保存的測試用例集合T
,先要滿足覆蓋目前已知所有的程序狀態(tài),在此基礎(chǔ)上AFL會(huì)優(yōu)先選擇那些體積更小、測試速度更快的測試用例。但僅采用T
無法區(qū)分符號執(zhí)行模塊得到的帶有關(guān)鍵分支信息的測試用例與普通的測試用例。因此,本文引入符號執(zhí)行模塊在路徑求解時(shí)候得到的覆蓋率信息,來指導(dǎo)模糊測試模塊挑選測試用例。具體來說,改進(jìn)后的方法將關(guān)鍵分支對應(yīng)的最優(yōu)測試用例保存到一個(gè)符號執(zhí)行對應(yīng)的測試用例集合S
中,并且由符號執(zhí)行模塊同步更新。在對一個(gè)測試用例進(jìn)行測試的過程中,如果一個(gè)測試用例s
覆蓋了S
所記錄的分支信息e
,并且該分支e
是第一次被該測試用例s
所覆蓋,那么S
會(huì)指定目前分支e
最優(yōu)的測試用例為s
。在改進(jìn)之后的測試用例挑選過程中,會(huì)遍歷S
記錄的所有測試用例信息,將其中未被測試過的測試用例挑選出來放入待測隊(duì)列,并優(yōu)先在接下來的變異和測試過程中使用。同時(shí),為了保證不丟棄目前已覆蓋的程序狀態(tài)信息,在處理完S
記錄的測試用例之后,測試用例挑選過程會(huì)根據(jù)完整的覆蓋率信息從T
中挑選出覆蓋剩余程序狀態(tài)的測試用例放入測試隊(duì)列。2.3.2 測試用例變異算法改進(jìn)
模糊測試模塊在原有測試用例的基礎(chǔ)上,對測試用例進(jìn)行隨機(jī)的變異,以產(chǎn)生更多的測試用例并達(dá)到更多的程序代碼覆蓋效果?,F(xiàn)有的混合式漏洞挖掘框架,如QSYM,在測試用例變異過程中對模糊測試模塊本身和來自符號執(zhí)行模塊的測試用例采用了相同的變異操作。這導(dǎo)致了現(xiàn)有的測試用例變異過程并不能充分發(fā)揮符號執(zhí)行模塊在探索程序狀態(tài)的優(yōu)勢,忽略了符號執(zhí)行模塊得到的能影響程序決定分支的關(guān)鍵字信息。
因此,本文對測試用例的變異算法進(jìn)行了改進(jìn)。改進(jìn)后的算法主要是在變異對象的選擇與變異操作的分配上進(jìn)行了優(yōu)化。具體來說,改進(jìn)后的變異算法先利用符號執(zhí)行求解的程序分支獲得與程序狀態(tài)對應(yīng)的變量信息,再針對不同的測試用例變異位置來分配不同的變異權(quán)重。改進(jìn)后方法的目的在于,對可能產(chǎn)生新的代碼覆蓋分支變量上進(jìn)行重點(diǎn)變異;與程序狀態(tài)無關(guān)的,比如一些數(shù)值類的輸入,在其對應(yīng)位置上減少變異操作,使得變異更容易生成能產(chǎn)生新代碼覆蓋的測試用例。改進(jìn)后的測試用例變異算法主要有兩個(gè)階段,即非隨機(jī)性變異階段和隨機(jī)性變異階段,算法偽代碼如下。
算 法
改進(jìn)后的測試用例變異算法輸入:種子集合Queue
、覆蓋率accCov
、S
;輸出:變異的測試用例集合Testcases
;算法的第5~15行是非隨機(jī)性變異階段。非隨機(jī)性變異算法的目的在于修改測試用例在特定位置的變量值。因?yàn)檫@類變異只在現(xiàn)有輸入的基礎(chǔ)上做出微小改動(dòng),適用于影響程序分支的關(guān)鍵輸入。具體來說,非隨機(jī)性變異算法會(huì)將輸入當(dāng)成字節(jié)流進(jìn)行各種運(yùn)算處理,包括數(shù)據(jù)位運(yùn)算、字節(jié)運(yùn)算等。在改進(jìn)后的方法中,t
為當(dāng)前需要變異的測試用例對應(yīng)的覆蓋率信息。如果t
中存在符號執(zhí)行求解過的某些程序分支,首先會(huì)根據(jù)S
確定測試用例q
中對應(yīng)的變量位置,接下來會(huì)對測試用例相應(yīng)位置應(yīng)用預(yù)先定義的非隨機(jī)性變異操作,最后通過模糊測試中的狀態(tài)判斷函數(shù)Save_if_interesting判斷是否生成了有效的測試用例。通過應(yīng)用上述策略,非確定性變異階段可以針對性地對測試用例中的關(guān)鍵位置進(jìn)行變異,以減少無效的操作。算法的16~23行是隨機(jī)性變異階段。由于隨機(jī)性的變異操作會(huì)大幅修改測試用例的內(nèi)容,無法根據(jù)程序的結(jié)構(gòu)信息設(shè)置具體的變異位置與變異操作,因此采取與AFL相同的處理方式,即AFL定義的隨機(jī)性變異階段的操作流程。但與AFL不同的是,針對從符號執(zhí)行模塊導(dǎo)入的測試用例,改進(jìn)后的方法會(huì)分配更多的變異輪數(shù)與變異時(shí)間。
基于混合式漏洞挖掘框架AFL+QSYM,本文實(shí)現(xiàn)了基于關(guān)鍵點(diǎn)的測試用例同步方法,并構(gòu)建了系統(tǒng)原型Sol-QSYM。為了兼容AFL和QSYM的處理過程,其核心算法分別使用了C和C++實(shí)現(xiàn)。
為了驗(yàn)證本文基于程序關(guān)鍵點(diǎn)的混合式漏洞挖掘測試用例同步方法的有效性,本文從相關(guān)研究工作廣泛使用的測試數(shù)據(jù)集中,隨機(jī)選取了12個(gè)程序進(jìn)行實(shí)驗(yàn),選取的所有程序見表2。
表2 測試程序數(shù)據(jù)集
Tab. 2 Datasets in test
程序名 程序版本 空間大小/kB輸入格式 測試命令cjpeg libjpeg-9b[18] 672 jpeg cjpeg @@exiv2 exiv2-0.25[19] 3 147 exif eixv2 @@ /dev/null infotocap ncurses-6.1[20] 253 text infotocap @@jhead jhead-3.00[21] 85 text jhead @@nm binutils-2.26.1[22] 5 791 elf nm-AD @@objdump binutils-2.26.1[22] 5 791 elf objdump-fdDh @@pdfimages xpdf-4.00[23] 1 677 pdf pdfimages @@ /dev/null pngfix libpng-1.6.36[24] 978 png pngfix @@readelf binutils-2.26.1[22] 5 791 elf readelf-a @@size binutils-2.26.1[22] 5 791 elf size-At @@tiffdump libtiff-4.0.10[25] 23 tiff tiffdump @@xmlwf libxpat-R.2.2.5[26] 258 xml xmlwf @@
本文設(shè)計(jì)了AFL、QSYM、Sol-QSYM共3組實(shí)驗(yàn),其中,前兩組為對照組,第3組為實(shí)驗(yàn)組。每組的配置方式均采用1個(gè)主fuzzer、兩個(gè)從fuzzer的配置結(jié)構(gòu),測試時(shí)間統(tǒng)一為12 h。本文中所有的被測程序、系統(tǒng)實(shí)現(xiàn)、對比實(shí)驗(yàn)均在統(tǒng)一的實(shí)驗(yàn)環(huán)境下進(jìn)行。具體的實(shí)驗(yàn)環(huán)境為:Ubuntu 16.04 LTS 64位系統(tǒng),Intel(R)Core(TM) i7-8700K CPU @ 3.70 GHz,16 GB RAM。
實(shí)驗(yàn)分別針對測試用例同步方法的兩部分進(jìn)行評估。對于測試用例生成方法的效果,通過導(dǎo)入數(shù)量進(jìn)行評估;對于測試用例處理方法的效果,由于難以單獨(dú)進(jìn)行評估,通過整體的代碼覆蓋率提升與程序崩潰狀態(tài)挖掘數(shù)量來進(jìn)行評估。
3.3.1 符號執(zhí)行求解結(jié)果的導(dǎo)入情況
表3為改進(jìn)前后的測試用例同步方法中符號執(zhí)行模塊測試用例的導(dǎo)入結(jié)果對比。
表3 QSYM與Sol-QSYM測試用例導(dǎo)入結(jié)果對比
Tab. 3 Comparison of testcases import results for QSYM and Sol-QSYM
測試程序 QSYM Sol-QSYM 導(dǎo)入數(shù)提升比例/%測試用例數(shù) 導(dǎo)入數(shù) 測試用例數(shù) 導(dǎo)入數(shù)cjpeg 153 22 368 25 13.64 exiv2 517 35 782 41 17.14 infotocap 1 638 15 1 744 18 20.00 jhead 955 57 961 66 15.79 nm 56 3 61 4 33.33 objdump 313 1 369 2 100.00 pdfimages 891 53 926 55 3.77 pngfix 739 222 797 234 5.41 readelf 1 458 153 1 644 179 16.99 size 24 2 27 2 0 tiffdump 368 5 387 6 20.00 xmlwf 1 082 21 1 473 32 52.38平均 682.83 49.08 794.92 55.33 12.73
表3中,測試用例個(gè)數(shù)是指最終提供給模糊測試模塊的測試用例數(shù)量。對于原方法,該數(shù)量為符號執(zhí)行模塊求解生成的測試用例數(shù)量;而對于改進(jìn)后的方法,指的是符號執(zhí)行求解生成的測試用例加上改進(jìn)后方法生成的測試用例的數(shù)量。
從表3可以看出,相同的時(shí)間內(nèi),改進(jìn)方法比原始方法得到了更多的測試用例,并提高了成功導(dǎo)入模糊測試模塊的測試用例數(shù)量。對于不同的程序,由于程序結(jié)構(gòu)的不同,導(dǎo)入數(shù)提升比例差異很大??偟膩碚f,12個(gè)程序的平均測試用例導(dǎo)入數(shù)提升比例為12.73%。
3.3.2 代碼覆蓋率情況
代碼覆蓋率是評估漏洞挖掘方法的一個(gè)綜合性指標(biāo),它衡量了一定時(shí)間內(nèi)漏洞挖掘工具所能到達(dá)的程序空間。
統(tǒng)計(jì)了相同時(shí)間內(nèi)12個(gè)被測程序在使用AFL和QSYM、Sol-QSYM方法挖掘漏洞時(shí)的代碼覆蓋率信息,如表4所示。從表4中可以看到,本文方法能很好地提高漏洞挖掘的代碼覆蓋率,特別地,相較于QSYM的平均效率提升為9.07%。同時(shí)結(jié)合表2可以發(fā)現(xiàn),當(dāng)被測程序的程序規(guī)模大小不同,本文方法的提升的代碼覆蓋率比例也不同。一般來說,當(dāng)被測程序規(guī)模較大時(shí),相較于AFL與QSYM,本文方法能夠提升較多的代碼覆蓋率。
表4 AFL、QSYM和Sol-QSYM的代碼覆蓋率對比
Tab. 4 Comparison of code coverage rates for AFL, QSYM and Sol-QSYM
測試程序 歸一化的覆蓋率信息/% Sol-QSYM相較于QSYM提升比例/%AFL QSYM Sol-QSYM cjpeg 2.63 2.65 2.69 1.51 exiv2 12.73 17.55 19.42 10.66 infotocap 4.45 4.48 4.58 2.23 jhead 0.76 1.67 1.86 11.38 nm 6.08 6.52 6.83 4.75 objdump 1.00 1.08 1.35 25.00 pdfimages 4.19 4.20 4.27 1.67 pngfix 4.48 4.93 5.02 1.83 readelf 9.58 9.70 11.52 18.76 size 5.61 6.57 7.52 14.46 tiffdump 0.71 0.79 0.81 2.53 xmlwf 7.38 7.45 7.85 5.37平均 4.97 5.63 6.14 9.07
同時(shí),給出AFL和QSYM、Sol-QSYM方法的代碼覆蓋率隨時(shí)間變化曲線,如圖4所示。由圖4可看到,應(yīng)用本文方法后,相同時(shí)間內(nèi)相較于AFL和QSYM,Sol-QSYM能更快地探索到更多的程序代碼空間。
圖4 AFL、QSYM和Sol-QSYM的代碼覆蓋率隨時(shí)間變化曲線Fig. 4 Curves of code coverage rates for AFL, QSYM and Sol-QSYM with time
3.3.3 觸發(fā)程序崩潰情況
收集統(tǒng)計(jì)了在相同時(shí)間和相同資源情況下,AFL、QSYM和Sol-SQYM分別觸發(fā)目標(biāo)程序崩潰即Crash的測試用例數(shù)量,結(jié)果見表5。
表5 AFL、QSYM和Sol-QSYM的程序崩潰狀態(tài)挖掘結(jié)果
Tab. 5 Crash mining results for AFL, QSYM and Sol-QSYM
測試程序 Crash個(gè)數(shù)AFL QSYM Sol-QSYM cjpeg 16 21 30 exiv2 0 0 0 infotocap 86 110 137 jhead 0 0 0 nm 0 0 0 objdump 8 17 18 pdfimages 0 1 1 pngfix 0 0 0 readelf 0 0 0 size 1 1 2 tiffdump 0 0 0 xmlwf 0 0 0總計(jì) 111 150 188
由表5可知,使用本文改進(jìn)后的測試用例同步方法發(fā)現(xiàn)的Crash總數(shù)為188個(gè),高于AFL和原有混合式漏洞挖掘方法QSYM發(fā)現(xiàn)的111、150個(gè)。該結(jié)果說明本文改進(jìn)后的測試用例同步方法能夠提高漏洞挖掘能力。
本文分析了現(xiàn)有混合式漏洞挖掘工作中模糊測試與符號執(zhí)行模塊間的測試用例同步方法存在的問題,提出了基于程序關(guān)鍵點(diǎn)的測試用例同步方法。在混合式漏洞挖掘工具QSYM的基礎(chǔ)上,實(shí)現(xiàn)了新的測試用例同步方法及系統(tǒng)原型Sol-QSYM,并針對12個(gè)現(xiàn)實(shí)程序展開了實(shí)驗(yàn)評估。實(shí)驗(yàn)結(jié)果表明,相較于以往的混合式漏洞挖掘方法中的測試用例同步方法,改進(jìn)后的測試用例同步方法能夠提高模塊測試模塊對符號執(zhí)行模塊生成測試用例的導(dǎo)入率,并能幫助混合漏洞挖掘方法更快且更深地探索程序的代碼空間,同時(shí)能發(fā)現(xiàn)更多的程序崩潰狀態(tài)。這些結(jié)果表明改進(jìn)后的測試用例同步方法可以很好地提高混合式漏洞挖掘?qū)Ψ枅?zhí)行模塊得到信息的利用效率。
在未來的研究工作中,將繼續(xù)對混合式漏洞挖掘中的模塊間信息同步方式進(jìn)行研究,探索符號執(zhí)行模塊得到的測試用例中的程序結(jié)構(gòu)信息與狀態(tài)信息,用于指導(dǎo)模糊測試。