摘 要:當(dāng)前定向模糊測試技術(shù)的平均距離模型在多目標(biāo)測試中缺乏對逐個目標(biāo)的指向性,在導(dǎo)向同一目標(biāo)時路徑多樣化不強(qiáng),且未根據(jù)不同目標(biāo)的覆蓋程度動態(tài)調(diào)整距離度量,導(dǎo)致多目標(biāo)測試不均衡和效率降低,難以在結(jié)合靜態(tài)分析告警等多目標(biāo)環(huán)境中開展漏洞挖掘。針對以上問題,提出了一種多目標(biāo)定向探索的模糊測試技術(shù)MTDFuzz,識別待遍歷多目標(biāo)的支配節(jié)點(diǎn),利用基于多目標(biāo)支配分析的測試用例優(yōu)選,通過支配節(jié)點(diǎn)覆蓋評分激勵機(jī)制引導(dǎo)生成能夠覆蓋支配節(jié)點(diǎn)和目標(biāo)的測試用例,實(shí)現(xiàn)在限定關(guān)鍵覆蓋要素的前提下,對目標(biāo)路徑的多樣化和指向性探索;根據(jù)目標(biāo)的覆蓋狀態(tài)進(jìn)行路徑動態(tài)修剪優(yōu)化,已被充分測試的路徑和目標(biāo)不參與距離信息反饋,通過剪枝和全局支配節(jié)點(diǎn)修正動態(tài)調(diào)整支配節(jié)點(diǎn)和目標(biāo)基本塊評分,利用支配節(jié)點(diǎn)覆蓋度優(yōu)化種子調(diào)度策略,實(shí)現(xiàn)對多目標(biāo)測試資源的有效分配。實(shí)驗(yàn)結(jié)果表明:與常用的定向模糊測試工具對比,多目標(biāo)下MTDFuzz的平均漏洞發(fā)現(xiàn)時間縮短了57.6%,且在Glibc、FFmpeg等4個開源程序中發(fā)現(xiàn)了12個未公開漏洞,顯著提高了定向模糊測試的多目標(biāo)探索能力和漏洞挖掘效率。
關(guān)鍵詞:定向模糊測試; 漏洞挖掘; 多目標(biāo)導(dǎo)向; 程序分析
中圖分類號:TP311 文獻(xiàn)標(biāo)志碼:A
文章編號:1001-3695(2024)11-037-3455-09
doi: 10.19734/j.issn.1001-3695.2024.01.0060
Directional fuzzing based on multi-objective domination analysis andpath dynamic pruning optimization
Li Zeyuan, Yin Zhongxu?, Zong Guoxiao, Sang Haiya
(School of Cyberspace Security, Information Engineering University, Zhengzhou 450001, China)
Abstract:Current directed fuzzing techniques suffer from a lack of specificity towards individual targets in multi-target testing, limited path diversity when aiming at the same target, and a failure to dynamically adjust distance metrics based on the coverage level of different targets, leading to imbalanced testing and reduced efficiency in environments that integrate static analysis alerts for vulnerability mining. To address these issues, this paper introduced MTDFuzz, a multi-target directed exploration fuzzing technique that identified dominating nodes for targeted traversal. By leveraging test case optimization through multi-objective dominance analysis and a coverage score incentive mechanism, MTDFuzz generated test cases that covered both dominating nodes and targets, enabling diversified and directed exploration of target paths within the constraints of key coverage elements. The technique dynamically pruned paths based on target coverage, excluding thoroughly tested paths and targets from distance metric feedback. Through pruning and global dominating node adjustment, it dynamically tuned the scores of dominating nodes and target basic blocks, optimizing seed scheduling strategies based on dominating node coverage to efficiently allocate multi-target testing resources. Experimental results demonstrate that MTDFuzz significantly reduces the average time to discover vulnerabilities by 57.6% compared to commonly used directed fuzzing tools, and has uncovered 12 0-day vulnerabilities in four open-source programs, including Glibc and FFmpeg, significantly enhancing the multi-target exploration capability and vulnerability mining efficiency of directed fuzzing.
Key words:directed fuzzing; vulnerability mining; multi-objective orientation; program analysis
0 引言
模糊測試[1~3]作為一種自動化軟件測試技術(shù),已經(jīng)成為現(xiàn)代大規(guī)模軟件和系統(tǒng)中探索安全漏洞最有效的方法之一。定向模糊測試基于覆蓋率引導(dǎo)的灰盒模糊測試技術(shù)通過加入額外的目標(biāo)或約束來引導(dǎo)測試的執(zhí)行方向,以生成更為高效和具針對性的測試用例。AFLGo[4]揭開了現(xiàn)代化定向模糊測試的序幕,通過預(yù)先標(biāo)記代碼目標(biāo)并預(yù)置控制流距離,對距離目標(biāo)較近的種子賦予更多的能量,進(jìn)而引導(dǎo)種子快速抵達(dá)目標(biāo)并觸發(fā)漏洞。之后,定向模糊測試的研究延伸至與靜態(tài)分析、符號執(zhí)行等技術(shù)的結(jié)合,以生成能達(dá)到更復(fù)雜程序結(jié)構(gòu)(如覆蓋特定分支或語句)的測試用例。這些早期工作證明,定向模糊測試可以顯著提高漏洞挖掘以及復(fù)現(xiàn)的效率和準(zhǔn)確性,并廣泛應(yīng)用于補(bǔ)丁的有效性檢測、漏洞復(fù)現(xiàn)、crash可利用性評估、驗(yàn)證靜態(tài)分析的結(jié)果從而消除誤報,以及一些獨(dú)特類型的漏洞挖掘等領(lǐng)域。盡管定向模糊測試技術(shù)不斷發(fā)展并取得了顯著進(jìn)步,但現(xiàn)有技術(shù)主要側(cè)重于對單一或少量測試目標(biāo)的針對性測試,在同時針對較多的目標(biāo)進(jìn)行測試時往往存在目標(biāo)偏好的情況,缺乏均衡性,且難以將定向模糊測試的高效率和指向性直接用于未知漏洞挖掘。為滿足軟件漏洞挖掘的實(shí)際需求,需要一種能夠均衡導(dǎo)向至多個測試目標(biāo)的模糊測試技術(shù)。
本文的主要貢獻(xiàn)如下:
a)提出一種基于多目標(biāo)支配分析的測試用例優(yōu)選方法,對執(zhí)行到目標(biāo)起著決定性作用的支配節(jié)點(diǎn)進(jìn)行錨定,根據(jù)基于支配節(jié)點(diǎn)覆蓋度的種子調(diào)度策略,通過支配節(jié)點(diǎn)覆蓋評分激勵引導(dǎo)生成覆蓋支配節(jié)點(diǎn)和目標(biāo)位置的種子,實(shí)現(xiàn)在限定關(guān)鍵覆蓋要素的前提下,對目標(biāo)路徑進(jìn)行多樣化和指向性探索。
b)提出一種基于目標(biāo)覆蓋狀態(tài)的路徑修剪方法,能夠支撐隨測試過程和目標(biāo)覆蓋情況,不采用已充分測試的目標(biāo)路徑參與測試用例評分計算,對支配節(jié)點(diǎn)和目標(biāo)基本塊的評分進(jìn)行動態(tài)調(diào)整,該方法對逐個目標(biāo)的針對性更強(qiáng),實(shí)現(xiàn)了對多目標(biāo)的高效探索和漏洞發(fā)現(xiàn)。
c)基于以上方法實(shí)現(xiàn)了多目標(biāo)定向模糊測試原型系統(tǒng)MTDFuzz,與AFL++、AFLGo、LeoFuzz、SieveFuzz等模糊測試工具進(jìn)行相關(guān)對比實(shí)驗(yàn)并發(fā)現(xiàn)了12個未公開漏洞,證明本文工作的有效性與實(shí)用性。
1 背景
1.1 定向模糊測試
如圖1所示,現(xiàn)有的主流定向模糊測試方法在靜態(tài)分析階段使用程序分析方法,提取程序中與目標(biāo)相關(guān)的導(dǎo)向信息(如到目標(biāo)位置的距離、與目標(biāo)相關(guān)的代碼以及執(zhí)行路徑上的約束信息等),并將導(dǎo)向信息插樁到程序中,用于后續(xù)動態(tài)過程的針對性引導(dǎo)。在動態(tài)分析時,首先進(jìn)入探索(exploration)階段,即利用代碼覆蓋率信息提升語料庫的覆蓋率,避免陷入局部最優(yōu),隨后進(jìn)入利用(exploitation)階段,此時利用靜態(tài)分析得到的導(dǎo)向性信息,對種子的變異、調(diào)度,以及種子隊(duì)列進(jìn)行調(diào)整,實(shí)現(xiàn)導(dǎo)向性測試。
現(xiàn)有的定向模糊測試方法主要分為三類:a)最小距離算法引導(dǎo)的定向模糊測試,如AFLGo、Hawkeye[5],這些方法通過感知種子與目標(biāo)的距離,為“更接近”的種子提供更多調(diào)度和變異機(jī)會;b)修剪輸入空間或修剪代碼空間,例如Beacon[6]前置路徑約束以提前截斷不可達(dá)路徑,F(xiàn)uzzGuard[7]使用深度學(xué)習(xí)模型來過濾無效測試用例,而SieveFuzz[8]引入一種跳閘機(jī)制,將模糊測試的搜索空間限制在只與達(dá)到指定目標(biāo)位置相關(guān)的范圍內(nèi),WindRanger[9]通過識別偏移基本塊以避免測試與目標(biāo)無關(guān)的代碼區(qū)域;c)前置分析結(jié)果指導(dǎo)的綜合性優(yōu)化,如AFLChurn[10]運(yùn)用蟻群算法優(yōu)化目標(biāo)相關(guān)的字節(jié)級變異,提高覆蓋最近更新或頻繁修改的代碼區(qū)域的種子能量,這類區(qū)域存在“回歸”漏洞的概率較高,SAVIOR[11]、FISHFUZZ[12]和ParmeSan[13]通過Sanitizer標(biāo)記大量潛在漏洞監(jiān)測點(diǎn)后,設(shè)計不同的平均值距離算法來指導(dǎo)模糊測試優(yōu)先探索這些監(jiān)測點(diǎn),但是未設(shè)計特定的多目標(biāo)定向探索策略,仍然依賴于AFL的“遺傳進(jìn)化”的思想,給隨機(jī)變異生成最終覆蓋目標(biāo)位置的種子賦予更多的能量,未考慮目標(biāo)之間的關(guān)系以及測試是否充分。
1.2 問題描述
雖然上述定向模糊測試方法在針對特定目標(biāo)的測試上取得了一些進(jìn)展,但仍然存在以下兩個方面的問題:
問題a):現(xiàn)有方法針對多個目標(biāo)采用平均距離描述路徑的接近程度,適合于同一目標(biāo)多個路徑點(diǎn)位的場景設(shè)定,但是對不同分支差異較大的多個目標(biāo)難以準(zhǔn)確評判,造成測試對多目標(biāo)的覆蓋性較差。
現(xiàn)有的定向距離模型計算目標(biāo)距離時[4,5,9,14],過度關(guān)注執(zhí)行路徑上距離最小的測試用例,導(dǎo)致最短路徑優(yōu)先,不利于測試路徑的多樣性。在多目標(biāo)環(huán)境下,當(dāng)前種子距離計算算法過度關(guān)注與目標(biāo)位置最近的執(zhí)行路徑,對路徑多樣性缺乏適應(yīng)性,缺少對能到達(dá)相同目標(biāo)的其他路徑的關(guān)注。漏洞挖掘需要滿足完整的路徑約束以及合適的數(shù)據(jù)流和控制流關(guān)系,最短路徑并不一定是漏洞觸發(fā)路徑,給予距離最近的種子較高權(quán)重可能會導(dǎo)致實(shí)際能觸發(fā)漏洞的測試用例得不到足夠調(diào)度,甚至出現(xiàn)定向模糊測試(DGF)偏好無法覆蓋任何目標(biāo)位置的種子的情況,以下舉例說明。
以圖2中的過程間控制流圖為例,按照AFLGo的距離算法計算w、x、y、z四個種子的距離并排序:四個種子的執(zhí)行軌跡分別是Trace(w)=A→B→C→D,Trace(x)=A→F→G→H→I→J,Trace(y)=A→F→L→M→N→O→P→Q→R→T,Trace(z)=A→F→L→M→R→S。
在多目標(biāo)環(huán)境下,基本塊的距離計算采用了調(diào)和平均值,比如基本塊A的距離Dist(A)=3/(1/5+1/3+1/5)=45/11=4.1,基本塊F的距離為Dist(F)=2/(1/4+1/4)=4?;诨緣K距離計算四個種子的距離:Dist(w)=(45/11+2+1)/3≈2.36,Dist(x)=(45/11+4+3+2+1)/5≈2.82,Dist(y)=(45/11+4+3+2+5+4+3+2+1)/9≈3.12,Dist(z)=(45/11+4+3+2+1)/5≈2.82。
根據(jù)定向模糊測試的期望特性[5],能覆蓋目標(biāo)或者“距離”目標(biāo)近的種子應(yīng)獲得更高的能量和優(yōu)先級。在這四個種子中,種子z沒有到達(dá)任何目標(biāo),理論上,max{Dist(w),Dist(x),Dist(y)}應(yīng)小于Dist(z),然而Dist(z)=Dist(x)lt;Dist(y),表明未覆蓋任何目標(biāo)的種子z比覆蓋了目標(biāo)T的種子獲得了更多能量和更高優(yōu)先級。
問題b):沒有動態(tài)統(tǒng)籌考慮多個目標(biāo)的測試情況,依賴靜態(tài)距離的方式,隨著已經(jīng)遍歷過的目標(biāo)逐漸增多,未隨著目標(biāo)的遍歷情況動態(tài)調(diào)整,向未覆蓋目標(biāo)傾斜測試資源。
在對測試資源進(jìn)行分配時,關(guān)鍵在于如何高效地利用有限的資源來達(dá)成對多目標(biāo)的充分測試。在程序探索過程中,某些目標(biāo)可能比其他目標(biāo)更易于達(dá)到,頻繁測試的區(qū)域可能已經(jīng)得到了充分檢驗(yàn),其代碼更安全健壯,存在漏洞的可能性較低。傳統(tǒng)的定向模糊測試器對程序中的多個目標(biāo)位置通過靜態(tài)距離賦予固定的優(yōu)先級,未動態(tài)考慮目標(biāo)的遍歷情況,難覆蓋的目標(biāo)代碼區(qū)域在全局視角中處于劣勢,容易被忽略,從而出現(xiàn)調(diào)度“饑餓”的情況。
上述問題使得難以在多目標(biāo)環(huán)境中應(yīng)用定向模糊測試進(jìn)行漏洞挖掘,因此為了更有效地利用測試資源,達(dá)到更好的多目標(biāo)測試效果,需要一種能夠根據(jù)目標(biāo)遍歷情況的變化,動態(tài)調(diào)整測試資源分配并探索多樣化路徑的方法。
2 方法設(shè)計
2.1 解決思路與方法概述
解決問題a)的關(guān)鍵在于如何全局分析不同目標(biāo)的分布,并根據(jù)測試過程及多目標(biāo)的覆蓋情況,對不同目標(biāo)進(jìn)行差異化的度量和逼近測試。本文基于支配樹[15]概念,提出基于多目標(biāo)支配分析的測試用例優(yōu)選方法,旨在優(yōu)化定向模糊測試的距離度量[4,5,9,14],并對所有預(yù)設(shè)定目標(biāo)進(jìn)行全局化分析追蹤。本文對測試目標(biāo)構(gòu)建路徑支配樹,識別并錨定對執(zhí)行到多目標(biāo)起著決定性作用的支配節(jié)點(diǎn),并將這些支配節(jié)點(diǎn)作為多目標(biāo)路徑探索的“驛站”。綜合考慮所有可能到達(dá)目標(biāo)位置的路徑,在路徑對目標(biāo)的執(zhí)行接近程度評定上,將支配節(jié)點(diǎn)用于距離逼近程度評估,以解決由最小距離算法引導(dǎo)的定向模糊測試在多目標(biāo)環(huán)境中遇到的測試路徑單一性和目標(biāo)指向性問題。
針對問題b),需要隨著測試的進(jìn)行,對每個目標(biāo)的關(guān)注度進(jìn)行動態(tài)調(diào)整,在測試用例優(yōu)選過程中剔除已被充分測試的目標(biāo)。本文提出基于目標(biāo)覆蓋狀態(tài)的路徑動態(tài)修剪優(yōu)化策略,計算支配節(jié)點(diǎn)的途徑情況來深入分析潛在目標(biāo)的覆蓋狀態(tài),通過剪枝和全局支配節(jié)點(diǎn)修正,實(shí)現(xiàn)計算資源的有效分配和對目標(biāo)集合的均衡測試。
基于上述思路,本文提出基于多目標(biāo)支配分析和路徑動態(tài)修剪優(yōu)化的定向模糊測試技術(shù)并構(gòu)建原型系統(tǒng)MTDFuzz。該系統(tǒng)可以接受程序中的多個目標(biāo)位置作為輸入,圖3描述了MTDFuzz多目標(biāo)模糊測試技術(shù)的整體工作流程,主要分為靜態(tài)分析和多目標(biāo)定向模糊測試兩個階段,具體的優(yōu)化方法包括以下四個方面(圖中灰色部分標(biāo)示):a)靜態(tài)分析,首先接受測試程序和多個目標(biāo)位置作為輸入,給定一個種子語料庫,運(yùn)行程序間靜態(tài)分析以識別能到達(dá)目標(biāo)位置的相關(guān)基本塊,回溯標(biāo)記必經(jīng)的支配節(jié)點(diǎn),并基于這些支配節(jié)點(diǎn)計算基本塊的初始評分,插樁基本塊評分信息編譯得到待測試的二進(jìn)制程序;b)基于多目標(biāo)支配分析的測試用例優(yōu)選,記錄測試用例執(zhí)行過程中經(jīng)過的支配和目標(biāo)節(jié)點(diǎn),并將這些支配節(jié)點(diǎn)和目標(biāo)節(jié)點(diǎn)的評分累加得到測試用例優(yōu)選評分;c)基于目標(biāo)覆蓋狀態(tài)的路徑動態(tài)修剪優(yōu)化,隨著模糊測試的進(jìn)行,多目標(biāo)的覆蓋情況發(fā)生變化,采取運(yùn)行時分析重新評估支配節(jié)點(diǎn)和目標(biāo)的覆蓋狀態(tài)信息,動態(tài)修剪已充分測試的路徑和目標(biāo),動態(tài)調(diào)整支配節(jié)點(diǎn)評分;d)基于支配節(jié)點(diǎn)覆蓋度的種子調(diào)度策略,結(jié)合支配節(jié)點(diǎn)覆蓋度指導(dǎo)種子的選擇、能量分配以及變異階段,加速優(yōu)選測試用例的生成和進(jìn)化,通過支配節(jié)點(diǎn)的覆蓋激勵,擴(kuò)大對多目標(biāo)的探索面,實(shí)現(xiàn)具備路徑多樣性的多目標(biāo)測試。
2.2 基于多目標(biāo)支配分析的測試用例優(yōu)選
本文提出了一種新的多目標(biāo)種子評分機(jī)制,先靜態(tài)計算支配節(jié)點(diǎn)到各個目標(biāo)之間的距離,并保留最小值以及其對應(yīng)的目標(biāo)。
2.2.1 支配節(jié)點(diǎn)(DomPoint)識別
定向模糊測試的測試空間不是整體程序,因此基于全程序空間的覆蓋率搜索的方法不再適用。將覆蓋增益與目標(biāo)位置及其執(zhí)行路徑不相關(guān)的種子加入隊(duì)列中,并不能提升DGF的效果。因此,本文提出尋找種子執(zhí)行路徑上的指引性節(jié)點(diǎn),即支配節(jié)點(diǎn)來引導(dǎo)測試。只有先到達(dá)支配樹DT上的支配節(jié)點(diǎn),才能覆蓋后續(xù)的目標(biāo)并獲取有效的反饋。
支配節(jié)點(diǎn)是本文的一個關(guān)鍵概念,如果樹中的每個節(jié)點(diǎn)只支配自己及其后代,則稱之為支配樹(DT)。當(dāng)且僅當(dāng)經(jīng)過n的路徑必須先經(jīng)過d時,節(jié)點(diǎn)d支配節(jié)點(diǎn)n,記作d dom n,根據(jù)定義,每個節(jié)點(diǎn)都支配自身。為了識別種子執(zhí)行路徑上的支配節(jié)點(diǎn),MTDFuzz在動態(tài)測試前進(jìn)行靜態(tài)分析以識別程序中潛在的支配節(jié)點(diǎn)。在模糊測試期間,通過分析已執(zhí)行的基本塊與潛在支配節(jié)點(diǎn)之間的關(guān)系確定執(zhí)行路徑中的支配節(jié)點(diǎn)。以下是本文對支配節(jié)點(diǎn)的定義:
定義1 給定一個待測試的程序p和程序中的一個目標(biāo)t,p的程序過程間控制流圖iCFG=(V,E),其中V代表基本塊集合,E代表邊的集合,T是待測試的多目標(biāo)集合,b是程序中的基本塊,Target_DP(t)則表示目標(biāo)t的支配節(jié)點(diǎn)集合:
Target_DP(t)={b∈V(p)|(b dom t ∩|iCFG_out(b)|gt;1)}
目標(biāo)完全支配節(jié)點(diǎn)集合為
Target_DP′(t)=Target_DP(t)∪t
定義1可以解釋為:在基于程序間控制流圖iCFG構(gòu)建的支配樹DT上,目標(biāo)節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)一定能到達(dá)后續(xù)的目標(biāo)節(jié)點(diǎn),但是全程序基本塊集合過大,標(biāo)記所有執(zhí)行路徑上與目標(biāo)位置相關(guān)的父節(jié)點(diǎn)會嚴(yán)重增加運(yùn)行時開銷。因此,本文僅保留iCFG中出度大于1的節(jié)點(diǎn),從而得到支配節(jié)點(diǎn)集合All_DP(p):
All_DP(p)={b∈V(p)|(?t∈T,b dom t ∩ iCFG_out(b)|gt;1)}
All_DP′(p)=All_DP(p)∪T
程序全局支配節(jié)點(diǎn)與目標(biāo)節(jié)點(diǎn)一起構(gòu)成程序p的完全支配節(jié)點(diǎn)集合All_DP′(p)。
在實(shí)際計算中,首先構(gòu)建目標(biāo)程序的過程間控制流圖iCFG,然后基于iCFG計算每個基本塊到目標(biāo)位置的可達(dá)性,如果在iCFG上存在從基本塊到目標(biāo)位置的路徑,則認(rèn)為基本塊可以到達(dá)目標(biāo)位置[9]。動態(tài)執(zhí)行過程中的支配節(jié)點(diǎn)引導(dǎo)種子逼近目標(biāo)位置,只有覆蓋了目標(biāo)路徑上的支配節(jié)點(diǎn),滿足到達(dá)目標(biāo)位置的前置條件,才能順利覆蓋后續(xù)的目標(biāo)節(jié)點(diǎn)。
定義2 種子s執(zhí)行軌跡中支配節(jié)點(diǎn)Seed_DP(s)表示:
Seed_DP(s)={b∈(ξ(s) ∩ All_DP′(p)}
其中:ξ(s)是種子s執(zhí)行軌跡中所有的基本塊。
以圖4為例,圖4(a)是程序過程間控制流圖iCFG,程序中包含4個目標(biāo)位置,T={R,H,L,Q},iCFG經(jīng)Lengauer-Tarjan算法[16]構(gòu)建支配樹DomiCFG,其中Target_DP(R)={A,C},Target_DP(H)={A,C,D},Target_DP(L)={A,J,K},Target_DP(Q)={A,J,P},因此,示例中的程序全局支配節(jié)點(diǎn)All_DP(p)和完全支配節(jié)點(diǎn)集合All_DP′(p)為:All_DP(p)={A,C,D,J,K,P},All_DP′(p)={A,C,D,H,J,K,L,R,P,Q}。
為了使測試用例能夠到達(dá)目標(biāo)位置甚至觸發(fā)漏洞,需要滿足特定的路徑特征。支配節(jié)點(diǎn)在控制流中起著推動DGF逼近目標(biāo)位置的尋路作用,支配節(jié)點(diǎn)之間以及支配節(jié)點(diǎn)與目標(biāo)之間均可能存在多條路徑,逐步覆蓋程序中的支配節(jié)點(diǎn)而不是只關(guān)注最短路徑,可以得到更加豐富的測試路徑,有利于漏洞的觸發(fā)。測試過程中覆蓋一個基本塊的直接后繼并不增加到達(dá)目標(biāo)的可能性,因?yàn)榛緣K和其唯一后繼基本塊到達(dá)目標(biāo)的概率是相同的[17]。因此,識別控制流中的支配節(jié)點(diǎn)變得至關(guān)重要,這些節(jié)點(diǎn)與目標(biāo)位置存在支配關(guān)系,為目標(biāo)的逼近過程提供了有效的控制流關(guān)系指引。
2.2.2 測試用例優(yōu)選評分
本節(jié)利用2.2.1節(jié)中識別的支配節(jié)點(diǎn)來計算基本塊和種子的評分。對于每一個目標(biāo)t,有一系列支配節(jié)點(diǎn)b在支配樹DT上,b∈Target_DP(t),利用執(zhí)行路徑上的支配節(jié)點(diǎn)到所有目標(biāo)基本塊的多目標(biāo)距離dist(b,t)來計算基本塊評分Wb,T:
dist(b,T)=mint∈T{Dijkstra(b,t)}(1)
Wb,T=1dist(b,T)+C(2)
式(1)表示在程序間控制流圖iCFG中,支配節(jié)點(diǎn)b到目標(biāo)位置t的距離,當(dāng)b是目標(biāo)本身時,距離為0,當(dāng)b不可達(dá)t時,距離為∞,不參與計算。部分支配節(jié)點(diǎn)可以達(dá)到多個目標(biāo)基本塊,這些支配節(jié)點(diǎn)在初始評分階段只存儲到最近目標(biāo)的距離。式(2)中常數(shù)C是一個正值,用于控制距離dist(b,T)對基本塊評分的影響程度,目標(biāo)基本塊的評分為1/C,因此權(quán)重最高,距離目標(biāo)越遠(yuǎn)的支配節(jié)點(diǎn)權(quán)重越低。
本文給予以下種子更高的優(yōu)選評分:a)種子執(zhí)行路徑經(jīng)過了更多的支配節(jié)點(diǎn);b)種子的執(zhí)行路徑更加接近目標(biāo)位置。種子的優(yōu)選評分通過累加基本塊評分來計算,記錄種子執(zhí)行過程中經(jīng)過的支配節(jié)點(diǎn)和目標(biāo)節(jié)點(diǎn),并將這些支配節(jié)點(diǎn)和目標(biāo)節(jié)點(diǎn)的評分相加。種子s的優(yōu)選評分定義為執(zhí)行過程中經(jīng)過的支配節(jié)點(diǎn)以及目標(biāo)的分?jǐn)?shù)之和:
Score(s)=∑b∈Seed_DP(s)Wb,T(3)
優(yōu)選評分Score(s)增加意味著種子執(zhí)行軌跡中包含更多的支配節(jié)點(diǎn)或?qū)崿F(xiàn)了更高的目標(biāo)節(jié)點(diǎn)覆蓋率,因此該種子應(yīng)獲得更多的測試資源和變異機(jī)會,并在調(diào)度中賦予更高的優(yōu)先級。
2.3 基于目標(biāo)覆蓋狀態(tài)的路徑動態(tài)修剪優(yōu)化
為了解決定向模糊測試在目標(biāo)選擇上的偏向性問題,本文提出一種動態(tài)的目標(biāo)選擇方法,記錄多目標(biāo)的覆蓋狀態(tài),修剪已經(jīng)充分測試的目標(biāo)和路徑,平等地測試所有目標(biāo)。
當(dāng)對應(yīng)目標(biāo)執(zhí)行次數(shù)達(dá)到閾值被充分測試時,將該目標(biāo)從目標(biāo)探索集合中剔除。若支配節(jié)點(diǎn)還有其他目標(biāo)探索后繼,則支配節(jié)點(diǎn)的距離更新為支配節(jié)點(diǎn)到當(dāng)前最近目標(biāo)節(jié)點(diǎn)的距離;若當(dāng)前支配節(jié)點(diǎn)無目標(biāo)后繼,則將支配節(jié)點(diǎn)標(biāo)記清除,轉(zhuǎn)向其他代碼區(qū)域的探索。記錄支配節(jié)點(diǎn)的覆蓋情況和執(zhí)行次數(shù),將支配節(jié)點(diǎn)和目標(biāo)節(jié)點(diǎn)與三元組(hit_frequency, dominated_targets, is_reserve)相關(guān)聯(lián),hit_frequency代表支配節(jié)點(diǎn)被執(zhí)行的次數(shù),dominated_targets代表支配節(jié)點(diǎn)的后繼節(jié)點(diǎn)中是否包含目標(biāo)節(jié)點(diǎn),is_reserve表示該支配節(jié)點(diǎn)及后續(xù)節(jié)點(diǎn)是否被保留。當(dāng)hit_frequency超過f次時,表示該支配節(jié)點(diǎn)已被充分測試,生成了足夠能執(zhí)行該支配節(jié)點(diǎn)的種子。當(dāng)hit_frequency gt; f且dominated_targets=0時,is_reserve置0,表示此節(jié)點(diǎn)及后續(xù)分支需要被剔除,從iCFG中剔除該支配節(jié)點(diǎn)的評分及其后繼節(jié)點(diǎn)的評分不影響對于其他目標(biāo)的測試,可以從支配節(jié)點(diǎn)集合All_DP(p)中刪除,不參與距離計算及評分信息反饋。
在初始階段會給支配節(jié)點(diǎn)插樁距離信息,基于上一節(jié)的基本塊和測試用例優(yōu)選評分機(jī)制,計算基本塊評分,優(yōu)選評分較高的目標(biāo),待目標(biāo)被充分測試后,啟用修剪算法,向上遞歸更新支配節(jié)點(diǎn)中存儲的距離,實(shí)現(xiàn)基于動態(tài)的多目標(biāo)種子優(yōu)選評分?;谀繕?biāo)覆蓋狀態(tài)的路徑修剪算法1如下。
算法1 基于目標(biāo)覆蓋狀態(tài)的路徑動態(tài)修剪算法
輸入:過程間控制流圖iCFG;目標(biāo)節(jié)點(diǎn)集合T;完全支配節(jié)點(diǎn)集合All_DP′(p);全局基本塊評分W;全局支配節(jié)點(diǎn)三元組信息(hit_frequency, dominated_targets, is_reserve)。
輸出:更新后的完全支配節(jié)點(diǎn)集合All_DP′(p)以及基本塊評分W。
1 function domPointCull(t)" // 支配節(jié)點(diǎn)修剪
2 for v in All_DP(p) do
3
if v dom t then
4 v. dominated_targets-= 1
5
end if
6
if v. dominated_targets == 0 then
7 All_DP′(p).cull(v)
8 /* 在iCFG上修剪已被充分測試的支配節(jié)點(diǎn) */
9 v.is_reserve=0
10
end if
11
for n in v.predecessor do
12 W= updateScore(dist(n,T))
13
end for
14 end for
15 return W,All_DP′(p)
16 end function
17 function traceCull(t) // 基于支配節(jié)點(diǎn)的路徑修剪
18 for v in All_DP′(p) do
19 if t.hit_frequency gt; f and t.dominated_targets = 0 do
20
T = T.delete(t)
21
domPointCull(t)
22 end if
23 end for
24 return W , All_DP′(p)
25 end function
本文用目標(biāo)狀態(tài)覆蓋表示在運(yùn)行時檢測的支配節(jié)點(diǎn)和目標(biāo)的覆蓋情況,已被充分測試的目標(biāo)節(jié)點(diǎn)被修剪剔除,不參與測試用例優(yōu)選評分的計算。若其對應(yīng)的支配節(jié)點(diǎn)無后繼的目標(biāo)節(jié)點(diǎn),也進(jìn)行剔除。因此再次覆蓋已充分測試的支配節(jié)點(diǎn)的種子無法獲取較高的種子優(yōu)選評分。
圖5為修剪示例,初始控制流圖中,目標(biāo)集合T={R,H,L,Q},其支配節(jié)點(diǎn)集合All_DP(p)={A,C,D,J,K,P},完全支配節(jié)點(diǎn)集合All_DP′(p)={A,C,D,H,J,K,L,R,P,Q},當(dāng)部分目標(biāo)T′={R,H,L}被充分測試后,其is_reserve標(biāo)志置0,從目標(biāo)集合中剔除,K節(jié)點(diǎn)被修剪后,其All_DP(p)節(jié)點(diǎn)中的父節(jié)點(diǎn)J更新距離為到Q的距離,即距離更新為4,同樣A點(diǎn)距離更新為6。
2.4 基于支配節(jié)點(diǎn)覆蓋度的種子調(diào)度策略
本文在程序中識別并錨定多個支配節(jié)點(diǎn),測試覆蓋新的支配節(jié)點(diǎn)或目標(biāo)后獲得測試用例優(yōu)選評分激勵,并賦予更高的優(yōu)先級和能量,而覆蓋與目標(biāo)以及相關(guān)路徑無關(guān)的代碼時無法獲取激勵。本方法的種子池是一個循環(huán)隊(duì)列,依據(jù)順序選擇種子,當(dāng)種子池中加入新的測試用例時,根據(jù)式(3)計算的測試用例優(yōu)選評分Score(s)對種子進(jìn)行排序,隊(duì)列中靠前的種子由于覆蓋了較多的支配節(jié)點(diǎn)以及具備較深的執(zhí)行路徑深度,這些種子得到較早的調(diào)度可以加快測試的多目標(biāo)探索。
定義3 支配節(jié)點(diǎn)覆蓋度Q表示程序中完全支配節(jié)點(diǎn)的覆蓋情況:
Q=NhitNall(4)
其中:Nhit是累計被命中過的程序完全支配節(jié)點(diǎn)數(shù)量;Nall是所有程序完全支配節(jié)點(diǎn)All_DP′(p)的數(shù)量;Q的值越大代表程序由支配節(jié)點(diǎn)引導(dǎo)的多目標(biāo)測試探索情況越好。
算法2 動態(tài)種子能量調(diào)度算法
輸入:已插樁完全支配節(jié)點(diǎn)信息的程序P′;初始種子池C;需要被賦予能量的種子s。
輸出:種子s的能量E^(s)。
1 Score(s)=Execute(P′,s)
2 S^(s)=Normalize(Score(s),C)
3 /*Texp是模擬退火中的溫度*/
4 E(s)=Q*S^(s)*(1-Texp )+0.5*Texp
5 E^(s)=Eafl(s)*210*E(s)-5
MTDFuzz的目的是通過支配節(jié)點(diǎn)的覆蓋逐步引導(dǎo)到程序中離散分布的多個目標(biāo)節(jié)點(diǎn),因此需要選擇能夠覆蓋完全支配節(jié)點(diǎn)的種子并賦予更高的優(yōu)先級。算法2介紹了基于支配節(jié)點(diǎn)覆蓋度的種子能量策略,給定一個輸入s,以及包含完全支配節(jié)點(diǎn)信息的程序P′,根據(jù)式(3)種子優(yōu)選評分的定義計算種子優(yōu)選評分Score(s),為種子優(yōu)選評分Score(s)越大的種子賦予越高的優(yōu)先級。本文基于模擬退火算法來選擇種子,定義標(biāo)準(zhǔn)化種子優(yōu)選評分:
S^(s)=Score(s)-ScoreminScore(s)max-Scoremin(5)
其中:Score(s)min和Score(s)max表示種子池中種子優(yōu)選評分的最小值和最大值;標(biāo)準(zhǔn)化種子評分S^(s)可以在搜索支配節(jié)點(diǎn)和目標(biāo)時起到對開發(fā)和利用階段的平衡,S^(s)∈[0,1]。
基于標(biāo)準(zhǔn)化種子優(yōu)選評分,本文設(shè)計了能量調(diào)節(jié)函數(shù)(算法2第4行)來解決探索和利用問題,其中Texp是模擬退火的溫度函數(shù),使用Q*S^(s)表示種子的測試演化進(jìn)度,需要Q和S^(s)共同作用以參與種子能量分配的調(diào)節(jié)。測試的初始階段是探索階段,以覆蓋率探索為主,目的是充分搜索程序中的支配節(jié)點(diǎn),并獲取初期的種子評分。隨著種子s被選擇的次數(shù)增加,能量調(diào)節(jié)函數(shù)E(s)開始降溫,并逼近于Q*S^(s),此時切換為開發(fā)階段,著重生成能覆蓋更多支配節(jié)點(diǎn)或能覆蓋目標(biāo)位置的種子,實(shí)現(xiàn)基于支配節(jié)點(diǎn)覆蓋引導(dǎo)的測試聚焦。
算法2第5行為最終的種子能量賦予函數(shù),其中Eafl(s)是AFL基于種子執(zhí)行速度和種子文件大小來分配的種子能量基準(zhǔn)。
模糊測試隨著測試推進(jìn)會遭遇一定的測試瓶頸導(dǎo)致測試進(jìn)度放緩[18],本文識別多目標(biāo)定向模糊測試過程中的障礙點(diǎn),與之前模糊測試方法中提到的障礙點(diǎn)(程序中的魔數(shù)字節(jié)和校驗(yàn)和)[19]不同,利用字節(jié)推斷來輔助穿透路徑約束,在程序中某些模塊的執(zhí)行不僅與輸入的結(jié)構(gòu)相關(guān),還與程序的命令行參數(shù)密切相關(guān),不同目標(biāo)位置的代碼可能需要不同的命令行參數(shù)才能被執(zhí)行。因此采取階段式的模糊測試方法,在一個模糊測試階段結(jié)束后,導(dǎo)出程序中完全支配節(jié)點(diǎn)集合All_DP′(p)的覆蓋情況,定義尚未被覆蓋的支配節(jié)點(diǎn)集合NoCov_DP(p) All_DP′(p),這個集合中的節(jié)點(diǎn)在測試過程中沒有被任何輸入數(shù)據(jù)或參數(shù)組合所執(zhí)行,指示程序中那些不易達(dá)到或未被充分測試的部分。為了覆蓋這些難以達(dá)到的支配節(jié)點(diǎn),可以采取以下方法:通過人工專家構(gòu)造專門的測試用例,調(diào)整輸入生成策略,或者借助動態(tài)符號執(zhí)行技術(shù)[20,21],以加強(qiáng)對這些存在覆蓋障礙的支配節(jié)點(diǎn)的測試。
3 實(shí)驗(yàn)評估
本章首先介紹實(shí)驗(yàn)的設(shè)置以及基準(zhǔn)測試集的選擇,繼而闡述本研究所采用的對比基線和評估指標(biāo)。最終,通過對比實(shí)驗(yàn)驗(yàn)證了本文方法的有效性,并在真實(shí)軟件構(gòu)成的FuzzBench平臺上評估了漏洞挖掘效果。
3.1 實(shí)驗(yàn)設(shè)置
本文根據(jù)上述的模糊測試框架構(gòu)建了工具M(jìn)TDFuzz,該工具主要通過C和Python實(shí)現(xiàn),并使用SVF[22]和Temporal-specialization[23]工具進(jìn)行過程間分析,以構(gòu)建程序過程間控制流圖iCFG。為了評估實(shí)驗(yàn),在Magma[24]基準(zhǔn)測試集上測試MTDFuzz的漏洞挖掘性能和效率,Magma基準(zhǔn)測試集通過補(bǔ)丁將多個1-day漏洞前向移植到一個版本的程序中,從而可以為DGF設(shè)置多個目標(biāo)。本研究采用了Lee等人[25]提出的定向模糊測試評估方法,通過Fuzzle自動生成的迷宮程序測試多目標(biāo)探索能力,F(xiàn)uzzle結(jié)合隨機(jī)創(chuàng)建的迷宮和歷史CVE漏洞中的路徑約束以生成測試程序。此外,使用了tcpreplay、logrotate、jpegoptim等五個接受不同類型輸入的真實(shí)程序組成FuzzBench[26],以測試MTDFuzz挖掘真實(shí)程序漏洞的能力。
對比基線:將MTDFuzz與以下模糊測試工具進(jìn)行對比測試。
a)AFL++[27]:git commit 981a90d;
b)AFLGo[4]:git commit fa125da;
c)SieveFuzz[8]:git commit 1fb90ff;
d)LeoFuzz[28]:Docker SHA256 hash 60a1930。
AFL++是基于AFL持續(xù)開發(fā)的社區(qū)版,集成了眾多當(dāng)前最先進(jìn)的輔助分析和編譯優(yōu)化技術(shù),是當(dāng)前主流的覆蓋率引導(dǎo)模糊測試工具。AFLGo首次提出了定向模糊測試方法,并實(shí)現(xiàn)了基于最小距離模型的定向測試工具。SieveFuzz是一個具有可達(dá)性感知的定向模糊測試工具,將靜態(tài)分析和動態(tài)分析相結(jié)合以提前終止不可達(dá)輸入,減小模糊測試的搜索空間;LeoFuzz通過分析目標(biāo)序列與種子序列之間的多種關(guān)系,利用覆蓋率種子隊(duì)列和定向種子隊(duì)列,自適應(yīng)地協(xié)調(diào)定向模糊測試的探索和利用階段。由于FuzzGuard[7]和Hawkeye[5]并未開源,所以本文未選取它們進(jìn)行對比實(shí)驗(yàn)。
實(shí)驗(yàn)環(huán)境:本文實(shí)驗(yàn)運(yùn)行的硬件和軟件環(huán)境為Intel?Xeon?Silver 4216 CPU @ 2.10 GHz,128 GB內(nèi)存,操作系統(tǒng)為64位Ubuntu 20.04.3 64,編譯器為Clang 12.0.1和gcc 11.4.0。
3.2 通用測試集性能評估
Magma v1.2.1測試集是一個廣泛用于評估模糊測試性能的基準(zhǔn)測試集,它包含了多個程序庫中的漏洞:libpng(7個漏洞)、libtiff(14個漏洞)、libxml2(17個漏洞)、poppler(22個漏洞)、openssl(20個漏洞)、SQLite(20個漏洞)、PHP(16個漏洞),Lua(4個漏洞)、libsndfile(25個漏洞)。這些庫中包含的一些漏洞可以在十分鐘內(nèi)被AFL++發(fā)現(xiàn),這意味著它們可以在僅靠覆蓋率引導(dǎo)下迅速被模糊測試工具發(fā)現(xiàn),這種特性并不足以證明多目標(biāo)定向模糊測試方法的有效性,因此在本文的測試中,這些漏洞被剔除。
對于目標(biāo)位置的確定,Magma為每個漏洞在被測試程序中插入了一個或多個MAGMA_LOG宏,以便在執(zhí)行過程中記錄漏洞何時被覆蓋或觸發(fā)。本文將這些宏的位置指定為每個漏洞的目標(biāo)位置。此外,Magma還對程序進(jìn)行了補(bǔ)丁處理,以反轉(zhuǎn)修復(fù)錯誤的提交實(shí)現(xiàn)前向漏洞植入,并將這些位置也設(shè)置為目標(biāo),這些配置允許模糊測試工具更準(zhǔn)確地定位和測試特定的漏洞位置,從而更有效地評估其對多目標(biāo)定向模糊測試的性能。
本文使用Magma提供的默認(rèn)語料庫作為初始種子,進(jìn)行了10次每次24小時的實(shí)驗(yàn)評估。使用Magma提供的分析腳本對實(shí)驗(yàn)結(jié)果進(jìn)行分析,實(shí)驗(yàn)結(jié)果可分為以下兩個方面:a)模糊測試工具發(fā)現(xiàn)的漏洞數(shù)量,結(jié)果顯示在表1中;b)發(fā)現(xiàn)漏洞所需的平均時間(TTB),結(jié)果顯示在表2中。
在大多數(shù)情況下,MTDFuzz的表現(xiàn)優(yōu)于其他的模糊測試工具。平均而言,使用幾何平均值計算平均漏洞挖掘數(shù)量發(fā)現(xiàn)漏洞的平均時間并進(jìn)行比較,從表1和2中可以看出,MTDFuzz相較于AFL++(啟用cmplog選項(xiàng)),AFLGo、SieveFuzz和LeoFuzz,在libtiff、libxml2、php、poppler、libsndfile和lua中檢測的漏洞數(shù)量最多,平均漏洞發(fā)現(xiàn)時間縮短了57.6%、39.2%、43.9%和36.3%,在發(fā)現(xiàn)漏洞數(shù)量上分別增加了32%、59%、33%和18%。
3.3 多目標(biāo)探索能力實(shí)驗(yàn)
多目標(biāo)定向模糊測試不再以覆蓋率的提升效果為主要衡量指標(biāo),而是需要快速聚焦目標(biāo)位置集合。本實(shí)驗(yàn)評估MTDFuzz的多目標(biāo)探索能力,能否在相同的時間內(nèi)到達(dá)更多的目標(biāo),基于Magma中的四個實(shí)驗(yàn)程序libpng、libtiff、libxml2、libsndfile,并將其中每個軟件中的MAGMA_LOG宏數(shù)量擴(kuò)充到每個軟件100個作為目標(biāo)集合,構(gòu)建多目標(biāo)探索能力測試集,將MTDFuzz與AFLGo和AFL進(jìn)行對比,每個程序上進(jìn)行5輪實(shí)驗(yàn),每輪實(shí)驗(yàn)24 h,實(shí)驗(yàn)結(jié)果如圖6所示。
從圖6中可以看出,在實(shí)驗(yàn)前期三個模糊測試工具的目標(biāo)覆蓋情況差別不大,因?yàn)樵趯?shí)驗(yàn)初期都采用了覆蓋率引導(dǎo)。由于AFLGo采取了最小距離引導(dǎo),所以針對部分目標(biāo)和路徑在測試前期能夠快速覆蓋,MTDFuzz前期生成了大量的種子用于覆蓋支配節(jié)點(diǎn),然而隨著測試的深入,AFL和AFLGo的目標(biāo)發(fā)現(xiàn)效率相對MTDFuzz放緩,由于MTDFuzz基于程序中的支配節(jié)點(diǎn)引導(dǎo)逐步逼近目標(biāo)位置,且修剪已被充分測試的目標(biāo),轉(zhuǎn)而將能力傾斜于全覆蓋的目標(biāo)站點(diǎn),所以在24 h時,MTDFuzz相比AFLGo和AFL能夠覆蓋更多的目標(biāo),本文的方法對于多目標(biāo)的探索效率更高。
為了進(jìn)一步驗(yàn)證本文方法對多目標(biāo)測試路徑多樣性的提升,對本實(shí)驗(yàn)中的路徑和崩潰數(shù)量進(jìn)行了統(tǒng)計,以研究基于多目標(biāo)支配分析的測試用例優(yōu)選方法對測試路徑多樣性的影響。Q是2.4節(jié)中定義的支配節(jié)點(diǎn)覆蓋度5輪實(shí)驗(yàn)平均值,Avg(Target_path)是5輪實(shí)驗(yàn)中所有能執(zhí)行到目標(biāo)的測試用例數(shù)量(發(fā)現(xiàn)的目標(biāo)相關(guān)路徑數(shù)量),結(jié)果如表3所示。
根據(jù)表3的結(jié)果可以看出,MTDFuzz在支配節(jié)點(diǎn)覆蓋度和發(fā)現(xiàn)的目標(biāo)相關(guān)路徑數(shù)量上均優(yōu)于AFL和AFLGo,在libsndfile實(shí)驗(yàn)中,MTDFuzz發(fā)現(xiàn)的目標(biāo)相關(guān)路徑數(shù)量是AFLGo的3.9倍。原因是MTDFuzz采用了多目標(biāo)支配分析,比AFL和AFLGo更關(guān)注測試用例覆蓋執(zhí)行覆蓋目標(biāo)過程中的支配節(jié)點(diǎn),因此發(fā)現(xiàn)了更多的目標(biāo)相關(guān)路徑,提升了多目標(biāo)測試路徑多樣性。
3.4 多漏洞復(fù)現(xiàn)效率實(shí)驗(yàn)
為了驗(yàn)證MTDFuzz在一個軟件中包含多個漏洞場景的有效性,使用了Multi-target Fuzzle[29]生成兩個復(fù)雜度為20×20和30×30的迷宮合成程序,每個程序中均包含三個漏洞來進(jìn)行多漏洞復(fù)現(xiàn)效率實(shí)驗(yàn)。采用改進(jìn)的Fuzzle來合成路徑長度相同的迷宮漏洞程序,對每個程序分別運(yùn)行AFLGo、LeoFuzz、SieveFuzz和MTDFuzz,將三個漏洞都作為目標(biāo),并當(dāng)作以上模糊測試工具的輸入,每個實(shí)驗(yàn)都重復(fù)10次,每次運(yùn)行12 h,TTE是暴露漏洞的平均時間。
實(shí)驗(yàn)結(jié)果如圖7所示,從中可以看出在兩個迷宮程序中,MTDFuzz相比其他模糊測試工具探索bug1、bug2和bug3的平均時間開銷更小,在30×30的迷宮程序中,MTDFuzz的漏洞發(fā)現(xiàn)時間比AFLGo縮短了3.35 h,所需時間減少了71.4%。另外,MTDFuzz是唯一能在0.4 h內(nèi)發(fā)現(xiàn)20×20迷宮中所有bug,并在1.5 h內(nèi)發(fā)現(xiàn)30×30迷宮程序所有bug的模糊測試工具??傮w來看,在多個目標(biāo)漏洞引導(dǎo)環(huán)境下,MTDFuzz具有更強(qiáng)的多漏洞復(fù)現(xiàn)能力。
3.5 真實(shí)漏洞檢測能力實(shí)驗(yàn)
本文選擇了5個真實(shí)程序來構(gòu)建FuzzBench,以測試MTDFuzz的真實(shí)軟件漏洞挖掘能力。這些待測試程序涵蓋了不同的輸入格式,包括日志、圖像、二進(jìn)制程序和網(wǎng)絡(luò)流量包等,具體的程序信息和測試命令詳見表4。這些復(fù)雜的輸入結(jié)構(gòu)測試使得實(shí)驗(yàn)更能體現(xiàn)通用性和代表性,盡管采取更長時間的階段性測試對MTDFuzz更加有利,本文仍然將所有實(shí)驗(yàn)的運(yùn)行時間設(shè)定在24 h。
本實(shí)驗(yàn)與AFLGo、SieveFuzz、LeoFuzz進(jìn)行了比較。實(shí)驗(yàn)中,運(yùn)行Clang Static Analyzer[30],并將其靜態(tài)分析報告中的結(jié)果作為多目標(biāo)位置進(jìn)行測試,即潛在存在漏洞的代碼位置,Clang Static Analyzer靜態(tài)分析報告的結(jié)果沒有經(jīng)過可疑的過濾等處理,因此靜態(tài)分析報告中包含假陽性和不可達(dá)的目標(biāo)。實(shí)驗(yàn)旨在評估MTDFuzz及其他三個DGF工具在引導(dǎo)下觸發(fā)FuzzBench中漏洞的效率,并比較它們在此過程中的時間開銷。SieveFuzz在某些程序上無法編譯或正常運(yùn)行,因此將這些條目標(biāo)記為N/A,實(shí)驗(yàn)結(jié)果詳見表5,μTTE表示平均首次觸發(fā)時間,Ratio是其他fuzzer與MTDFuzz在μTTE指標(biāo)上的比值。
從表5可以看出,MTDFuzz發(fā)現(xiàn)真實(shí)漏洞所需的時間少于另外三種工具。在tcpreplay中,MTDFuzz表現(xiàn)出的加速效果最為出色,AFLGo、SieveFuzz、LeoFuzz所花的時間分別是MTDFuzz的15.13倍、28.49倍、5.79倍。從實(shí)驗(yàn)結(jié)果可以看出,MTDFuzz相比其他幾個模糊測試工具能夠更快挖掘到真實(shí)漏洞。
此外,為了驗(yàn)證多目標(biāo)定向模糊測試工具M(jìn)TDFuzz在實(shí)際開源軟件0-day漏洞挖掘中的應(yīng)用效果,采用兩種方式標(biāo)定需測試的目標(biāo)位置集合:a)最近提交或頻繁變更的代碼區(qū)域(與長期未修改已經(jīng)徹底測試的舊代碼相比,新提交的代碼中存在漏洞的風(fēng)險更高);b)利用靜態(tài)分析工具Clang Static Analyzer檢測可能存在漏洞的代碼。通過以上目標(biāo)標(biāo)定指引,MTDFuzz在Glibc、FFmpeg、logrotate和tinyexr四個開源軟件中發(fā)現(xiàn)了12個未公開漏洞,并得到了開發(fā)人員的確認(rèn),其中9個已獲取CVE編號,具體漏洞信息如表6所示。
發(fā)現(xiàn)的漏洞類型主要包括堆棧溢出等內(nèi)存破壞性漏洞,其中FFmpeg是一個被廣泛使用的多媒體庫,它在OSS-Fuzz中經(jīng)過了充分測試。使用傳統(tǒng)的模糊測試策略難以發(fā)現(xiàn)其中的crash,MTDFuzz則發(fā)現(xiàn)了2個堆溢出漏洞。此外,選取logrotate程序的CVE-2023-38795挖掘過程及漏洞成因進(jìn)行簡要說明,logrotate程序是Linux操作系統(tǒng)中常用的日志文件處理程序,該漏洞的代碼片段如圖8所示。
發(fā)現(xiàn)glibc glob函數(shù)棧溢出漏洞后,檢索logrotate程序中所有調(diào)用glob函數(shù)的代碼位置作為MTDFuzz的目標(biāo)進(jìn)行測試并發(fā)現(xiàn)crash。ASAN[31]內(nèi)存崩潰報告顯示,config.c文件第1 849行調(diào)用glob函數(shù)時發(fā)生崩潰,glob由GNU C庫(libc)提供,用于擴(kuò)展通配符模式匹配文件路徑,其第一個參數(shù)pattern是一個字符串,用于指定需匹配的文件名模式。logrotate讀取惡意構(gòu)造日志文件,導(dǎo)致得到的pattern字符串包含大量目錄分隔符“/”,每個目錄分隔符會遞歸觸發(fā)一次mempcpy內(nèi)存復(fù)制。由于glibc glob函數(shù)的實(shí)現(xiàn)未限制pattern字符串的長度,glob函數(shù)內(nèi)部的深度遞歸調(diào)用導(dǎo)致了棧溢出。修復(fù)補(bǔ)丁位于1 842~1 847行(圖中灰色陰影部分代碼),開發(fā)人員限制glob函數(shù)的pattern參數(shù)長度為2 048,防止遞歸引發(fā)棧溢出。OSS-Fuzz等其他持續(xù)性模糊測試長期測試logrotate項(xiàng)目但是并未關(guān)注其中g(shù)lob函數(shù)的調(diào)用,AFLGo等定向模糊測試方法難以對程序中的多個glob函數(shù)調(diào)用展開測試,因此難以發(fā)現(xiàn)該漏洞。
3.6 測試總結(jié)
通過對實(shí)驗(yàn)結(jié)果分析可以發(fā)現(xiàn):a)在通用的測試集Magma中,本文方法相比于AFL++、AFLGo、SieveFuzz和LeoFuzz表現(xiàn)出更高的目標(biāo)漏洞檢測效率,同時還能夠揭示更多的漏洞,這表明本文的方法能夠顯著提升針對多目標(biāo)的模糊測試性能;b)在多目標(biāo)測試路徑多樣性上,從多目標(biāo)探索能力實(shí)驗(yàn)中可以看出, MTDFuzz發(fā)現(xiàn)的目標(biāo)相關(guān)路徑數(shù)量相比AFLGo最高達(dá)3.9倍,得益于支配節(jié)點(diǎn)的指引作用,發(fā)現(xiàn)了更多的目標(biāo)相關(guān)路徑,增強(qiáng)了多目標(biāo)測試路徑多樣性;c)在多目標(biāo)測試資源分配上,從多目標(biāo)探索能力和多漏洞復(fù)現(xiàn)效率可以看出,本文的方法到達(dá)目標(biāo)站點(diǎn)的速度和數(shù)量優(yōu)于其他方法,由于采用了路徑動態(tài)修剪優(yōu)化策略,及時將測試的關(guān)注度從已充分測試的目標(biāo)轉(zhuǎn)向探索欠覆蓋目標(biāo),有效解決了未隨著目標(biāo)的遍歷情況動態(tài)調(diào)整傾斜測試資源的問題,所以MTDFuzz更適合于針對多目標(biāo)進(jìn)行測試,且利于與靜態(tài)分析告警處理等方法相結(jié)合;d)在真實(shí)程序測試集FuzzBench中,MTDFuzz的漏洞發(fā)現(xiàn)數(shù)量高于其他模糊測試工具,且發(fā)現(xiàn)了12個未公開漏洞,證明了MTDFuzz在真實(shí)軟件漏洞中的漏洞驗(yàn)證和挖掘潛力。
綜上,本文方法在漏洞的挖掘方面表現(xiàn)出色,不僅能夠充分地動態(tài)修剪目標(biāo)實(shí)現(xiàn)對多目標(biāo)的測試,還能通過支配節(jié)點(diǎn)的引導(dǎo)更快實(shí)現(xiàn)對目標(biāo)位置的覆蓋以及漏洞的觸發(fā)。
4 結(jié)束語
為解決之前定向模糊測試中平均距離模型對不同分支的多目標(biāo)適應(yīng)性不強(qiáng),以及未根據(jù)不同目標(biāo)的覆蓋程度動態(tài)調(diào)整距離度量這兩個問題,本文提出了一種基于支配節(jié)點(diǎn)以及目標(biāo)節(jié)點(diǎn)覆蓋狀態(tài)的路徑修剪方法,以基于支配節(jié)點(diǎn)覆蓋度的種子調(diào)度策略,并構(gòu)建了MTDFuzz模糊測試工具。實(shí)驗(yàn)結(jié)果表明,本文的方法在多目標(biāo)環(huán)境下,提升了程序中多個漏洞的復(fù)現(xiàn)效率,在相同條件下與其他定向模糊測試工具相比具有更高的目標(biāo)覆蓋效率,結(jié)合靜態(tài)分析報告的結(jié)果能更快復(fù)現(xiàn)真實(shí)漏洞。
下一步將探索如何在多目標(biāo)定向模糊測試過程中對識別的關(guān)鍵障礙點(diǎn)進(jìn)行突破。此外還計劃深入分析并整合靜態(tài)分析工具的輸出結(jié)果,以此來對本文提出的工具進(jìn)行進(jìn)一步的擴(kuò)展和優(yōu)化,提高定向模糊測試的效能和應(yīng)用廣度,從而更有效地支持復(fù)雜軟件系統(tǒng)的安全性測試和評估。
參考文獻(xiàn):
[1]任澤眾, 鄭晗, 張嘉元, 等. 模糊測試技術(shù)綜述 [J]. 計算機(jī)研究與發(fā)展, 2021, 58 (5): 944-963. (Ren Zezhong, Zheng Han, Zhang Jiayuan, et al. A review of fuzzing techniques[J]. Journal of Computer Research and Development, 2021, 58 (5): 944-963.)
[2]徐威, 李鵬, 張文鑌, 等. 網(wǎng)絡(luò)協(xié)議模糊測試綜述 [J]. 計算機(jī)應(yīng)用研究,2023, 40 (8): 2241-2249. (Xu Wei, Li Peng, Zhang Wenbin, et al. Survey of network protocol fuzzing [J]. Application Research of Computers, 2023, 40 (8): 2241-2249.)
[3]張冠宇, 尚文利, 張博文, 等. 一種結(jié)合遺傳算法的工控協(xié)議模糊測試方法 [J]. 計算機(jī)應(yīng)用研究, 2021, 38 (3): 680-684. (Zhang Guanyu, Shang Wenli, Zhang Bowen, et al. Fuzzy test method for industrial control protocol combining genetic algorithm [J]. Application Research of Computers, 2021, 38 (3): 680-684.)
[4]B?hme M, Pham V T, Nguyen M D, et al. Directed greybox fuzzing[C]// Proc of ACM SIGSAC conference on Computer and Communications Security. New York:ACM Press, 2017: 2329-2344.
[5]Chen Hongxu, Xue Yinxing, Li Yuekang, et al. Hawkeye: towards a desired directed grey-box fuzzer[C]// Proc of ACM SIGSAC Confe-rence on Computer and Communications Security. New York:ACM Press, 2018: 2095-2108.
[6]Huang Heqing, Guo Yiyuan, Shi Qingkai, et al. Beacon: directed grey-box fuzzing with provable path pruning[C]//Proc of IEEE Symposium on Security and Privacy. Piscataway,NJ:IEEE Press, 2022: 36-50.
[7]Zong Peiyuan, Lyu Tao, Wang Dawei, et al. FuzzGuard: filtering out unreachable inputs in directed grey-box fuzzing through deep learning[C]//Proc of the 29th USENIX Security Symposium. Berkeley, CA: USENIX Association,2020: 2255-2269.
[8]Srivastava P, Nagy S, Hicks M, et al. One Fuzz doesn’t fit all: optimizing directed fuzzing via target-tailored program state restriction[C]// Proc of the 38th Annual Computer Security Applications Conference. New York:ACM Press, 2022: 388-399.
[9]Du Zhengjie, Li Yuekang, Liu Yang, et al. WindRanger: a directed greybox fuzzer driven by deviation basic blocks[C]//Proc of the 44th International Conference on Software Engineering. New York:ACM Press, 2022: 2440-2451.
[10]Zhu Xiaogang, B?hme M. Regression greybox fuzzing[C]// Proc of ACM SIGSAC Conference on Computer and Communications Security. New York:ACM Press, 2021: 2169-2182.
[11]Chen Yaohui, Li Peng, Xu Jun, et al. SAVIOR: towards bug-driven hybrid testing[C]//Proc of IEEE Symposium on Security and Privacy. Piscataway,NJ:IEEE Press, 2020: 1580-1596.
[12]Zheng Han, Zhang Jiayuan, Huang Yuhang, et al. FISHFUZZ: catch deeper bugs by throwing larger nets[C]//Proc of the 32nd USENIX Security Symposium. Berkeley, CA: USENIX Association, 2023: 1343-1360.
[13]sterlund S, Razavi K, Bos H,et al. ParmeSan: Sanitizer-guided greybox fuzzing[C]//Proc of the 29th USENIX Security Symposium. Berkeley, CA: USENIX Association, 2020: 2289-2306.
[14]Wang Shen, Jiang Xunzhi, Yu Xiangzhan, et al. KCFuzz: directed fuzzing based on keypoint coverage[C]// Pro of the 7th International Conference,ICAIS. Cham: Springer, 2021: 312-325.
[15]Sreedhar V C, Gao Guang, Lee Y F. Incremental computation of dominator trees [J]. ACM Trans on Programming Languages and Systems, 1997, 19 (2): 239-252.
[16]Lengauer T, Tarjan R E. A fast algorithm for finding dominators in a flowgraph [J]. ACM Trans on Programming Languages and Systems, 1979, 1(1): 121-141.
[17]Luo Changhua, Meng Wei, Li Penghui. SelectFuzz: efficient directed fuzzing with selective path exploration[C]//Proc of IEEE Symposium on Security and Privacy. Piscataway,NJ:IEEE Press, 2023: 2693-2707.
[18]Gao Wentao, Pham V T, Liu Dongge, et al. Beyond the coverage plateau: a comprehensive study of fuzz blockers (registered report)[C]//Proc of the 2nd International Fuzzing Workshop.New York: ACM Press, 2023: 47-55.
[19]Stephens N, Grosen J, Salls C,et al. Driller: augmenting fuzzing through selective symbolic execution[C]// Proc of Network and Distributed System Security Symposium. 2016.
[20]Poeplau S, Francillon A. Symbolic execution with SymCC: don’t interpret, compile![C]//Proc of the 29th USENIX Security Symposium. Berkeley, CA: USENIX Association, 2020: 181-198.
[21]Triton: a dynamic binary analysis library [EB/OL]. (2023-12-04). https://triton-library. github. io/.
[22]SVF-tools. SVF-tools/SVF [EB/OL]. (2023-12-06). https://github. com/SVF-tools/SVF.
[23]Ghavamnia S, Palit T, Mishra S, et al. Temporal system call speciali-zation for attack surface reduction[C]//Proc of the 29th USENIX Security Symposium.Berkeley, CA: USENIX Association, 2020: 1749-1766.
[24]Hazimeh A, Herrera A, Payer M. Magma: a ground-truth fuzzing benchmark [C]// Proc of ACM Conference on Measurement and Analysis of Computing Systems.New York:ACM Press, 2020: 1-29.
[25]Lee H, Kim S, Cha S K.Fuzzle: making a puzzle for fuzzers[C]//Proc of the 37th IEEE/ACM International Conference on Automated Software Engineering. New York: ACM Press, 2022: 1-12.
[26]Metzman J, Szekeres L, Simon L, et al. FuzzBench: an open fuzzer benchmarking platform and service[C]// Proc of the 29th ACM Joint Meeting on European Software Engineering Conference and Sympo-sium on the Foundations of Software Engineering. New York:ACM Press,2021: 1393-1403.
[27]TheAFL+fuzzing framework [EB/OL]. AFLplusplus [EB/OL]. (2023-11-27). https://aflplus. plus/.
[28]Liang Hongliang, Yu Xinglin, Cheng Xianglin, et al. Multiple targets directed greybox fuzzing [J]. IEEE Trans on Dependable and Secure Computing, 2024,21(1):325-339.
[29]SoftSec-KAIST/Fuzzle at multi-target [EB/OL]. (2024-01-16). https://github. com/SoftSec-KAIST/Fuzzle/tree/multi-target.
[30]Clang Static Analyzer—Clang 18.0.0 git documentation [EB/OL]. (2023-11-26). https://clang. llvm. org/docs/ClangStaticAnalyzer. html.
[31]Serebryany K, Bruening D, Potapenko A, et al. AddressSanitizer: a fast address sanity checker[C]//Proc of USENIX Annual Technical Conference. Berkeley, CA: USENIX Association, 2012: 309-318.