李兆基,王田原,周自強(qiáng),王 堯,陳永樂
1.太原理工大學(xué) 信息與計(jì)算機(jī)學(xué)院,山西 晉中030600
2.國(guó)網(wǎng)山西省電力公司電力科學(xué)研究院 電網(wǎng)技術(shù)中心,太原030001
模糊測(cè)試是一種自動(dòng)化的程序測(cè)試技術(shù),它通過向目標(biāo)系統(tǒng)或待測(cè)程序提供大量輸入,然后監(jiān)測(cè)程序運(yùn)行過程中的異常狀況來發(fā)現(xiàn)程序錯(cuò)誤或漏洞。隨著模糊測(cè)試技術(shù)的研究與發(fā)展,對(duì)于許多僅有部分代碼區(qū)域需要測(cè)試的實(shí)際場(chǎng)景來說,定向模糊測(cè)試成為了一種最為行之有效的解決方案。例如補(bǔ)丁測(cè)試、bug重現(xiàn)和特殊bug搜索等場(chǎng)景[1]。
傳統(tǒng)的定向模糊測(cè)試是基于符號(hào)執(zhí)行的[2-6],它使用程序分析和約束求解來生成執(zhí)行不同程序路徑的輸入。這種定向模糊化器將可達(dá)性問題轉(zhuǎn)化為迭代約束滿足問題。但其將運(yùn)行時(shí)的大部分時(shí)間都花在重量級(jí)程序分析和約束求解上,可能會(huì)導(dǎo)致路徑爆炸問題,因此效率是低下的。2017年,Bohme等人[7]提出了一種定向灰盒模糊測(cè)試工具AFLGo,它通過計(jì)算每個(gè)基本塊和插裝階段的目標(biāo)位置之間的距離來測(cè)量種子到目標(biāo)位置的距離,并使用基于模擬退火的調(diào)度策略通過輸入距離評(píng)估來分配測(cè)試能量,以此來獲得更高的定向性能和效率。然而實(shí)驗(yàn)發(fā)現(xiàn),在某些程序運(yùn)行中,AFLGo的定向性能并不像預(yù)期的那樣優(yōu)于AFL。這是因?yàn)檎麄€(gè)定向模糊化過程分為探索階段和開發(fā)階段[7],AFLGo使用探索和開發(fā)階段的固定劃分,一旦探索階段轉(zhuǎn)向開發(fā)階段,即使由于沒有足夠的路徑而導(dǎo)致方向性能差,也沒有回頭路可走,不充分的探索結(jié)果通常會(huì)導(dǎo)致較差的開發(fā)結(jié)果。針對(duì)此問題,RDFuzz[8]使用一個(gè)交織的時(shí)間表來交替進(jìn)行探索和開發(fā),但即使是這樣,也顯得不夠靈活,無法做到對(duì)于真實(shí)世界的不同應(yīng)用程序自適應(yīng)地權(quán)衡探索階段與開發(fā)階段。研究人員將深度學(xué)習(xí)應(yīng)用于定向模糊,為解決以往研究中的難題提供了新的見解。V-Fuzz[9]和Suzzer[10]基于深度學(xué)習(xí)模型預(yù)測(cè)函數(shù)的易受攻擊概率,計(jì)算每個(gè)輸入執(zhí)行路徑上所有基本塊的靜態(tài)得分之和,對(duì)得分較高的輸入進(jìn)行優(yōu)先級(jí)排序。FuzzGuard[11]使用一種基于深度學(xué)習(xí)的方法,在執(zhí)行之前過濾掉無法到達(dá)的輸入,節(jié)省了在實(shí)際執(zhí)行上花費(fèi)的時(shí)間。但無法忽略的是,他們都采用隨機(jī)突變策略來生成輸入用例,由于隨機(jī)突變無法精確地改變輸入文件,這樣導(dǎo)致的后果就是,在對(duì)生成的輸入進(jìn)行篩選和優(yōu)先級(jí)排序之前,需要花費(fèi)大量的時(shí)間和資源去生成海量輸入,然后通常會(huì)出現(xiàn)數(shù)百萬個(gè)新生成的輸入被丟棄,只有其中的少數(shù)輸入(執(zhí)行新的代碼路徑)被保留下來,這勢(shì)必會(huì)使得它們?cè)谔剿麟A段和開發(fā)階段都耗費(fèi)大量不必要的資源去生成許多無效輸入,從而使模糊器變得低效。
在本文中,提出一種基于神經(jīng)網(wǎng)絡(luò)的動(dòng)態(tài)策略定向模糊測(cè)試方法,以緩解以上問題。該方法通過建立一個(gè)深度學(xué)習(xí)模型來優(yōu)化定向模糊測(cè)試中種子突變策略,學(xué)習(xí)先前輸入文件中不同位置的應(yīng)用突變模式,進(jìn)而精確引導(dǎo)當(dāng)前輸入生成過程,以最大限度地減少花費(fèi)在生成不期望輸入上的時(shí)間,從而增加模糊器覆蓋新代碼路徑的機(jī)會(huì)。將模糊測(cè)試階段的分裂投射到種子的劃分上來動(dòng)態(tài)協(xié)調(diào)探索階段和開發(fā)階段的劃分,即將種子分成兩組:用于探索的覆蓋種子和用于開發(fā)的定向種子,基于本文設(shè)計(jì)的動(dòng)態(tài)算法,可以自適應(yīng)地在兩個(gè)狀態(tài)之間切換。在這些技術(shù)的基礎(chǔ)上,開發(fā)了一個(gè)原型,名為DYNFuzz。并且在libxml2[12]、mupdf[13]、readelf[14]這三個(gè)應(yīng)用程序上對(duì)DYNFuzz 進(jìn)行了測(cè)試。實(shí)驗(yàn)結(jié)果表明,DYNFuzz具有比一般定向模糊器更優(yōu)越的性能。
本文做出的主要貢獻(xiàn)如下:
(1)提出一種新的神經(jīng)網(wǎng)絡(luò)解決方法來優(yōu)化種子突變,模型通過學(xué)習(xí)過去模糊探索輸入文件中的模式,預(yù)測(cè)當(dāng)前輸入文件中執(zhí)行變異的最佳位置,模糊器基于此信息生成高質(zhì)量的輸入。
(2)提出一種全新的定向模糊測(cè)試動(dòng)態(tài)協(xié)調(diào)方法,能夠自適應(yīng)地調(diào)整定向模糊測(cè)試階段的劃分,提高模糊器的性能和效率。
(3)在AFL的基礎(chǔ)上實(shí)現(xiàn)了原型DYNFuzz,實(shí)驗(yàn)結(jié)果表明,DYNFuzz具有比其他模糊器更好的性能表現(xiàn)。
定向灰盒模糊測(cè)試(directed greybox fuzzing,DGF)的目標(biāo)是到達(dá)程序代碼中的一組預(yù)先確定的位置,即潛在的容易引發(fā)錯(cuò)誤的位置。為此,整個(gè)DGF 過程需要經(jīng)過探索和開發(fā)兩個(gè)階段。兩個(gè)階段的界限與權(quán)衡是影響DGF性能的一個(gè)重要因素。采用一種動(dòng)態(tài)策略來協(xié)調(diào)二者之間的劃分,并且能夠做到自適應(yīng)地在兩個(gè)階段之間來回切換。具體來講,將模糊測(cè)試中的種子分成兩組:用于探索路徑的覆蓋種子和用于開發(fā)的定向種子。在本文的方法中,每組中種子的數(shù)量來表示花在相應(yīng)階段的能量,通過控制每組種子的數(shù)量來實(shí)現(xiàn)對(duì)兩個(gè)階段的動(dòng)態(tài)協(xié)調(diào)。另外,為了大幅提高模糊器生成輸入的效率,利用現(xiàn)代神經(jīng)網(wǎng)絡(luò)模型的強(qiáng)大學(xué)習(xí)能力去探索輸入文件中的模式,通過學(xué)習(xí)一個(gè)函數(shù)來預(yù)測(cè)輸入文件不同位置的突變?cè)鲆?,根?jù)結(jié)果進(jìn)行相應(yīng)的模糊突變,從而達(dá)到指導(dǎo)未來的模糊搜索的能力。DYNFuzz的整體框架如圖1所示。
圖1 DYNFuzz整體框架圖Fig.1 Framework of DYN fuzzz
模糊測(cè)試需要大量的計(jì)算。即使是很小的輸入增益,也需要成千上萬的隨機(jī)突變來發(fā)現(xiàn)。然而,并不是所有的突變都是一樣的。文件格式及其解析器是異構(gòu)的,對(duì)于一個(gè)復(fù)雜的輸入格式,如果沒有大量的領(lǐng)域?qū)I(yè)知識(shí),手動(dòng)識(shí)別那些有可能產(chǎn)生輸入增益的關(guān)鍵位置是很困難的。為此,通過一個(gè)神經(jīng)網(wǎng)絡(luò)模型來自動(dòng)識(shí)別輸入文件中使用代碼覆蓋反饋有用的位置。
給定一個(gè)字節(jié)格式的輸入文件,該模型注釋了一個(gè)熱映射函數(shù),強(qiáng)調(diào)了在輸入文件中改變每個(gè)位置的相對(duì)有效性。由于種子文件的長(zhǎng)度可變,將模型定義為一個(gè)函數(shù)族。這類函數(shù)可以表示為公式(1)中的f,它可以接受任意數(shù)量的輸入位置作為輸入。
通過這個(gè)函數(shù)將輸入文件中的每個(gè)位置與產(chǎn)生輸入增益的突變概率關(guān)聯(lián)起來。在種子變異之前,模糊器為每個(gè)種子文件查詢?cè)撃P?,并將突變集中在高亮顯示的位置,然后使用生成的熱圖引導(dǎo)突變到有用的位置。另外,針對(duì)少數(shù)有用位置的潛在輸入在模糊執(zhí)行期間被否決,這樣可以避免執(zhí)行不太可能產(chǎn)生輸入增益的輸入,從而節(jié)省時(shí)間。可以通過公式(2)來決定一個(gè)突變的輸入是否被否決。
其中,x表示模糊測(cè)試輸入的文件,x′表示變異后的輸入,f(x)對(duì)應(yīng)輸入文件的位置突變?cè)鲆娓怕?,α為用戶自定義閾值。x⊕x′可以表示變異輸入與原始種子文件之間的差異,通過α來控制一個(gè)合法的突變輸入需要多少有用的字節(jié)必須被突變。
直觀上來講,認(rèn)為對(duì)于一個(gè)經(jīng)過變異的輸入來說,代碼覆蓋的缺乏表明該輸入應(yīng)用了無用位置的突變。為了訓(xùn)練一個(gè)模型來學(xué)習(xí)預(yù)測(cè)函數(shù),可以通過輸入文件和相應(yīng)的代碼覆蓋率位圖的組合來表征和確定有用的位置。具體來講,模型的數(shù)據(jù)訓(xùn)練集對(duì)由以下公式來生成:
對(duì)于某一實(shí)值γ的截止值。給定訓(xùn)練數(shù)據(jù)集,目標(biāo)是學(xué)習(xí)一個(gè)模型,該模型可以將輸入文件x映射到差異熱圖x⊕x′,這反過來又可以用來識(shí)別潛在有用的位置,以集中注意力于突變。s(b,b′) 用于表示導(dǎo)致輸入增益的突變??梢杂靡粋€(gè)激勵(lì)函數(shù)來表示:
其中,bi表示位圖b的第i位,|b|表示位圖的長(zhǎng)度。具體的取值參考如表1所示。
表1 激勵(lì)函數(shù)真值表Table 1 Truth table for activation function
由于輸入文件都是序列數(shù)據(jù),而且長(zhǎng)度是可變的,選擇長(zhǎng)短時(shí)記憶(LSTM)神經(jīng)網(wǎng)絡(luò)[15]來進(jìn)行訓(xùn)練,以輸出一個(gè)模型,可用于預(yù)測(cè)預(yù)期的代碼覆蓋。眾所周知,LSTM克服了RNN在較長(zhǎng)的序列上存在的問題,能夠?qū)W習(xí)長(zhǎng)依賴關(guān)系。LSTM 神經(jīng)元包括一個(gè)用來保存長(zhǎng)期記憶的細(xì)胞狀態(tài)和輸入門、輸出門及遺忘門,結(jié)構(gòu)如圖2所示。
圖2 LSTM神經(jīng)元結(jié)構(gòu)圖Fig.2 Structure of LSTM neuron
遺忘門ft決定上一時(shí)刻的細(xì)胞狀態(tài)Ct-1有多少保留至當(dāng)前時(shí)刻,輸入門it決定當(dāng)前網(wǎng)絡(luò)的輸入xt有多少保存到細(xì)胞狀態(tài),然后將當(dāng)前記憶和長(zhǎng)期記憶組合在一起,形成新的細(xì)胞狀態(tài),具體如式(5)~(7)所示:
其中,W*表示模型的學(xué)習(xí)權(quán)重向量,σ為Sigmoid激活函數(shù),b*代表模型的學(xué)習(xí)偏差向量。最后通過輸出門ot控制單元狀態(tài)Ct有多少輸出到LSTM的當(dāng)前輸出值ht,即:
訓(xùn)練模型中,使用平均絕對(duì)誤差(MAE)作為損失函數(shù),優(yōu)化器是Adam。
現(xiàn)有的定向模糊器效率不高的很大一部分原因在于無法去靈活確定探索階段與開發(fā)階段的界限,一旦由探索階段轉(zhuǎn)向了開發(fā)階段,即使由于沒有足夠的路徑導(dǎo)致方向性能差,也沒有回頭路可走。為此,設(shè)計(jì)了一種動(dòng)態(tài)算法,能夠使模糊器在運(yùn)行過程中根據(jù)情況去選擇調(diào)用執(zhí)行合適的階段。詳情如算法1 所示。使用一個(gè)變量dr來表示種子池中定向種子所占的比重,相應(yīng)地它也表示花在開發(fā)階段的能量。在每個(gè)模糊化周期中,給覆蓋種子與定向種子加上標(biāo)簽,由dr進(jìn)行調(diào)整。定向模糊過程首先會(huì)進(jìn)入探索階段(dr=0),不斷地去發(fā)現(xiàn)更多的程序路徑,然后通過逐步增加dr的值來進(jìn)入開發(fā)階段。另外一種情況是,當(dāng)模糊器長(zhǎng)時(shí)間得不到的新的程序路徑覆蓋時(shí),需要迅速增加dr的值轉(zhuǎn)入開發(fā)階段。在開發(fā)階段,會(huì)優(yōu)先選擇距離目標(biāo)位置更近的種子進(jìn)行變異,同樣有時(shí)也需要從開發(fā)階段回到探索階段,那就是當(dāng)模糊器由于不充分的路徑探索信息陷入局部困境時(shí)。具體表現(xiàn)為如dr非常大,但經(jīng)過多個(gè)模糊化周期后仍不能靠近目標(biāo),這時(shí)應(yīng)當(dāng)大幅降低dr值返回探索階段繼續(xù)探索新的路徑,發(fā)現(xiàn)更多潛在的定向種子。另外,算法中的閾值是根據(jù)神經(jīng)網(wǎng)絡(luò)模型的準(zhǔn)確度設(shè)置的。通過這一動(dòng)態(tài)策略,能夠自適應(yīng)地權(quán)衡探索階段和開發(fā)階段,提高模糊器的性能。
算法1 Directed Greybox Fuzzing with dynamic strategy
眾所周知,模糊器的突變策略是影響模糊器性能的一個(gè)重要因素。一些模糊器優(yōu)化突變策略以輔助定向模糊,Chen 等[16]利用了一種自適應(yīng)突變策略,它將突變器分為粗粒度和細(xì)粒度。粗粒度的突變器用于在突變期間更改大量字節(jié),而細(xì)粒度的突變器則只涉及幾個(gè)字節(jié)級(jí)的修改、插入或刪除。但突變器的調(diào)度是由經(jīng)驗(yàn)值控制的,帶有一定的主觀性。本文通過采用機(jī)器學(xué)習(xí)的方法將變異具體到種子的字節(jié)粒度來改善這一過程。DYNFuzz在每次種子突變之前查詢訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)模型,通過模型反饋的預(yù)測(cè)結(jié)果來優(yōu)化探索階段和定向階段的種子變異。探索階段的目的在于代碼覆蓋,因此在探索階段,模糊器在種子突變前查詢神經(jīng)網(wǎng)絡(luò)模型,模型返回對(duì)應(yīng)的完整輸入文件的覆蓋熱圖,對(duì)應(yīng)文件各位置突變導(dǎo)致新代碼覆蓋的概率可能性。使用覆蓋熱圖中的概率值對(duì)突變位置進(jìn)行排序,優(yōu)先選擇產(chǎn)生突變?cè)鲆婵赡苄愿叩奈恢眠M(jìn)行突變。此外,通過模型查詢獲得到的bytemask是按位的,結(jié)合突變輸入與原始種子之間的差異可以獲得如公式(10)所示的K值,其中input⊕Seed表示突變差異。當(dāng)K值小于給定閾值α,此次突變無法導(dǎo)致代碼覆蓋率的增加或者其增幅不夠明顯,則在執(zhí)行之前拒絕此次突變以節(jié)省資源消耗。而到了開發(fā)階段,由于選取的都是距離目標(biāo)位置比較近的定向種子,而且經(jīng)過模型查詢,可以否決那些無用部分的突變,這樣一來,大量的突變極有可能導(dǎo)致種子偏離目標(biāo)位置,因此DYNFuzz在開發(fā)階段對(duì)于模型反饋的有效突變位置以50%的概率選擇對(duì)其進(jìn)行輕微的突變,即單一方式的突變。
在探索階段,為了能夠讓模糊器盡可能探索到更多的程序路徑,在測(cè)試執(zhí)行跟蹤中關(guān)注那些觸發(fā)新的路徑覆蓋的種子,這樣配合神經(jīng)網(wǎng)絡(luò)模型的反饋信息進(jìn)行精準(zhǔn)變異,可以大大提升模糊器的探索效率,獲取到豐富的路徑信息。到了開發(fā)階段,借鑒了AFLGo 的種子優(yōu)先級(jí)排序方法,基于LLVM方法[17]計(jì)算基本塊距離目標(biāo)點(diǎn)的距離,賦予每個(gè)定向模糊種子一個(gè)distance值,由此對(duì)其進(jìn)行優(yōu)先級(jí)排序。
在搭載了Intel Core CPU i7-6500U、16 GB RAM、Nvidia GeForce GTX 1080 Ti(11 GB)和 以Ubuntu 16.04(64位)為操作系統(tǒng)的計(jì)算機(jī)上執(zhí)行了所有實(shí)驗(yàn)和測(cè)試。在實(shí)驗(yàn)中,選擇了libxml2[12]、mupdf[13]、readelf[14]這3個(gè)基準(zhǔn)來測(cè)試和驗(yàn)證提出的技術(shù)。
神經(jīng)網(wǎng)絡(luò)模型是基于高級(jí)深度學(xué)習(xí)庫(kù)Keras[18]開發(fā)的,并選用Tensorflow[19]作為底層后端。為了收集訓(xùn)練模型所需要的數(shù)據(jù),針對(duì)每個(gè)基準(zhǔn)隨機(jī)選取了7 800 個(gè)種子文件,將種子平均分為訓(xùn)練集和測(cè)試集,在AFL上運(yùn)行了24 h。給定一個(gè)包含輸入、變異輸入以及其對(duì)應(yīng)的代碼覆蓋的集合(x,x′,b,b′),通過公式對(duì)數(shù)據(jù)進(jìn)行過濾,構(gòu)造一個(gè)訓(xùn)練集XY。模型訓(xùn)練了12 h 以確保收斂,損失函數(shù)使用平均絕對(duì)誤差(MAE),同時(shí)還使用Adam 優(yōu)化器來幫助學(xué)習(xí)函數(shù)快速穩(wěn)定地收斂到最優(yōu)解。當(dāng)學(xué)習(xí)函數(shù)的損失值變得穩(wěn)定時(shí),訓(xùn)練過程結(jié)束。
基于所提出的方法,開發(fā)了一個(gè)原型,由DYNFuzz命名,它建立在AFL[20]、基于LLVM[17]的分析和python腳本之上。AFL提供了一個(gè)基本的測(cè)試框架;此外,在afl-fuzz.c模塊中添加了一些額外的代碼,實(shí)現(xiàn)了提出的方法,包括動(dòng)態(tài)策略、QueryModel()函數(shù)。基于LLVM的分析和python腳本用于輸入距離計(jì)算。
為了評(píng)估本文提出方法的有效性,在不同的測(cè)試基準(zhǔn)上進(jìn)行了多次實(shí)驗(yàn),從神經(jīng)網(wǎng)絡(luò)模型的有效性、DYNFuzz的定向性能兩個(gè)方面進(jìn)行了評(píng)估。
2.3.1 模型有效性
模型的有效性對(duì)DYNFuzz 至關(guān)重要,因?yàn)榉N子變異是基于模型的預(yù)測(cè)結(jié)果進(jìn)行的。如圖3所示,經(jīng)過5個(gè)時(shí)期的訓(xùn)練,本文的模型準(zhǔn)確率達(dá)到了91.3%,訓(xùn)練損失下降到了23%,結(jié)果如圖3所示。
圖3 模型的訓(xùn)練精度和損失值Fig.3 Training accuracy and loss of proposed model
另一方面,使用機(jī)器學(xué)習(xí)中廣泛使用的假正例率(FPR)、假陰率(FNR)、真正例率(TPR)、準(zhǔn)確率(P)以及F值(F-score)作為度量來評(píng)估本文的模型。其中FPR=FP/(FP+TN)是假陽性輸入增益占全部無法產(chǎn)生輸入增益總體的比例,F(xiàn)NR=FN/(TP+FN)為假陰性輸入增益與輸入增益總體的比例。TPR=TP/(TP+FN)表示正確預(yù)測(cè)輸入增益樣本與輸入增益總體的比例。P=TP/(TP+FP)用于度量預(yù)測(cè)輸入增益,增加代碼覆蓋的正確性。F-score=2×P×TPR/(P+TPR)綜合考慮了準(zhǔn)確率和TPR。結(jié)果如表2 所示,可以看到本文的模型在三個(gè)基準(zhǔn)測(cè)試集上都表現(xiàn)出了良好的預(yù)測(cè)結(jié)果和精準(zhǔn)度,但可以看出在mupdf解析器上的表現(xiàn)要明顯低于其他兩個(gè)基準(zhǔn),這可能是由于典型的PDF文件的大小相當(dāng)大(超過100 kb),針對(duì)這種冗長(zhǎng)格式文件,模型沒有訓(xùn)練充分,學(xué)習(xí)過程中丟失了部分信息所導(dǎo)致的,針對(duì)此問題,可以嘗試通過增加訓(xùn)練集的大小來改善。
表2 DYNFuzz在測(cè)試基準(zhǔn)上的表現(xiàn)Table 2 Performance of DYNFuzz on test benchmarks
2.3.2 定向性能評(píng)估
使用機(jī)器學(xué)習(xí)模型的目的在于提高模糊器在探索期間的覆蓋能力,豐富的路徑信息可以使得模糊器在進(jìn)入開發(fā)階段后精確導(dǎo)向目標(biāo)位置,動(dòng)態(tài)策略的引入也使得模糊器更加靈活,能夠在陷入困境時(shí)在兩個(gè)階段之間自由切換。為了直觀地表現(xiàn)DYNFuzz 的定向性能,采用探索階段的輸入增益和開發(fā)階段生成輸入的最小輸入距離作為評(píng)價(jià)指標(biāo)來定量表示。輸入增益是在目標(biāo)程序中發(fā)現(xiàn)的表現(xiàn)出從未見過的行為路徑的數(shù)量。這種行為表征為執(zhí)行一個(gè)新的代碼塊,或者增加先前執(zhí)行的代碼塊的執(zhí)行頻率。最小輸入距離最早是在AFLGo中提出使用的,這是一種反映直接測(cè)試結(jié)果的方法。使用AFLGo 和RDFuzz 兩個(gè)定向模糊器作為比較,在CVE-2017-5969、CVE-2018-6544、CVE-2019-14444這三個(gè)基準(zhǔn)上進(jìn)行了對(duì)比實(shí)驗(yàn),它們分別對(duì)應(yīng)了結(jié)果如圖4所示,x軸代表了持續(xù)的時(shí)間,探索階段y軸表示找到的代碼路徑的唯一枚舉,開發(fā)階段軸表示所有生成的輸入中的最小輸入距離。
圖4 DYNFuzz在三個(gè)測(cè)試基準(zhǔn)上的表現(xiàn)Fig.4 Performance of DYNFuzz on three benchmarks
基于圖示結(jié)果可以看出,在3個(gè)測(cè)試基準(zhǔn)中,DYNFuzz都表現(xiàn)出了良好的探索和開發(fā)結(jié)果,特別是在第一個(gè)和第三個(gè)測(cè)試基準(zhǔn)上,可以明顯看出DYNFuzz 無論是在探索階段的路徑覆蓋上還是開發(fā)階段的目標(biāo)位置定向上,都要好于RDFuzz 和AFLGo。而在第二個(gè)基準(zhǔn)(CVE-2018-6544)上,DYNFuzz 與RDFuzz 的結(jié)果非常接近,甚至在某些時(shí)刻點(diǎn)上,RDFuzz 的結(jié)果要好于DYNFuzz,推測(cè)出現(xiàn)這一結(jié)果的原因是模型查詢的時(shí)間過長(zhǎng)從而導(dǎo)致對(duì)DYNFuzz的性能產(chǎn)生負(fù)面影響。由于典型的PDF 文件大小相當(dāng)大,DYNFuzz 在模糊化每個(gè)種子文件之前,必須為這個(gè)種子文件查詢模型,以產(chǎn)生顯著改善的輸入增益,但對(duì)于這樣大的種子文件,整個(gè)查詢過程可能需要幾秒鐘甚至更多的時(shí)間,在模型查詢上經(jīng)常會(huì)阻塞執(zhí)行,以致于影響了整個(gè)fuzzer 的性能。而RDFuzz 由于采用了分支級(jí)別的統(tǒng)計(jì)數(shù)據(jù),因此在面對(duì)mupdf這樣比較大的程序也限制了其一定的性能,所以二者在CVE-2018-6544 上的整體表現(xiàn)并沒有相差很多。而AFLGo 受限于探索與開發(fā)階段的權(quán)衡問題,有時(shí)會(huì)在CVE-2017-5969 上表現(xiàn)的那樣,被困在開發(fā)階段,無法更進(jìn)一步地接近目標(biāo)位置,而在DYNFuzz上沒有出現(xiàn)這種情況,這得益于動(dòng)態(tài)協(xié)調(diào)策略的引入,在長(zhǎng)時(shí)間無法趨近目標(biāo)代碼區(qū)域時(shí),模糊器會(huì)調(diào)用探索階段來豐富程序路徑信息。
在本文中,提出了一種基于神經(jīng)網(wǎng)絡(luò)模型的動(dòng)態(tài)策略定向模糊測(cè)試方法,用于改善當(dāng)前定向模糊器的效率,在三種處理常見文件格式的程序上進(jìn)行了實(shí)驗(yàn)測(cè)試,分析了模型的準(zhǔn)確性和DYNFuzz 的定向性能。結(jié)果表明,所提出的方法能夠更快、更高效地實(shí)現(xiàn)程序路徑覆蓋并接近和覆蓋目標(biāo)位置,這說明本文的技術(shù)方法具有更高效的定向性能,從而有著更大的概率去發(fā)現(xiàn)漏洞。另外,動(dòng)態(tài)策略方法的應(yīng)用也避免了模糊器陷入局部困境的情況。
另一方面,DYNFuzz 仍存在一些值得進(jìn)一步研究的問題與局限性。首先,在實(shí)驗(yàn)中發(fā)現(xiàn)本文的模型在應(yīng)對(duì)大型文件處理程序時(shí)表現(xiàn)不佳,需要進(jìn)一步完善模型的設(shè)計(jì),或者還應(yīng)該考慮應(yīng)用其他更好的神經(jīng)網(wǎng)絡(luò)模型來學(xué)習(xí)文件變異模式。其次,動(dòng)態(tài)協(xié)調(diào)算法中的閾值是根據(jù)本文模型的準(zhǔn)確度進(jìn)行設(shè)置的,但這在一定程度上也給DYNFuzz 帶來了一定的局限性,更為合理的方式應(yīng)該是基于啟發(fā)式算法生成的,因此尋找和應(yīng)用合適的啟發(fā)式算法也是接下來需要研究的方向。最后,DYNFuzz 的局限還表現(xiàn)在無法發(fā)現(xiàn)隱藏在復(fù)雜的健全性檢查背后的漏洞,例如魔法字節(jié)。可以將當(dāng)前的一些高級(jí)方法集成到本文的工具中,以增強(qiáng)漏洞檢測(cè)能力。例如可以結(jié)合污點(diǎn)分析[21]或者動(dòng)態(tài)符號(hào)執(zhí)行[22]技術(shù),設(shè)計(jì)更加高效的種子遺傳變異策略,提升DGF的能力。