余媛萍 蘇璞睿
1 (中國(guó)科學(xué)院軟件研究所可信計(jì)算與信息保障實(shí)驗(yàn)室 北京 100190)
2 (中國(guó)科學(xué)院大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 北京 100190)
3 (中國(guó)科學(xué)院大學(xué)網(wǎng)絡(luò)空間安全學(xué)院 北京 100190)
堆內(nèi)存錯(cuò)誤類漏洞作為一種經(jīng)典的程序漏洞[1],一旦觸發(fā)會(huì)影響程序功能正常執(zhí)行,甚至被攻擊者利用造成系統(tǒng)執(zhí)行任意代碼.其中,C 和C++開發(fā)語言因其執(zhí)行的高效性,被廣泛應(yīng)用于底層系統(tǒng)、共享庫或者性能需求高的軟件開發(fā)中,但因缺乏邊界檢查、人工顯式內(nèi)存管理、軟件版本的不斷功能迭代和開發(fā)者能力參差不齊等原因,極少數(shù)軟件維護(hù)者能一直清晰定位到堆內(nèi)存操作行為能否正常執(zhí)行,使軟件面臨大量堆內(nèi)存錯(cuò)誤類漏洞[1-2].因此,開源軟件版本發(fā)布之前,進(jìn)行充分的代碼安全性測(cè)試是發(fā)現(xiàn)和預(yù)防潛在安全威脅的重要手段,也是目前研究的熱點(diǎn)問題.
模糊測(cè)試作為一種常用的軟件錯(cuò)誤檢測(cè)技術(shù),具有效率高和易部署的優(yōu)勢(shì),被安全廠商廣泛使用,例如谷歌開源的AFL[3],LibFuzzer[4]項(xiàng)目等,可以基于代碼覆蓋率導(dǎo)向程序功能覆蓋測(cè)試,并取得了很好的漏洞測(cè)試效果[3].模糊測(cè)試是從無限的程序執(zhí)行狀態(tài)空間中探索出錯(cuò)狀態(tài)空間的過程[5].但是現(xiàn)有灰盒模糊測(cè)試方法集中在利用代碼維度覆蓋信息反饋引導(dǎo).例如,MemFuzz[6]采用簡(jiǎn)單的內(nèi)存讀寫指令覆蓋,如load,store 指令;TortoiseFuzz[7]關(guān)注重點(diǎn)易錯(cuò)代碼區(qū)域,如系統(tǒng)調(diào)用函數(shù)、循環(huán)結(jié)構(gòu)等.有一些為細(xì)粒度的代碼狀態(tài)探索設(shè)計(jì)的反饋信息,例如:PathAFL[8]引入路徑hpath 覆蓋率探索新程序執(zhí)行路徑;Angora[9]引入n-gram 代碼控制流上下文關(guān)聯(lián)信息.Memlock[10]監(jiān)測(cè)了內(nèi)存消耗峰值,僅能挖掘潛在的內(nèi)存消耗類漏洞,如遞歸漏洞.由此可見,現(xiàn)有信息反饋集中在代碼區(qū)域執(zhí)行計(jì)數(shù)維度的程序狀態(tài)探索,對(duì)于堆內(nèi)存錯(cuò)誤類漏洞感知力有限.
本文提出一種新的堆內(nèi)存行為信息反饋方法HeapAFL,在關(guān)注代碼區(qū)域覆蓋信息的同時(shí)記錄執(zhí)行時(shí)堆內(nèi)存操作狀態(tài)信息,通過增加模糊測(cè)試工具對(duì)堆操作行為的控制流和數(shù)據(jù)流信息敏感性,來更高概率觸發(fā)堆內(nèi)存錯(cuò)誤類漏洞.為實(shí)現(xiàn)HeapAFL 方法,需要解決2 個(gè)問題:
1)如何快速記錄堆操作行為信息
程序執(zhí)行中堆內(nèi)存行為量極其大,如何在模糊測(cè)試資源、時(shí)間有限的環(huán)境中快速記錄、存儲(chǔ)和比較行為信息,從而快速感知和探索新的堆內(nèi)存狀態(tài)空間是一個(gè)重要的問題.為平衡開銷和效率,本文利用靜態(tài)分析插樁追蹤程序運(yùn)行時(shí)的堆操作函數(shù)位置及其參數(shù)執(zhí)行信息,設(shè)計(jì)了一個(gè)新的堆操作信息記錄結(jié)構(gòu)heapmap,以實(shí)際行為參數(shù)值作為結(jié)構(gòu)偏移索引來存儲(chǔ)信息,以結(jié)構(gòu)索引值內(nèi)容的累計(jì)計(jì)數(shù)記錄當(dāng)前輸入影響的堆內(nèi)存操作行為.最終,heapmap記錄的是一次程序執(zhí)行中所有堆操作行為信息,包括數(shù)量和類別.
2)如何引導(dǎo)堆操作行為空間狀態(tài)的探索
已有模糊測(cè)試通過變異程序輸入,探索不同代碼覆蓋進(jìn)行代碼功能測(cè)試,取得了很好的效果.如何利用記錄的堆操作行為信息感知程序執(zhí)行中堆操作敏感的數(shù)據(jù)流和控制流信息,導(dǎo)向多樣化狀態(tài)空間是一個(gè)難題.本文在保持原有代碼覆蓋率信息的基礎(chǔ)上,動(dòng)態(tài)記錄一個(gè)全局最多樣化堆操作行為結(jié)構(gòu),在堆操作函數(shù)執(zhí)行次數(shù),或者參數(shù)值受當(dāng)前種子輸入影響的范圍比歷史所有種子都大的情況下,更新當(dāng)前種子為最高變異優(yōu)先級(jí)favored,獲得下輪種子變異及產(chǎn)生后代的優(yōu)先權(quán),從而探索多樣化堆操作空間.
總體而言,本文提出的方法HeapAFL 具有2 個(gè)特點(diǎn):1)引入了一個(gè)新穎的堆內(nèi)存行為信息反饋維度,在關(guān)注代碼覆蓋執(zhí)行狀態(tài)的同時(shí)感知堆操作行為維度的狀態(tài)空間信息;2)設(shè)計(jì)了多樣化堆操作行為引導(dǎo)策略,用于調(diào)整模糊測(cè)試中種子變異優(yōu)先級(jí).基于這2 個(gè)特點(diǎn),本文設(shè)計(jì)和實(shí)現(xiàn)了一個(gè)堆內(nèi)存狀態(tài)探索工具HeapAFL,通過編寫LLVM 靜態(tài)代碼分析插件來分析源代碼信息,識(shí)別并插樁堆操作函數(shù)及其參數(shù),獲取執(zhí)行時(shí)堆操作行為信息,引導(dǎo)模糊測(cè)試進(jìn)行堆內(nèi)存狀態(tài)探索并通過詳細(xì)的實(shí)驗(yàn)測(cè)試評(píng)估了其有效性.
具體而言,本文在CVE(common vulnerabilities and exposures)官方網(wǎng)站上收集了6 個(gè)最近有新CVE 號(hào)公布的開源應(yīng)用程序,復(fù)現(xiàn)已知漏洞和挖掘新漏洞的效果測(cè)試效率.本文將HeapAFL 和6 個(gè)最先進(jìn)的開源模糊測(cè)試方法AFL[3],AFLFast[11],PathAFL[8],Tortoise-Fuzz[7],Angora[9],Memlock[10]進(jìn)行比較.本文進(jìn)行多次實(shí)驗(yàn)并統(tǒng)計(jì)了Mann Whitney U-test 值用作統(tǒng)計(jì)分析評(píng)估.實(shí)驗(yàn)結(jié)果表明,HeapAFL 在挖掘堆漏洞效果上的統(tǒng)計(jì)顯著性優(yōu)于6 個(gè)基準(zhǔn)模糊測(cè)試方法.在崩潰觸發(fā)和漏洞發(fā)現(xiàn)速率上快于相關(guān)工作.實(shí)驗(yàn)測(cè)試中CPU總共運(yùn)行了4 032 h,HeapAFL 方法在數(shù)據(jù)集上挖掘到了25 個(gè)堆內(nèi)存錯(cuò)誤類漏洞,其中包括6 個(gè)未知的堆內(nèi)存錯(cuò)誤類漏洞.
本文做出了3 方面的貢獻(xiàn):
1)提出了一種新穎的程序狀態(tài)感知方式,有效挖掘堆內(nèi)存錯(cuò)誤類漏洞.靜態(tài)插樁記錄輕量級(jí)堆操作行為反饋信息,用于種子優(yōu)選變異策略,導(dǎo)向多樣化堆操作狀態(tài)空間.
2)實(shí)現(xiàn)了HeapAFL 方法的原型系統(tǒng),并評(píng)估了方案的有效性.其在漏洞數(shù)量和挖掘效率上的實(shí)驗(yàn)效果優(yōu)于最先進(jìn)的模糊測(cè)試工具,共發(fā)現(xiàn)25 個(gè)堆內(nèi)存錯(cuò)誤漏洞,其中有6 個(gè)未知的堆內(nèi)存錯(cuò)誤漏洞.
3)在線上倉庫中開源了工具源代碼①倉庫的開源網(wǎng)址是:https://github.com/Clingto/HeapAFL.和測(cè)試數(shù)據(jù)用于后續(xù)工作研究.
程序的內(nèi)存空間包括棧內(nèi)存和堆內(nèi)存.棧內(nèi)存空間在執(zhí)行期間由編譯器自動(dòng)分配和回收,且已有的棧內(nèi)存防護(hù)機(jī)制幾乎可以阻斷棧內(nèi)存錯(cuò)誤漏洞利用的發(fā)生,因此其危害性相對(duì)較小.堆內(nèi)存生命周期通過程序開發(fā)者動(dòng)態(tài)顯式管理,即堆內(nèi)存的分配和釋放依靠手工操作,比起棧內(nèi)存自動(dòng)回收內(nèi)存的機(jī)制更容易出錯(cuò).另外,堆內(nèi)存操作靈活、管理機(jī)制復(fù)雜度高,因此堆漏洞的挖掘和防護(hù)仍然是目前共有的難題.
本文利用灰盒模糊測(cè)試技術(shù)挖掘開源軟件中的堆內(nèi)存錯(cuò)誤類漏洞.首先介紹堆操作相關(guān)的內(nèi)存行為和灰盒模糊測(cè)試技術(shù)流程組件,然后用一個(gè)小的漏洞程序闡述已有工作在挖掘堆內(nèi)存錯(cuò)誤類漏洞存在的局限.
堆內(nèi)存錯(cuò)誤類漏洞存在歷史長(zhǎng)達(dá)數(shù)十年,據(jù)MITRE 公司官方統(tǒng)計(jì),其仍是最危險(xiǎn)的軟件安全性漏洞之一[1-2].漏洞發(fā)生在堆內(nèi)存對(duì)象中的內(nèi)容被某些非預(yù)期程序行為意外修改,而后續(xù)程序執(zhí)行中對(duì)修改內(nèi)容的訪問行為會(huì)造成程序錯(cuò)誤.
為方便展示程序執(zhí)行中的多樣堆內(nèi)存操作行為,本文截取了程序執(zhí)行中的1 個(gè)時(shí)間片t1~t8中堆對(duì)象obj1,obj2,obj3,obj4 的行為信息,如圖1 所示.縱軸代表內(nèi)存中的堆對(duì)象,橫軸代表執(zhí)行時(shí)刻信息.在程序運(yùn)行時(shí),堆操作代碼執(zhí)行產(chǎn)生大量堆對(duì)象,每個(gè)堆對(duì)象涉及大量堆操作行為,包括堆對(duì)象自身的使用信息,及與其他堆對(duì)象的相互引用信息.以堆對(duì)象obj1為例,其內(nèi)存空間在時(shí)刻t1得到分配,在不同時(shí)刻被堆對(duì)象obj2 和obj4 引用,甚至被堆對(duì)象obj3 二級(jí)引用,在時(shí)刻t6釋放回系統(tǒng)內(nèi)存,從而結(jié)束正常堆內(nèi)存操作行為信息.堆內(nèi)存錯(cuò)誤類漏洞與程序執(zhí)行中堆操作行為關(guān)聯(lián)緊密,表1 列舉了堆操作相關(guān)的內(nèi)存錯(cuò)誤類漏洞及其細(xì)節(jié)信息,包括CWE(common weakness enumeration)的錯(cuò)誤類型描述、漏洞類型、2022 年CWE 官方統(tǒng)計(jì)最危險(xiǎn)的25 種軟件錯(cuò)誤類型排名和公共漏洞評(píng)分系統(tǒng)(common vulnerability scoring system,CVSS)分?jǐn)?shù)值[2].堆內(nèi)存錯(cuò)誤類漏洞包括堆溢出(HBO)、空指針解引用(NPD)、多次釋放(DF)、釋放后重用(UAF)和內(nèi)存泄露(ML).
Table 1 Heap-Based Memory Error Types and Their Details表1 堆操作相關(guān)的內(nèi)存錯(cuò)誤類型及其細(xì)節(jié)信息
Fig.1 Heap object operation behavior when program executing圖1 程序執(zhí)行時(shí)堆對(duì)象操作行為
灰盒模糊測(cè)試是一種常用的漏洞挖掘技術(shù)[12],其使用程序執(zhí)行中提取的反饋信息,引導(dǎo)模糊測(cè)試進(jìn)程探索更多程序狀態(tài)從而檢測(cè)程序錯(cuò)誤,流程如圖2所示.其基于程序執(zhí)行反饋信息,將保存有意義的種子存進(jìn)種子隊(duì)列,在隊(duì)列中優(yōu)選更有價(jià)值的種子執(zhí)行種子變異算法操作,從而觸發(fā)新的代碼路徑或者新的程序狀態(tài).
Fig.2 Workflow of greybox fuzzing圖2 灰盒模糊測(cè)試工作流程
流行的模糊測(cè)試工具,例如AFL,采用控制流邊覆蓋引導(dǎo)程序進(jìn)行未知代碼路徑探索,并取得了顯著的漏洞挖掘效果[3].但是,代碼覆蓋率反饋信息為程序全功能測(cè)試設(shè)計(jì),不能區(qū)分各個(gè)區(qū)域代碼執(zhí)行狀態(tài)的差異性.
除了代碼控制流邊覆蓋率反饋信息,有一些為細(xì)粒度的代碼狀態(tài)探索設(shè)計(jì)的反饋信息.例如,Angora 關(guān)注代碼上下文關(guān)聯(lián)分支覆蓋,PathAFL 關(guān)注路徑覆蓋,TortoiseFuzz 關(guān)注易錯(cuò)區(qū)域程序執(zhí)行路徑覆蓋等.Memlock 關(guān)注內(nèi)存消耗敏感的內(nèi)存操作函數(shù),用于挖掘潛在內(nèi)存消耗類漏洞.但是,集中于代碼執(zhí)行區(qū)域探索的信息反饋方式對(duì)于程序執(zhí)行時(shí)的堆內(nèi)存操作狀態(tài)感知力有限,從而限制了堆內(nèi)存錯(cuò)誤類漏洞的挖掘能力.
本節(jié)用一小段簡(jiǎn)化后的漏洞代碼片段闡述已有灰盒模糊測(cè)試工具在挖掘堆內(nèi)存錯(cuò)誤類漏洞上存在的不足.如圖3 代碼所示,樣例中存在一個(gè)堆內(nèi)存錯(cuò)誤漏洞,當(dāng)非正常訪問結(jié)構(gòu)體列表中某個(gè)結(jié)構(gòu)成員的數(shù)據(jù)指針*data指向數(shù)據(jù)的時(shí)候觸發(fā)內(nèi)存錯(cuò)誤.程序通過用戶的輸入決定switch 結(jié)構(gòu)里哪個(gè)case 操作將得到執(zhí)行.當(dāng)用戶輸入數(shù)字1 時(shí),程序在結(jié)構(gòu)體列表中添加1 個(gè)結(jié)構(gòu)成員,其包括分配定長(zhǎng)的結(jié)構(gòu)體大小的堆內(nèi)存空間和分配受輸入影響的變長(zhǎng)堆內(nèi)存空間2 次內(nèi)存分配,該結(jié)構(gòu)成員后續(xù)可以通過輸入數(shù)字控制執(zhí)行case 分支的不同操作,包括編輯、檢查和刪除分配到的結(jié)構(gòu)體對(duì)象.在while 循環(huán)不斷執(zhí)行過程中,代碼分支被覆蓋的程度加深,程序狀態(tài)變多,堆內(nèi)存行為也變得復(fù)雜.
Fig.3 Code lines of case example圖3 案例代碼
已有模糊測(cè)試工作的反饋信息對(duì)堆內(nèi)存行為沒有足夠的感知力,可能會(huì)忽略對(duì)漏洞發(fā)現(xiàn)有價(jià)值的種子及其后代變異機(jī)會(huì),減弱堆內(nèi)存錯(cuò)誤漏洞挖掘能力.以AFL 為例,種子1 執(zhí)行路徑代碼行為41—9—12—43—44—42,在多輪種子變異后,AFL 幾乎全覆蓋程序代碼(接近100%的代碼覆蓋率),失去反饋指導(dǎo)力,陷入接近于盲模糊測(cè)試階段;此時(shí),生成另一個(gè)與種子1 代碼覆蓋率相似且僅有堆操作行為不一樣的種子2,但是由于種子2 沒有引起代碼覆蓋率變化且執(zhí)行效率低,因此會(huì)被設(shè)置最低優(yōu)先級(jí)滯后變異.據(jù)手工分析,種子2 是模糊測(cè)試進(jìn)程中生成觸發(fā)漏洞的概念驗(yàn)證(proof of concept,POC)種子的關(guān)鍵先祖測(cè)試用例.其他內(nèi)存相關(guān)的模糊測(cè)試工作與上述情況類似,它們集中在代碼維度信息覆蓋和反饋,或多或少缺失程序執(zhí)行時(shí)的信息反饋.Memlock 雖然關(guān)注到了程序執(zhí)行時(shí)內(nèi)存使用的峰值變化,但僅針對(duì)內(nèi)存資源消耗類漏洞,削弱了多樣化堆操作行為探索,例如樣例中的種子2 是產(chǎn)生了新的堆內(nèi)存操作行為從而接近于POC,而不是新的內(nèi)存消耗峰值變化.
代碼覆蓋率反饋信息對(duì)堆內(nèi)存操作行為的感知不充分,而使用細(xì)粒度易錯(cuò)代碼區(qū)域敏感的反饋信息也局限于代碼執(zhí)行計(jì)數(shù),限制了程序堆內(nèi)存操作行為的狀態(tài)空間探索.本文引入新的堆內(nèi)存操作行為敏感的反饋信息,引導(dǎo)灰盒模糊測(cè)試工具探索開源軟件中多樣化的堆內(nèi)存操作狀態(tài),從而檢測(cè)未知錯(cuò)誤.
具體而言,模糊測(cè)試器通過變異種子收集并反饋程序執(zhí)行中受種子輸入影響的堆操作控制流和數(shù)據(jù)流信息,觀測(cè)種子執(zhí)行的中斷信號(hào)來判斷程序執(zhí)行異常.常用的細(xì)粒度程序分析方法是根據(jù)程序的控制依賴或者數(shù)據(jù)依賴圖,例如UAFL[13-15]等利用指針依賴分析或者程序切片指導(dǎo)堆操作行為順序執(zhí)行,理論上可以準(zhǔn)確預(yù)知程序執(zhí)行狀態(tài),但效果受限于程序靜態(tài)分析技術(shù)性能瓶頸.因此,本文不依賴程序分析而記錄粗粒度的堆操作行為反饋信息,該方法在原型系統(tǒng)中被驗(yàn)證是有效的.
程序執(zhí)行中堆操作行為信息量龐大,如何表示和記錄執(zhí)行時(shí)的堆操作行為是一個(gè)難題.為了平衡執(zhí)行效率和記錄開銷,本文提出一種輕量級(jí)堆操作行為跟蹤機(jī)制,通過插樁堆操作相關(guān)函數(shù)(例如malloc(),calloc(),realloc()等)的操作指令和操作參數(shù),記錄執(zhí)行時(shí)堆操作行為信息.
對(duì)于追蹤到的堆操作行為,快速判斷和反饋堆內(nèi)存操作控制流和數(shù)據(jù)流變化,可以引導(dǎo)模糊測(cè)試工具觸發(fā)更多堆內(nèi)存行為.本文使用程序執(zhí)行中操作的堆對(duì)象數(shù)量來表示和記錄堆操作函數(shù)所在控制流邊的執(zhí)行頻度,及其與當(dāng)前種子輸入的關(guān)聯(lián)性.除了堆操作行為相關(guān)的控制流信息,堆操作數(shù)據(jù)流信息敏感性也是一個(gè)重要的堆操作行為維度.本文通過堆操作函數(shù)參數(shù)值的變化判斷堆操作數(shù)據(jù)是否受當(dāng)前輸入樣本控制,從而判斷輸入堆操作數(shù)據(jù)流敏感性.
總體而言,本文將上述解決思想實(shí)現(xiàn)為一個(gè)整體的模糊測(cè)試系統(tǒng)HeapAFL,通過對(duì)系統(tǒng)的評(píng)估測(cè)試驗(yàn)證方法的有效性.HeapAFL 建立在流行的模糊測(cè)試框架AFL[3]上,并沿用AFL 相同的系統(tǒng)框架工作流程.
本節(jié)首先通過系統(tǒng)框架描述本文提出的HeapAFL方法,然后通過案例具體描述堆操作行為引導(dǎo)方法的執(zhí)行過程.
圖4 是HeapAFL 的系統(tǒng)框架圖,框架圖包括靜態(tài)分析和模糊測(cè)試2 個(gè)部分.靜態(tài)分析以程序源代碼為輸入,生成控制流信息和堆操作2 種程序信息(見4.1 節(jié)).靜態(tài)分析判斷程序插樁位置以及插樁指令類型,用于獲取程序執(zhí)行時(shí)的反饋信息.其中控制流信息用于引導(dǎo)代碼控制流邊覆蓋,而堆操作信息用于引導(dǎo)程序堆操作行為多樣化探索(見4.2 節(jié)).
Fig.4 Framework of HeapAFL圖4 HeapAFL 的系統(tǒng)框架圖
當(dāng)程序完成插樁操作后,HeapAFL 進(jìn)入持續(xù)的程序模糊測(cè)試循環(huán)階段.對(duì)于給定的初始種子集合,HeapAFL 首先從種子隊(duì)列中優(yōu)先選擇一個(gè)種子,利用多種變異策略生成測(cè)試集;接著,用插樁后的程序分別執(zhí)行測(cè)試集中每一個(gè)測(cè)試樣例,收集各個(gè)測(cè)試樣例執(zhí)行時(shí)的堆操作行為信息和控制流邊覆蓋信息,如果執(zhí)行觸發(fā)段中斷信號(hào)(segment fault,SEGV),則將測(cè)試樣例加入崩潰樣本集合,如果測(cè)試樣例執(zhí)行產(chǎn)生新代碼覆蓋則加入種子隊(duì)列;最后,通過堆內(nèi)存行為信息和程序執(zhí)行吞吐量選擇有價(jià)值的種子優(yōu)先執(zhí)行下一次種子變異操作,從而獲取產(chǎn)生更多后代種子的機(jī)會(huì).HeapAFL 重復(fù)上述模糊測(cè)試循環(huán)過程,直到測(cè)試到達(dá)預(yù)先設(shè)定的時(shí)間或者手動(dòng)結(jié)束模糊測(cè)試操作.
本節(jié)用案例展示HeapAFL 的執(zhí)行過程.圖5 是樣例程序的部分控制流轉(zhuǎn)移圖,圖5 由基本塊和控制流跳轉(zhuǎn)邊組成.模糊測(cè)試流程通過變異輸入樣本Input中的字節(jié),探索和覆蓋受輸入影響的控制流和數(shù)據(jù)流,從而測(cè)試程序的不同狀態(tài)空間.
Fig.5 Partial control flow transition of case example圖5 樣例程序局部控制流轉(zhuǎn)移
在靜態(tài)分析階段,HeapAFL 給每個(gè)基本塊頭部插樁了一個(gè)執(zhí)行計(jì)數(shù)器bitmap,記錄代碼覆蓋信息;給每個(gè)堆操作指令處插樁了一個(gè)指令定位及獲取其操作數(shù)值的位圖heapmap,記錄堆操作行為信息.HeapAFL 模糊測(cè)試時(shí),通過bitmap存儲(chǔ)的代碼覆蓋信息判斷并保存有新代碼覆蓋的測(cè)試樣例,逐步探索不同代碼分支,例如case 1,case 2 等.基于代碼覆蓋,case 1 分支上的2 個(gè)受輸入控制的堆操作malloc(const)和malloc(size)得到執(zhí)行,并產(chǎn)生堆操作行為.其中, 堆操作malloc(size)的堆大小參數(shù)值受輸入Input控制.heapmap可以記錄并感知影響case 1 分支中堆分配操作的控制流變化,例如堆對(duì)象數(shù)量變化,引導(dǎo)case 1 分支執(zhí)行;heapmap也可以記錄堆操作malloc(size)中堆大小參數(shù)受輸入影響的數(shù)據(jù)流行為變化,例如通過堆大小參數(shù)的變化判斷當(dāng)前測(cè)試用例輸入是否會(huì)影響堆操作值,從而引導(dǎo)堆空間大小數(shù)值的變化和堆數(shù)量的變化,探索多樣化堆操作行為.
本文工作是通過增加堆內(nèi)存對(duì)象的分配數(shù)量和增加復(fù)雜堆操作行為的執(zhí)行數(shù)量,使程序執(zhí)行時(shí)的堆內(nèi)存行為關(guān)聯(lián)更復(fù)雜,從而更高概率出錯(cuò).此處樣例程序的堆內(nèi)存錯(cuò)誤漏洞發(fā)生在case 3 分支中,結(jié)構(gòu)體指針成員因前面多次操作中的1 次異常堆內(nèi)存釋放操作的執(zhí)行,后續(xù)訪問無效指針內(nèi)存空間出錯(cuò).
在原型系統(tǒng)測(cè)試中,本文用AFL 檢測(cè)出堆內(nèi)存錯(cuò)誤漏洞用了39.65 min,用HeapAFL 工具測(cè)試僅用了2.55 min.
本節(jié)介紹堆操作行為引導(dǎo)方法中靜態(tài)分析插樁和模糊測(cè)試循環(huán)2 部分的詳細(xì)設(shè)計(jì)及實(shí)現(xiàn).
HeapAFL 靜態(tài)分析判斷待測(cè)程序的插樁方式,用于收集導(dǎo)向信息,驅(qū)動(dòng)模糊測(cè)試進(jìn)程.基于代碼控制流信息分析,HeapAFL 插樁收集代碼覆蓋引導(dǎo)路徑探索.基于堆操作分析,收集執(zhí)行時(shí)堆內(nèi)存操作行為變化,引導(dǎo)模糊測(cè)試在有限時(shí)間范圍內(nèi)探索多樣化堆內(nèi)存行為.
為了方便描述方法,本文使用如下術(shù)語.
術(shù)語1.控制流邊.HeapAFL 沿用AFL 基于控制流轉(zhuǎn)移圖(control flow graph,CFG)記錄控制流邊覆蓋(branch coverage)信息的方式.在基本塊頭部插入以偽隨機(jī)邊數(shù)值(即ID)標(biāo)識(shí)的8 b 計(jì)數(shù)器,追蹤程序執(zhí)行時(shí)每條控制流邊的執(zhí)行次數(shù),并通過不同計(jì)數(shù)數(shù)量級(jí)對(duì)計(jì)數(shù)值設(shè)置分類桶,即按照控制流邊執(zhí)行次數(shù)1,2,4~7,8~15,16~31,…,128~255 等分為8 個(gè)類別.最終,1 次程序執(zhí)行的全部代碼控制流邊覆蓋信息被記錄進(jìn)路徑bitmap中.
術(shù)語2.路徑bitmap.大小為2K的8 b 數(shù)組計(jì)數(shù)器,計(jì)數(shù)值保存在以邊ID 為索引的bitmap偏移值中(在AFL 中,K=16).
術(shù)語3.堆內(nèi)存操作.堆內(nèi)存分配操作,例如,malloc(size),calloc(size),realloc(size)等,決定可操作的堆內(nèi)存對(duì)象數(shù)量.當(dāng)堆操作敏感的控制流或者堆操作參數(shù)值size敏感的數(shù)據(jù)流受程序輸入影響時(shí),可以基于影響堆內(nèi)存操作的輸入引導(dǎo)模糊測(cè)試探索更多堆內(nèi)存行為狀態(tài).
需要提到的是,本文插樁標(biāo)準(zhǔn)的系統(tǒng)庫堆內(nèi)存操作獲取函數(shù)操作指令和參數(shù).部分程序采用自定義堆內(nèi)存操作函數(shù),但大部分程序仍依賴于系統(tǒng)庫與內(nèi)存交互,因此本文不處理極少數(shù)用戶自定義但不依賴標(biāo)準(zhǔn)庫的內(nèi)存操作函數(shù).
術(shù)語4.堆操作行為heapmap.大小為2K的8 b 數(shù)組計(jì)數(shù)器,計(jì)數(shù)值保存在以操作參數(shù)size為索引的heapmap偏移值中(K=16).所有計(jì)數(shù)器計(jì)數(shù)累加值增大,或者計(jì)數(shù)非零項(xiàng)增加,表明此次測(cè)試樣例中存在影響堆操作的控制流或者數(shù)據(jù)流信息的字節(jié),可以優(yōu)先選擇變異該種子及關(guān)聯(lián)字節(jié).
信息反饋插樁實(shí)現(xiàn)細(xì)節(jié)如算法1 所示,本文基于LLVM[16]代碼分析框架分析應(yīng)用程序,基于分析結(jié)果插樁代碼片段收集反饋信息,引導(dǎo)模糊測(cè)試進(jìn)程.除了AFL 的控制流邊代碼覆蓋信息,本文還插樁堆內(nèi)存操作信息.具體而言,本文沿用AFL 在每個(gè)基本塊頭部(算法1 的行⑤)插樁記錄邊覆蓋BranchCov(算法1 的行②);除此以外,插樁堆內(nèi)存操作函數(shù)及其操作數(shù)值opd(算法1 的行⑦),以操作數(shù)值為索引記錄堆操作行為信息存入heapmap(算法1 的行③).
算法1.反饋信息插樁算法.
基于4.1 節(jié)所述的靜態(tài)插樁階段獲取的反饋信息,模糊測(cè)試通過選種、變異等模塊引導(dǎo)測(cè)試進(jìn)程逐漸接近目標(biāo)狀態(tài).模糊測(cè)試中每個(gè)測(cè)試用例有一個(gè)選擇概率,HeapAFL 基于選擇概率判斷種子下一輪變異產(chǎn)生后代的概率,概率高的測(cè)試用例會(huì)被優(yōu)先選擇變異.被選中的種子會(huì)執(zhí)行變異操作,產(chǎn)生一定數(shù)量的測(cè)試用例,其中產(chǎn)生新代碼覆蓋的測(cè)試用例會(huì)加入種子隊(duì)列等待被選擇.
術(shù)語5.選擇概率Prob.種子被選擇測(cè)試的概率,設(shè)置為favored 的種子一定會(huì)被測(cè)試到,否則以大小為a的概率被測(cè)試執(zhí)行.本文設(shè)置a= 0.01.
術(shù)語6.累計(jì)堆操作行為.累計(jì)當(dāng)前測(cè)試用例執(zhí)行的堆操作數(shù)量,用于判斷其執(zhí)行是否影響堆操作控制流信息;除此以外,累計(jì)堆操作數(shù)值size分類的類別數(shù)量,便于快速比較、判斷當(dāng)前測(cè)試用例堆操作參數(shù)是否數(shù)據(jù)流敏感.
術(shù)語7.優(yōu)先變異.如果當(dāng)前種子的累計(jì)堆操作行為,即堆操作數(shù)總量或者堆操作數(shù)值類別總量多于歷史最高值,則設(shè)置種子的選擇概率為100%.
堆操作行為引導(dǎo)的灰盒模糊測(cè)試算法實(shí)現(xiàn)細(xì)節(jié)如算法2 所示.本文修改AFL-2.52b[3]的核心模糊測(cè)試組件,利用算法1 所述的插樁獲取的反饋信息,即代碼控制流邊覆蓋BranchCov和堆操作行為信息heapmap,升級(jí)了AFL 的種子優(yōu)選變異策略.
算法2.堆操作行為引導(dǎo)的灰盒模糊測(cè)試算法.
種子變異產(chǎn)生一定數(shù)量的后代測(cè)試用例,其中觸發(fā)程序段中斷信號(hào)SEGV 的測(cè)試用例保存進(jìn)崩潰樣例集合(算法2 的行?),產(chǎn)生新代碼覆蓋的測(cè)試樣例保存進(jìn)種子隊(duì)列集合(算法2 的行?);接著,給當(dāng)前種子計(jì)算累計(jì)堆操作行為HeapBehav,根據(jù)HeapBehav值與全局最大累計(jì)堆操作行為global_HeapBehav的比較值,設(shè)置當(dāng)前種子的選擇概率,即favored 與否(算法2 的行?~?);最后,優(yōu)先選擇設(shè)置為favored的種子進(jìn)行變異(算法2 的行⑤⑥⑦).模糊測(cè)試循環(huán)會(huì)一直執(zhí)行直到超時(shí)或者人工停止測(cè)試.
本文基于真實(shí)應(yīng)用程序組成的測(cè)試集進(jìn)行了詳細(xì)的實(shí)驗(yàn)測(cè)試,評(píng)估上述原型系統(tǒng)HeapAFL.更詳細(xì)的細(xì)節(jié)信息見本文開源倉庫.實(shí)驗(yàn)主要回答3 個(gè)問題:
問題1.HeapAFL 是否可以挖掘到真實(shí)應(yīng)用程序漏洞.
問題2.優(yōu)先變異策略是否可以提升堆內(nèi)存漏洞挖掘效率.
問題3.HeapAFL 堆內(nèi)存錯(cuò)誤類漏洞挖掘能力是否優(yōu)于相關(guān)模糊測(cè)試對(duì)比工作.
本文從4 個(gè)角度設(shè)置了詳細(xì)的實(shí)驗(yàn)對(duì)比方案評(píng)估HeapAFL 效果.
1)相關(guān)對(duì)比工作.本文對(duì)比6 個(gè)先進(jìn)的基準(zhǔn)模糊測(cè)試工具,包括AFL, AFLFast, PathAFL, TortoiseFuzz,Angora, Memlock,表2 列出了對(duì)比工具發(fā)表的會(huì)議及其年份.對(duì)比工具的選擇基于以下考慮:AFL 是一個(gè)廣泛使用和用于比較的灰盒模糊測(cè)試工具;AFLFast是AFL 的升級(jí)版,優(yōu)化了種子優(yōu)選變異策略;PathAFL,TortoiseFuzz,Angora 分別基于代碼路徑、易錯(cuò)代碼域和n-gram 代碼控制流邊的探索程序狀態(tài);Memlock是基于運(yùn)行時(shí)信息,即內(nèi)存消耗峰值挖掘資源消耗類漏洞.需要提到,本文沒有選取MemFuzz 作為對(duì)比工具,一方面其沒有開放源碼,另一方面其關(guān)注內(nèi)存的讀寫信息,與堆內(nèi)存操作信息關(guān)注點(diǎn)不同.總結(jié)來說,本文選擇多種具有代表性、廣泛應(yīng)用于漏洞挖掘?qū)嵺`的先進(jìn)模糊測(cè)試工具作為基準(zhǔn)對(duì)比工作,用于評(píng)估方案效果.
Table 2 Related Work of Fuzzing表2 模糊測(cè)試相關(guān)工作
2)測(cè)試集合.本文選取數(shù)據(jù)集基于下面的因素考慮:應(yīng)用程序存在已知1day 堆內(nèi)存錯(cuò)誤類漏洞且可能挖掘到未知0day 漏洞、流行度高、測(cè)試頻度高、開源社區(qū)活躍度高和功能多樣等.根據(jù)已經(jīng)發(fā)現(xiàn)過漏洞的程序再次出現(xiàn)新漏洞的概率更大的判斷,本文在CVE 官方網(wǎng)站上收集了6 個(gè)最近有堆內(nèi)存錯(cuò)誤類CVE 號(hào)公布的開源應(yīng)用程序,分別包括圖片處理工具jpegoptim、編譯器yasm、物聯(lián)網(wǎng)固件平臺(tái)mjs、知名的開發(fā)工具readelf、視頻處理器mp4box 和文檔處理器mxmldoc.
3)性能指標(biāo).為對(duì)比相關(guān)基準(zhǔn)模糊測(cè)試工具,最直觀的方式是通過發(fā)現(xiàn)的漏洞數(shù)量判斷工具的漏洞挖掘能力;除此以外,本文設(shè)計(jì)堆內(nèi)存行為優(yōu)先變異策略,因此漏洞挖掘效率評(píng)估也是一個(gè)重要指標(biāo).本文對(duì)比了漏洞數(shù)量、程序崩潰crash[3]數(shù)量和漏洞發(fā)現(xiàn)時(shí)間.此外,本文進(jìn)行Mann Whitney U-test 統(tǒng)計(jì)分析,判斷各個(gè)工具的執(zhí)行效果對(duì)比的顯著性.本文的模糊測(cè)試執(zhí)行速度通過每秒測(cè)試樣例的執(zhí)行數(shù)量表示,用于判斷測(cè)試工具的執(zhí)行效率.
4)實(shí)驗(yàn)配置參數(shù).由于模糊測(cè)試技術(shù)依賴隨機(jī)變異過程,所以測(cè)試中可能存在自然的性能抖動(dòng).本文采取2 個(gè)策略,每個(gè)程序測(cè)試相對(duì)較長(zhǎng)的時(shí)間以達(dá)到穩(wěn)定狀態(tài),例如12 h;每組實(shí)驗(yàn)測(cè)試8 次,進(jìn)行統(tǒng)計(jì)分析用于評(píng)估工具統(tǒng)計(jì)有效性.實(shí)驗(yàn)中CPU 總共測(cè)試4 032(6×7×8×12)h.編譯測(cè)試程序的編譯器版本是clang6.0.0,測(cè)試的軟件包、程序版本和執(zhí)行選項(xiàng)如表3 所示.實(shí)驗(yàn)機(jī)器是64 位Ubuntu LTS 16.04,CPU配置為Intel?Xeon?CPU E5-2630 v3,處理器 2.40 GHz,32 核,內(nèi)存32 GB.
Table 3 Real-world Programs Tested in Experiment表3 實(shí)驗(yàn)中測(cè)試的真實(shí)程序
本文模糊測(cè)試沿用AFL[3]段中斷信號(hào)SEGV 識(shí)別程序崩潰樣本,并存入崩潰樣本集合.接著,使用ASAN[17](AddressSanitizer)工具的程序崩潰棧哈希值篩除集合中重復(fù)的程序崩潰樣本;然后,手工驗(yàn)證剩余樣本崩潰信息,構(gòu)建其與公布的漏洞CVE 號(hào)或者錯(cuò)誤報(bào)告的關(guān)聯(lián)性來識(shí)別漏洞.對(duì)于沒有檢索到漏洞信息的崩潰,將其上報(bào)給CVE 官方漏洞庫確認(rèn)后會(huì)給漏洞發(fā)布一個(gè)唯一標(biāo)識(shí)ID,即CVE 漏洞編號(hào).
本文實(shí)驗(yàn)中,HeapAFL 在測(cè)試集中總共挖掘到30 個(gè)漏洞,其中25 個(gè)是堆內(nèi)存錯(cuò)誤類漏洞,5 個(gè)是棧溢出漏洞(SO).表4 中列舉了挖掘到的漏洞的詳細(xì)信息,包括漏洞ID、漏洞類型(詳見1.1 節(jié))、漏洞狀態(tài)、測(cè)試程序和程序版本號(hào).其中,狀態(tài)標(biāo)識(shí)為1day表明前人發(fā)現(xiàn)了此漏洞并公開了漏洞信息,標(biāo)識(shí)為0day 的漏洞表明本文崩潰樣例POC 觸發(fā)的漏洞是當(dāng)前版本的未知漏洞,未檢索到相關(guān)信息.HeapAFL 在當(dāng)前測(cè)試集上共發(fā)現(xiàn)8 個(gè)未知漏洞,其中有6 個(gè)堆內(nèi)存錯(cuò)誤類漏洞,在上報(bào)給CVE 官網(wǎng)后,獲得了2 個(gè)新的CVE 編號(hào),即CVE-2021-33461 和CVE-2021-33462,其余漏洞在審核當(dāng)中.
Table 4 Real-world Vulnerabilities Found by HeapAFL表4 HeapAFL 挖掘到的真實(shí)漏洞
本文基于相同測(cè)試集重跑開源工具進(jìn)行對(duì)比實(shí)驗(yàn).本節(jié)基于崩潰數(shù)量隨時(shí)間的增長(zhǎng)趨勢(shì)和堆內(nèi)存錯(cuò)誤類漏洞第1 次被發(fā)現(xiàn)的時(shí)間評(píng)估HeapAFL 的漏洞挖掘效率.
圖6 中展示了測(cè)試集上6 個(gè)程序在對(duì)比工具上的崩潰數(shù)量隨著時(shí)間增長(zhǎng)的曲線圖.需要注意的是,AFL 定義了一種崩潰記錄方式,該方式是一種常見的模糊測(cè)試效率的評(píng)估指標(biāo),詳細(xì)信息見AFL 用戶手冊(cè)文檔[3].HeapAFL, AFLFast, TortoiseFuzz,Memlock沿用了AFL 框架流程,Angora 和PathAFL 的日志文件記錄的信息與AFL 不同,此處不展示.從圖6 中可以看出,HeapAFL 在gpac, yasm, binutils,mjs 這4 個(gè)程序上的崩潰數(shù)量能快速多于其他工具觸發(fā)崩潰且持續(xù)增長(zhǎng);在mxml 測(cè)試程序的模糊測(cè)試過程中前1 h能快速觸發(fā)崩潰,后續(xù)速度慢于其他相關(guān)工作,但最終能達(dá)到與最高數(shù)量124 接近的崩潰數(shù)量104;在jpegoptim 程序上,HeapAFL 最晚觸發(fā)崩潰,用時(shí)2 h,且崩潰數(shù)量“1”小于最高值“14”.據(jù)后續(xù)手工漏洞成因分析發(fā)現(xiàn),其他測(cè)試工具雖然測(cè)試出的崩潰數(shù)量多,但是,屬于觸發(fā)同一個(gè)程序漏洞的多個(gè)類似崩潰樣例,且與HeapAFL 一個(gè)崩潰樣例觸發(fā)的漏洞相同.整體而言,HeapAFL 在發(fā)現(xiàn)崩潰效率上有明顯的優(yōu)勢(shì).
Fig.6 Curves diagram of crashes number increasing with test time圖6 崩潰數(shù)量隨測(cè)試時(shí)間的增長(zhǎng)曲線圖
表5 中展示了HeapAFL 和AFL 發(fā)現(xiàn)相同堆內(nèi)存錯(cuò)誤類漏洞花費(fèi)的時(shí)間(此處僅展示HeapAFL 和AFL 都挖掘到的漏洞信息).從表5 中可以看出,HeapAFL 比AFL 能更快挖掘漏洞(即34.93 h<40.06 h).具體而言,HeapAFL 在挖掘接近70%(即11/16)的漏洞上能縮短漏洞發(fā)現(xiàn)時(shí)間;在剩余5 個(gè)漏洞的挖掘中,Bug_23869,CVE-2018-11416,mxml-issue-235 僅輕微增加測(cè)試時(shí)間6 min;在CVE-2021-33462 和CVE-2021-33455 漏洞上增加的時(shí)間稍長(zhǎng),其大于1 h.由于HeapAFL 僅優(yōu)化了AFL 工作流程框架中的種子優(yōu)選變異策略,因此從漏洞發(fā)現(xiàn)時(shí)間可以看出,HeapAFL能提高堆內(nèi)存錯(cuò)誤類漏洞的挖掘效率.
Table 5 Time of Heap-Based Vulnerabilities Found by HeapAFL and AFL表5 HeapAFL 和AFL 挖掘到的堆內(nèi)存錯(cuò)誤漏洞時(shí)間 h
綜上所述,HeapAFL 在崩潰發(fā)現(xiàn)速度和堆內(nèi)存錯(cuò)誤類漏洞發(fā)現(xiàn)速度上有明顯優(yōu)勢(shì),因此,優(yōu)先變異策略可以提升堆內(nèi)存錯(cuò)誤類漏洞挖掘效率.
漏洞挖掘數(shù)量是判斷模糊測(cè)試工具漏洞挖掘能力的重要指標(biāo),本節(jié)基于各個(gè)測(cè)試工具挖掘到的漏洞數(shù)量的并集、平均值和交集的對(duì)比來評(píng)估HeapAFL的漏洞挖掘能力.除此以外,本節(jié)計(jì)算了多次實(shí)驗(yàn)的Mann Whitney U-test 統(tǒng)計(jì)分析數(shù)值(即p-value),評(píng)估實(shí)驗(yàn)結(jié)果對(duì)比的顯著性.最后,由于Sanitizer 可以幫助查找和判斷堆內(nèi)存漏洞的發(fā)生,本節(jié)進(jìn)一步探索在模糊測(cè)試方法HeapAFL 中添加知名的Sanitizer 工具ASAN[16]對(duì)堆內(nèi)存漏洞挖掘效果的影響.
各個(gè)模糊測(cè)試工具的堆內(nèi)存錯(cuò)誤類漏洞數(shù)量如表6 所示,包括多次實(shí)驗(yàn)漏洞數(shù)量總和(U)和平均數(shù)量(Avg).從漏洞整體漏洞數(shù)量和單次平均漏洞數(shù)量來看,HeapAFL 優(yōu)于所有基準(zhǔn)的對(duì)比工具.雖然從漏洞數(shù)量平均值上的比較來看,HeapAFL(即16 個(gè))與第2 名AFLFast(即14.13 個(gè))和第3 名AFL(即13.13 個(gè))差距不算太大,但從整體實(shí)驗(yàn)漏洞并集來看HeapAFL明顯優(yōu)于AFL,AFLFast(即25/19=1.32 和25/18=1.39),且優(yōu)于接下來的TortoiseFuzz(即25/16=1.56)、PathAFL(即25/13=1.92)、Memlock(即25/12=2.08)和Angora(即25/9=2.78).除了漏洞數(shù)量,本文計(jì)算了8 次獨(dú)立重復(fù)實(shí)驗(yàn)中各次實(shí)驗(yàn)結(jié)果的Mann Whitney U-test 統(tǒng)計(jì)分析結(jié)果,如表6 中最后一行p-value 所示.其中pvalue 值小于0.01 表明實(shí)驗(yàn)結(jié)果顯著優(yōu)于其他工作,因此HeapAFL 實(shí)驗(yàn)結(jié)果顯著優(yōu)于6 個(gè)基準(zhǔn)對(duì)比工具.由此可見,HeapAFL 的堆內(nèi)存錯(cuò)誤類漏洞挖掘能力優(yōu)于其他相關(guān)工作.
Table 6 Number of Heap-Based Vulnerabilities Found by HeapAFL and Different Fuzzers表6 HeapAFL 與各個(gè)模糊測(cè)試方法發(fā)現(xiàn)的堆漏洞數(shù)量
圖7 是HeapAFL 與各個(gè)對(duì)比工具堆內(nèi)存錯(cuò)誤類漏洞比較的韋恩圖,展示了漏洞比較的詳細(xì)信息,包括方法對(duì)比中相同的漏洞數(shù)量和不同的漏洞數(shù)量及各個(gè)數(shù)量占比.從圖7 中可以看到,HeapAFL 雖然遺漏了少數(shù)漏洞但整體效果優(yōu)于基準(zhǔn)對(duì)比工作.
Fig.7 Comparison of the discovered heap-based vulnerabilities of HeapAFL and each fuzzer圖7 HeapAFL 與各基準(zhǔn)模糊測(cè)試工具挖掘堆內(nèi)存錯(cuò)誤類漏洞比較
表7 是HeapAFL 添加ASAN 之前和之后堆內(nèi)存錯(cuò)誤類漏洞數(shù)量和模糊測(cè)試中測(cè)試樣例的執(zhí)行速度.可以看出,HeapAFL 方法添加有代表性的Sanitizer 工具ASAN(即HeapAFL-ASAN)可以挖掘到21 個(gè)漏洞,略少于原始HeapAFL 工具挖掘到的25 個(gè)漏洞,但是多于原生AFL 工具挖掘到的19 個(gè)漏洞.進(jìn)一步研究發(fā)現(xiàn),HeapAFL-ASAN 的測(cè)試樣例執(zhí)行速度平均值為每秒226.72 個(gè),小于HeapAFL 的每秒489.24 個(gè), 也就是添加了ASAN 的測(cè)試工具相對(duì)降低了模糊測(cè)試速率,從而在一定程度上減少了樣例測(cè)試次數(shù).本文測(cè)試出的實(shí)驗(yàn)結(jié)果與文獻(xiàn)[17]中提到的添加ASAN 會(huì)降低執(zhí)行速度的結(jié)論相吻合.另外,對(duì)于mjs 和mxml 程序,HeapAFL-ASAN 的執(zhí)行速度接近于HeapAFL(即274.46 對(duì)比于261.50 和443.40 對(duì)比于475.74),而其漏洞挖掘?qū)嶒?yàn)效果優(yōu)于HeapAFL,可見在執(zhí)行的測(cè)試樣例總量接近的時(shí)候,HeapAFL-ASAN 漏洞挖掘能力優(yōu)于HeapAFL.因此,本文建議在時(shí)間、計(jì)算資源充足的漏洞挖掘場(chǎng)景中,可以在HeapAFL 中添加ASAN 以提高堆內(nèi)存錯(cuò)誤類漏洞挖掘能力.
Table 7 Comparison Experiment of HeapAFL and HeapAFL Combined with ASAN表7 HeapAFL 與HeapAFL 結(jié)合ASAN 的對(duì)比實(shí)驗(yàn)
本文提出了一種基于堆操作行為引導(dǎo)的灰盒模糊測(cè)試方法HeapAFL,通過堆操作行為的控制流和數(shù)據(jù)流敏感性,引導(dǎo)模糊測(cè)試工具探索多樣化的堆內(nèi)存操作狀態(tài)空間,從而增加堆內(nèi)存錯(cuò)誤類漏洞的觸發(fā)概率.本文在6 個(gè)真實(shí)程序組成的測(cè)試集上對(duì)比了6 個(gè)相關(guān)模糊測(cè)試工作,實(shí)驗(yàn)結(jié)果表明,HeapAFL在崩潰發(fā)現(xiàn)效率和漏洞挖掘數(shù)量上均優(yōu)于基準(zhǔn)測(cè)試工作.目前HeapAFL 發(fā)現(xiàn)了6 個(gè)堆內(nèi)存錯(cuò)誤類漏洞,并獲得了2 個(gè)新的CVE 編號(hào).
作者貢獻(xiàn)聲明:余媛萍提出算法思路和實(shí)驗(yàn)方案,完成實(shí)驗(yàn)并撰寫論文;蘇璞睿提出指導(dǎo)意見并修改論文.