蘇文超 費(fèi)洪曉
(中南大學(xué)計(jì)算機(jī)學(xué)院 長沙 410083)
模糊測試是現(xiàn)在流行的漏洞挖掘技術(shù)之一.由于其易部署性和在漏洞挖掘方面的高效性,許多軟件公司,如Adobe[1],Cisco[2],Google[3-5],Microsoft[6-7]等,都會在軟件開發(fā)生命周期中使用模糊測試來保證產(chǎn)品的安全性.
模糊測試的本質(zhì)是自動化生成隨機(jī)輸入,利用輸入快速執(zhí)行測試程序,并監(jiān)控異常執(zhí)行結(jié)果來發(fā)現(xiàn)軟件漏洞.這種隨機(jī)性可以生成觸發(fā)程序異常的非預(yù)期輸入,但同時(shí),隨機(jī)性也意味著輸入是從輸入空間無方向、無目標(biāo)地選定.這種盲目性會導(dǎo)致大量冗余、無效的輸入,浪費(fèi)程序執(zhí)行時(shí)間,而只有少部分輸入能真正完成觸發(fā)程序異常的功能.
為了應(yīng)對隨機(jī)性不可避免的性能瓶頸,研究者試圖通過程序的執(zhí)行反饋信息指導(dǎo)模糊測試,從而幫助提升隨機(jī)性種子生成的方向感,但這種智能化的提升也給模糊器帶來一定的性能開銷.
以AFL(American fuzzy lop)[8]為首,覆蓋率引導(dǎo)的灰盒模糊測試(coverage-guided grey-box fuzzing,CGF)較好地平衡了實(shí)際應(yīng)用中反饋指導(dǎo)的性能開銷和漏洞挖掘的效果,成為工業(yè)應(yīng)用最廣泛的模糊測試技術(shù)之一,也是目前學(xué)術(shù)界模糊測試研究的主流內(nèi)容.國際安全會議上關(guān)于CGF的研究內(nèi)容越來越多,如AFLFast[9],Steelix[10],Vuzzer[11],Angora[12],CollAFL[13],T-Fuzz[14].這些工作對CGF的各運(yùn)行階段、模糊策略進(jìn)行了不同程度的改進(jìn)優(yōu)化.為了保持CGF的快速發(fā)展步伐,有必要對這些改進(jìn)工作做一個(gè)階段性的整合,幫助梳理其碎片化知識,總結(jié)其優(yōu)化方向,從而全面、連貫地認(rèn)識CGF的最新發(fā)展現(xiàn)狀,更明確清晰地進(jìn)行深入研究.
1.1.1 灰盒模糊測試
模糊測試[15]通過隨機(jī)生成輸入來重復(fù)運(yùn)行測試程序,監(jiān)控程序異常,通過記錄導(dǎo)致異常的輸入定位程序中漏洞的位置.所以模糊測試的核心在于能觸發(fā)程序異常的輸入的生成.根據(jù)輸入的生成方式分類[16],目前主要分為基于生成的模糊測試(generation-based fuzzing)和基于突變的模糊測試(mutation-based fuzzing).基于生成的模糊測試根據(jù)已知的輸入規(guī)范建模,然后根據(jù)模型生成新的輸入,如Ifuzzer[17],radamsa[18];基于突變的模糊測試先得到應(yīng)用程序的1組輸入樣本,根據(jù)這些輸入樣本通過變異的方法生成新的輸入,如AFL,hongfuzz[19],zzuf[20].
基于突變的模糊測試隨機(jī)生成無規(guī)則的樣本作為測試程序的輸入,以測試程序的崩潰或停止行為作為輸入是否有效的反饋信息.這種完全脫離程序執(zhí)行過程的反饋信息指導(dǎo)的模糊測試被定義為黑盒模糊測試.早期的黑盒模糊測試效率低下,大部分輸入無法到達(dá)程序的深層分支,只能在邏輯較為簡單的淺層分支發(fā)揮有效作用,在代碼復(fù)雜度飛躍的現(xiàn)在已經(jīng)難以發(fā)現(xiàn)程序的安全問題[21].
因此,通過程序執(zhí)行過程的反饋信息指導(dǎo)輸入變異方向的白盒模糊測試開始得到應(yīng)用.白盒模糊測試可合法訪問測試程序的源代碼,通過重量級的程序分析工具獲取程序執(zhí)行時(shí)的反饋信息.但重量級的程序分析工具往往會大幅增加性能開銷.為了能在可控的性能開銷上提高變異輸入的有效性,人們開始提倡使用灰盒模糊測試.灰盒模糊測試處于白盒和黑盒模糊測試之間,它可以采用輕量級的程序分析工具來獲取粗粒度的程序執(zhí)行信息.輕量級的程序分析工具使得灰盒模糊測試在同樣時(shí)間內(nèi)較白盒執(zhí)行更多(百倍甚至千倍)的輸入,因此,灰盒模糊測試的效果甚至能超過白盒[22-23].
1.1.2 覆蓋率引導(dǎo)的模糊測試
模糊測試的目標(biāo)是覆蓋程序盡可能多的運(yùn)行狀態(tài),挖掘程序中潛在的漏洞.然而,由于程序行為的不確定性,程序狀態(tài)并不能被直觀地測量.研究者因此選擇將代碼覆蓋率作為程序狀態(tài)的替代測量指標(biāo),即新的代碼覆蓋率的增加近似于新的程序狀態(tài)的增加.
覆蓋率引導(dǎo)的模糊測試(coverage-guided fuzzing)率先使用代碼覆蓋率作為程序執(zhí)行反饋信息指導(dǎo)生成有效的輸入.有效的輸入即能執(zhí)行程序還未執(zhí)行過的代碼.基于有效的輸入進(jìn)行變異,生成的新的輸入更容易遍歷到程序盡可能多的代碼,也更有可能挖掘到這些代碼中的潛在漏洞.AFL在工業(yè)上持續(xù)的成功經(jīng)驗(yàn)證實(shí)了這種理念的正確性.利用代碼覆蓋率指導(dǎo)生成覆蓋目標(biāo)代碼和程序目標(biāo)路徑的輸入的模糊測試叫作定向模糊測試(directed fuzzing),如AFLGO[24].
1.1.3 覆蓋率引導(dǎo)的灰盒模糊測試
CGF是灰盒模糊測試和覆蓋率引導(dǎo)的模糊測試的組合概念.它通過輕量級的程序分析工具獲取程序執(zhí)行時(shí)的覆蓋信息,并根據(jù)覆蓋信息指導(dǎo)輸入生成.
跟蹤輸入在測試程序中的執(zhí)行路徑可得到準(zhǔn)確全面的程序反饋信息,但由于路徑覆蓋會帶來高昂的性能消耗,實(shí)際應(yīng)用中的CGF一般選擇將更粗糙的基本塊作為代碼覆蓋的粒度.自AFL將邊覆蓋引入模糊測試后,研究者發(fā)現(xiàn)邊覆蓋可獲得比塊覆蓋更準(zhǔn)確的執(zhí)行信息,邊覆蓋開始成為覆蓋率引導(dǎo)的模糊測試的主流研究方向[13].然而,不管是邊覆蓋還是塊覆蓋,CGF都是通過其覆蓋信息的反饋調(diào)整輸入,以期獲得在應(yīng)用程序上更多的代碼執(zhí)行,挖掘到潛在的漏洞.
CGF的主流程為模糊迭代過程,主要分為輸入生成和程序測試2個(gè)階段.在用戶設(shè)置的時(shí)間超時(shí)之前,CGF不斷重復(fù)生成輸入,用輸入執(zhí)行測試程序,再經(jīng)由執(zhí)行的反饋信息指導(dǎo)下一輪輸入生成.圖1展示了典型的CGF流程圖.其中:輸入生成階段包括種子調(diào)度和變異操作;程序測試階段包括程序執(zhí)行和反饋信息收集操作.
圖1 CGF流程圖
模糊迭代以種子s和插樁程序作為輸入.種子s即CGF的初始化種子,其可以由用戶提供也可以由模糊器生成.用戶提供的種子往往比模糊器隨機(jī)生成的種子具有更好的輸入格式,更可能通過程序的語法語義檢查而執(zhí)行到深層代碼.此外,基于高質(zhì)量的種子進(jìn)行變異也更容易獲得新的高質(zhì)量的輸入[25].所以,在實(shí)踐中,用戶通常會從網(wǎng)絡(luò)或應(yīng)用程序的測試文檔里提取合法的輸入作為模糊迭代的種子,以提高模糊測試的效果.注意,本文中種子和測試用例皆為插樁程序的輸入.為了區(qū)分其在模糊迭代過程中的作用,將保存在全局隊(duì)列S中,用于變異的高質(zhì)量的輸入叫作種子;將種子經(jīng)過變異操作后,隨機(jī)生成的直接用于執(zhí)行程序的輸入叫作測試用例.
初始化種子作為變異的候選樣本,保存到全局隊(duì)列S中(步驟①).然后,種子調(diào)度器根據(jù)一定的評價(jià)標(biāo)準(zhǔn)把種子排好優(yōu)先級,從隊(duì)列S中選擇一個(gè)優(yōu)先級最高,也就是質(zhì)量最好的種子(步驟②),再根據(jù)其質(zhì)量權(quán)重分配該種子相應(yīng)的能量值(步驟③),此時(shí),下一輪待變異的種子s′已確定.能量是指導(dǎo)變異器生成測試用例數(shù)量的指標(biāo).能量越高,生成的測試用例數(shù)量越多.因此,基于能量值的設(shè)置,可以將程序測試的時(shí)間資源向高質(zhì)量的輸入傾斜,從而在有限的時(shí)間內(nèi)找到盡可能多的程序漏洞.此外,各模糊器的種子選擇標(biāo)準(zhǔn)不盡相同,例如,AFL傾向于選擇最小測試用例數(shù)量或執(zhí)行速度最快的種子,AFLFAST傾向于選擇能夠執(zhí)行到低執(zhí)行頻率路徑的種子.Shudrak等人[26]基于復(fù)雜代碼更容易出錯的猜想,利用軟件復(fù)雜度對種子排序.
待變異種子s′傳遞到變異器中(步驟④),同樣地,不同的模糊器可以執(zhí)行不同的突變策略.AFL采用隨機(jī)修改和拼接的突變策略,包括順序翻轉(zhuǎn)不同長度和步長的位、小整數(shù)的順序加減、已知整數(shù)(0,1,INT_MAX)的插入等方法[27].變異器根據(jù)預(yù)設(shè)的突變策略,對種子s′進(jìn)行突變,生成新的1組輸入,即測試用例(步驟⑤).
用生成的測試用例執(zhí)行插樁程序(步驟⑥和步驟⑦).插樁即在保證程序原有邏輯完整性的基礎(chǔ)上在程序中插入一些探針,從而進(jìn)行信息采集[28].在CGF中,插樁用于獲取程序執(zhí)行時(shí)的覆蓋信息.AFL根據(jù)是否提供源代碼,提供編譯器內(nèi)插樁和外部插樁2種方式.編譯器內(nèi)插樁包括gcc模式和llvm模式,在生成二進(jìn)制代碼時(shí)完成代碼段插樁工作;外部插樁即利用qemu[29]在基本塊轉(zhuǎn)換為TCG塊時(shí)完成代碼段插樁工作[30].
程序執(zhí)行過程中,模糊器持續(xù)跟蹤程序狀態(tài),收集程序異常和崩潰信息以及覆蓋率的反饋信息(步驟⑧).如果1個(gè)測試用例導(dǎo)致了程序崩潰,或者增加了新的代碼覆蓋,那么該測試用例將保存到隊(duì)列S中,等待下一輪的種子調(diào)度(步驟⑨).
模糊迭代停止后,將所有測試用例執(zhí)行到的漏洞信息輸出(步驟⑩).
CGF的偽代碼如算法1所示,遵循與圖1一致的執(zhí)行邏輯.其中:bitmap為程序的全局覆蓋率位圖,保存整個(gè)模糊迭代過程中的代碼覆蓋信息;bitmap′為每輪測試用例t所執(zhí)行到的代碼覆蓋率位圖.當(dāng)測試用例t探測到新的覆蓋信息時(shí),該覆蓋信息將被加入bitmap,同時(shí)將t作為高質(zhì)量種子保存到全局隊(duì)列S.
算法1.覆蓋率引導(dǎo)的灰盒模糊測試流程.
① 輸入:檢測后的測試程序p、種子s;
② 輸出:缺陷B.
③B=?;
④bitmap=?;
⑤S=s;
⑥ repeat:
⑦s′=Schedule(S);
⑧t=Mutate(s′);
⑨B′,bitmap′=Execute(t);
⑩ ifbitmap′∩bitmap≠? then
S=S∪t;
2.1.1 輸入生成階段的挑戰(zhàn)
1) 種子調(diào)度問題.
種子調(diào)度策略包括種子選擇策略和能量分配策略2個(gè)子部分.目前,在選擇種子時(shí),CGF通常使用單維度評價(jià)標(biāo)準(zhǔn)對種子質(zhì)量進(jìn)行優(yōu)先級排序,如文獻(xiàn)[26].這種單一的評價(jià)體系簡單、易實(shí)現(xiàn),但容易導(dǎo)致種子偏見和饑餓現(xiàn)象,使得部分高質(zhì)量的種子無法得到突變的機(jī)會去發(fā)揮應(yīng)有的價(jià)值.AFL,AFLFAST試圖使用線性權(quán)重法[31]計(jì)算多維度目標(biāo)的加權(quán)和,并以此作為評價(jià)標(biāo)準(zhǔn).但由于線性權(quán)重算法中使用的權(quán)重值很大程度依賴于個(gè)人經(jīng)驗(yàn),而沒有統(tǒng)計(jì)數(shù)據(jù)支撐,也帶來了經(jīng)驗(yàn)主義的問題.
能量分配策略決定了程序測試時(shí)對種子的時(shí)間資源分配.AFL最初將更多的能量分配給規(guī)模較小的執(zhí)行時(shí)間較短的種子.AFLFAST基于梯度下降算法將能量更多地分配給執(zhí)行低頻路徑的種子.如何合理地評估并量化種子的質(zhì)量,分配相應(yīng)的能量,是研究者持續(xù)探索的問題.
2) 種子變異問題.
測試用例的質(zhì)量會直接影響程序測試的效果.因而各模糊器都致力于提高有效的測試用例的生成比例,即盡可能生成既符合程序語法和語義要求,同時(shí)能探查到程序漏洞的測試用例.然而,由于突變空間過大,且缺乏有效的突變方向指導(dǎo),如何對種子進(jìn)行變異一直都是CGF的難點(diǎn),也進(jìn)一步導(dǎo)致當(dāng)前的CGF方法具有“難以發(fā)現(xiàn)特定輸入才能觸發(fā)的漏洞”“難以發(fā)現(xiàn)多個(gè)條件同時(shí)滿足才能觸發(fā)的漏洞”等問題.
具體來說,突變只有發(fā)生在種子的關(guān)鍵位置才會影響程序執(zhí)行的控制流.同時(shí),突變生成的測試用例的選擇也很重要,首選可以增加新的路徑執(zhí)行測試用例.為了生成更合法有效的測試用例,需要使用程序反饋信息確定種子突變的位置、突變的值,從而確定測試用例突變的方向,縮小突變空間的范圍.但由于CGF只使用輕量級的程序分析工具,因此獲取的覆蓋信息不足以準(zhǔn)確定位突變位置和突變值.如何獲取更多的覆蓋反饋信息去指導(dǎo)變異和如何提高現(xiàn)有反饋信息的利用率去縮小突變空間都有待更有效的辦法去解決.
隨著移動互聯(lián)網(wǎng)的高速發(fā)展,越來越多的應(yīng)用程序和庫需要處理高度結(jié)構(gòu)化的輸入,如圖像、音頻、視頻、數(shù)據(jù)庫、文檔或電子表格文件.應(yīng)用程序在執(zhí)行之前通常會對輸入進(jìn)行語法和語義分析.其中:語法分析將原始輸入解析為程序內(nèi)部數(shù)據(jù)結(jié)構(gòu);語義分析對該數(shù)據(jù)結(jié)構(gòu)進(jìn)行檢查并執(zhí)行程序的核心邏輯[32].由于CGF缺乏輸入結(jié)構(gòu)感知,變異操作都是在種子文件的位級上進(jìn)行的.而位級變異不太可能改變文件結(jié)構(gòu),使得大多數(shù)生成的測試用例在程序執(zhí)行的早期階段就被語法與語義檢查攔截,無法有效執(zhí)行到程序的深層次代碼.如何在變異階段對文件結(jié)構(gòu)進(jìn)行突變,探索到程序的合法輸入格式,從而生成有效的高度結(jié)構(gòu)化輸入,同樣值得思考.
遠(yuǎn)程監(jiān)控系統(tǒng)具體指的所有地方的設(shè)備通過一個(gè)電腦終端即可進(jìn)行控制的技術(shù)。在電氣工程當(dāng)中通過此種設(shè)計(jì)方案不但可以使安裝及材料等成本得到節(jié)省,也能夠大大縮減電纜的數(shù)量,形成很高的穩(wěn)定性和組態(tài)靈活性,同時(shí)達(dá)到了生產(chǎn)規(guī)模的高效益??墒且?yàn)殡姎夤こ坍?dāng)中通訊量很大,同時(shí)現(xiàn)場總線在通訊速度上還達(dá)不到要求,在一些信號較差的區(qū)域會造成這種遠(yuǎn)程監(jiān)控方式起不到實(shí)際作用,無法開展,因此遠(yuǎn)程監(jiān)控方式的理念只可用到比較小的電氣工程中,不適合整個(gè)電氣自動化控制系統(tǒng)。
2.1.2 程序測試階段的挑戰(zhàn)
1) 代碼覆蓋率增長瓶頸問題.
CGF將程序的漏洞挖掘問題轉(zhuǎn)換為一個(gè)優(yōu)化問題,即如何在有限的時(shí)間內(nèi),覆蓋盡可能多的程序代碼.利用代碼覆蓋率作為漏洞數(shù)量的替代指標(biāo)[33],程序覆蓋率越高也就意味著發(fā)現(xiàn)漏洞的可能性越大.然而,眾多實(shí)踐表明大多數(shù)測試用例只重復(fù)覆蓋相同的部分路徑,而不會發(fā)散性地覆蓋更多的路徑[9].如何改變這種情況,提高程序的總體覆蓋率是CGF發(fā)展的挑戰(zhàn)與動力[34].
同時(shí),程序校驗(yàn)也是代碼覆蓋率增長瓶頸的一個(gè)原因.魔術(shù)數(shù)字、魔術(shù)字符串、版本號檢查和校驗(yàn)是程序中常用的校驗(yàn)方式,而大量的測試用例被這些程序校驗(yàn)攔截,難以執(zhí)行到深層代碼.
2) 覆蓋率信息獲取受限問題.
程序分析工具跟蹤測試用例在插樁程序中的執(zhí)行狀態(tài),基于收集到的程序反饋信息判斷測試用例的質(zhì)量,決定是否將其加入種子隊(duì)列.因此,反饋信息的全面性和準(zhǔn)確性對于高質(zhì)量種子的選擇非常重要.然而,由于只使用輕量級程序分析工具,CGF無法獲取測試用例執(zhí)行路徑的上下文信息[35].上下文信息對于種子質(zhì)量判斷非常有效.例如,如果測試用例執(zhí)行路徑的鄰近代碼都被其他的輸入覆蓋過,那么由該測試用例變異生成的輸入執(zhí)行到新的路徑的可能性就會很低.那么,該測試用例就不適合作為種子保存.由于種子質(zhì)量直接關(guān)系著程序測試的效果,所以如何獲取更詳細(xì)的覆蓋信息,如上下文信息,來正確地選擇高質(zhì)量的種子成為一個(gè)急需解決的問題.
3) 程序分析技術(shù)的性能問題.
目前,CGF通常通過高成本的白盒分析技術(shù)收集反饋信息,如符號執(zhí)行技術(shù).由于每個(gè)測試用例都能在程序中執(zhí)行不同的路徑,所以符號執(zhí)行非常有效.然而,這種有效性是以大量時(shí)間開銷和內(nèi)存開銷為代價(jià)的,高開銷使得模糊測試在可擴(kuò)展性方面受到嚴(yán)重限制.
保證CGF的簡單性、高速性、可靠性、可擴(kuò)展性是程序分析技術(shù)集成的前提.重量級分析技術(shù)的集成帶來的效果提升不足以抵消性能急劇下降帶來的弊端.例如,檢測工具發(fā)現(xiàn)漏洞的可能性提高了10倍,但運(yùn)行速度卻降低了99%,集成了程序分析技術(shù)的智能模式還是不如盲目的隨機(jī)模式有效.
隨著應(yīng)用程序在人們生活中的使用范圍越來越廣泛,其所承受的安全威脅也日趨多元化、復(fù)雜化,并因不同的使用場景而呈現(xiàn)不同的威脅特點(diǎn).例如,高速發(fā)展的物聯(lián)網(wǎng)設(shè)備開始在人們生活中充當(dāng)重要的角色,按照如今的增長幅度,到2030年,物聯(lián)網(wǎng)設(shè)備數(shù)量將比人類數(shù)量還多[36],如此龐大的攻擊范圍使得物聯(lián)網(wǎng)對安全漏洞檢測工具有了前所未有的需求.然而,盡管CGF對于通用平臺上的程序漏洞檢測很有效,但由于物聯(lián)網(wǎng)設(shè)備對實(shí)際硬件配置的強(qiáng)依賴性,所以通常不可能直接在物聯(lián)網(wǎng)設(shè)備上應(yīng)用模糊測試.為了應(yīng)對平臺兼容性問題,Zaddach等人[37]試圖使用硬件和軟件仿真相結(jié)合的解決方案,Chen等人[38]試圖利用完整的系統(tǒng)仿真技術(shù),但其性能也遠(yuǎn)遠(yuǎn)不夠理想[23].
將CGF應(yīng)用到通信協(xié)議漏洞檢測上時(shí),也面臨著覆蓋率不高、漏洞挖掘效果差的問題.通信協(xié)議通常由服務(wù)器/客戶端上的狀態(tài)機(jī)來實(shí)現(xiàn),狀態(tài)轉(zhuǎn)換由包/消息交換等關(guān)鍵協(xié)議事件驅(qū)動.目前主要使用代理對數(shù)據(jù)包進(jìn)行突變和測試[39],但由于缺乏狀態(tài)感知,CGF無法引導(dǎo)協(xié)議進(jìn)入感興趣的狀態(tài),并重復(fù)使用數(shù)據(jù)包輸入對其進(jìn)行測試.此外,在協(xié)議中,多端之間的多包通信,既包括非依賴包/字段的消息傳遞,也包括依賴包/字段的消息傳遞.目前CGF使用的單包測試無法有效實(shí)現(xiàn)非依賴包之間的代碼覆蓋,而使用多包測試又可能導(dǎo)致不一致的消息傳遞.應(yīng)用于通信協(xié)議的CGF必須面對這些挑戰(zhàn)并提出解決辦法[40].
為了應(yīng)對CGF面臨的挑戰(zhàn),研究者試圖通過集成其他技術(shù)的長處來彌補(bǔ)CGF的缺陷,從而更精確地收集程序控制流和數(shù)據(jù)流信息,利用收集到的信息生成更具針對性的輸入,以更好地指導(dǎo)程序執(zhí)行階段的路徑探索.目前,符號執(zhí)行和污點(diǎn)分析是使用較廣泛的技術(shù),隨著機(jī)器學(xué)習(xí)技術(shù)的成熟,機(jī)器學(xué)習(xí)在CGF中的應(yīng)用也越來越多.
3.1.1 符號執(zhí)行
靜態(tài)分析是指不執(zhí)行程序的狀態(tài)下,利用詞法分析、語法分析、控制流等技術(shù)對代碼進(jìn)行掃描,并對其程序行為進(jìn)行分析的技術(shù).根據(jù)分析目標(biāo)可分為源代碼分析和二進(jìn)制分析.近年來靜態(tài)分析向模擬執(zhí)行技術(shù)發(fā)展,通過符號執(zhí)行、抽象解釋等技術(shù)可以發(fā)現(xiàn)很多傳統(tǒng)意義上動態(tài)測試才能發(fā)現(xiàn)的缺陷,如未對參數(shù)進(jìn)行邊界檢查而造成的緩沖區(qū)溢出、堆溢出等漏洞[41].
靜態(tài)分析容易集成到開發(fā)環(huán)境中,自動化程度較高.早期靜態(tài)分析中的符號執(zhí)行技術(shù)被廣泛應(yīng)用于模糊測試中,一些灰盒或白盒模糊器利用符號執(zhí)行提高測試覆蓋率,如EFFIGY[42],Prefix[43],Prefast,ARCHER[44]等.
符號執(zhí)行的概念由Boyer等人[45]提出,其主要思想是使用符號變量代替具體數(shù)值作為程序輸入,在模擬程序執(zhí)行過程中收集與輸入符號變量相關(guān)的路徑約束條件,計(jì)算符號變量的具體值,生成能夠引導(dǎo)程序執(zhí)行該路徑的測試數(shù)據(jù).
但由于缺乏程序運(yùn)行時(shí)信息,符號執(zhí)行難以完全模擬程序執(zhí)行,使得分析不夠精確.為解決該問題,研究人員提出了混合符號執(zhí)行的概念,將符號執(zhí)行從靜態(tài)分析技術(shù)轉(zhuǎn)變?yōu)閯討B(tài)分析技術(shù).其核心思想是在程序真實(shí)運(yùn)行過程中,判斷哪些代碼需要符號化執(zhí)行,哪些代碼可直接執(zhí)行,代表性的工具有EXE[46],CUTE[47],DART[48],SymFuzz[49]等.符號執(zhí)行可能帶來狀態(tài)爆炸的問題,由此也發(fā)展出了動態(tài)符號執(zhí)行的概念.動態(tài)符號執(zhí)行是將路徑限制在一個(gè)具體的路徑上,程序只能觸發(fā)該路徑下的bug或者發(fā)現(xiàn)一個(gè)新的路徑,以減少正在研究的狀態(tài)數(shù)量,并用具體數(shù)值替換復(fù)雜表達(dá)式,降低程序復(fù)雜度[50].
3.1.2 污點(diǎn)分析
污點(diǎn)分析技術(shù)是信息流分析技術(shù)的一種,它將系統(tǒng)或應(yīng)用程序中的數(shù)據(jù)標(biāo)記為污點(diǎn)或非污點(diǎn),如果污點(diǎn)數(shù)據(jù)在傳播時(shí)影響到非污點(diǎn)數(shù)據(jù),則該非污點(diǎn)數(shù)據(jù)被標(biāo)記修改為污點(diǎn).若污點(diǎn)標(biāo)簽隨數(shù)據(jù)傳播到指定存儲區(qū)域或信息泄露點(diǎn),則認(rèn)為該系統(tǒng)違反了信息流策略.污點(diǎn)分析也可以分為靜態(tài)污點(diǎn)分析和動態(tài)污點(diǎn)分析[51].
靜態(tài)污點(diǎn)分析是指在不運(yùn)行程序的情況下,通過詞法、語法分析等方法分析變量間數(shù)據(jù)和控制依賴關(guān)系,如賦值、函數(shù)調(diào)用、別名等;動態(tài)污點(diǎn)分析旨在程序運(yùn)行過程中,跟蹤并記錄變量、寄存器等值,通常采用插樁的方法,在不破壞原有程序邏輯的基礎(chǔ)上插入采集信息的代碼,從而獲得程序運(yùn)行的相關(guān)信息.污點(diǎn)分析技術(shù)首先對污染源進(jìn)行定位,然后監(jiān)測污染數(shù)據(jù)在軟件中的傳播,最后根據(jù)污點(diǎn)匯聚點(diǎn)獲取關(guān)鍵信息[52].靜態(tài)分析考慮了程序所有可能的執(zhí)行路徑,但不運(yùn)行無法分析準(zhǔn)確的漏洞點(diǎn);動態(tài)分析則可以獲得程序運(yùn)行中的具體信息,分析精度較高,但頻繁的插樁和影子內(nèi)存會占用大量系統(tǒng)資源[53],并且只能分析執(zhí)行到的路徑,存在一定的誤報(bào).所以有研究者將二者進(jìn)行了結(jié)合,先執(zhí)行靜態(tài)污點(diǎn)分析獲得初步信息,提高路徑覆蓋率,然后執(zhí)行動態(tài)污點(diǎn)分析獲得漏洞的具體信息,提高精度[54].
由于很多軟件的源代碼無法獲取,所以動態(tài)污點(diǎn)分析經(jīng)常被運(yùn)用.模糊測試的核心思想是生成大量測試用例保證較高的代碼覆蓋率從而對程序進(jìn)行檢測,污點(diǎn)分析的引入使模糊測試可以更好地理解漏洞點(diǎn).此外,動態(tài)污點(diǎn)分析與符號執(zhí)行相結(jié)合,更好地提升了具有校驗(yàn)機(jī)制的程序進(jìn)行模糊測試的效率.
3.1.3 機(jī)器學(xué)習(xí)
機(jī)器學(xué)習(xí)旨在模擬人類的學(xué)習(xí)活動,從對數(shù)據(jù)的自動分析中獲得規(guī)律,并利用規(guī)律對未知數(shù)據(jù)進(jìn)行預(yù)測.因?yàn)闄C(jī)器學(xué)習(xí)算法中涉及了大量的統(tǒng)計(jì)學(xué)理論,機(jī)器學(xué)習(xí)與推斷統(tǒng)計(jì)學(xué)聯(lián)系尤為密切,也被稱為統(tǒng)計(jì)學(xué)習(xí)理論.機(jī)器學(xué)習(xí)算法包括分類算法、聚類算法、回歸算法等.
模糊測試隨機(jī)初始種子集通常很難達(dá)到很好的效果,這是由于:種子生成是隨機(jī)的,沒有較好的指向性;測試失敗時(shí)不能總結(jié)規(guī)律,從而導(dǎo)致大量重復(fù);種子文件較高的代碼重復(fù)率使得無法測試深度漏洞.引進(jìn)機(jī)器學(xué)習(xí)可以很好地解決這類問題.例如,Wang等人[55]利用深度學(xué)習(xí)網(wǎng)絡(luò),將惡意html樣本的文件結(jié)構(gòu)作為訓(xùn)練集,訓(xùn)練深度學(xué)習(xí)模型,生成帶有部分針對瀏覽器漏洞的惡意代碼,產(chǎn)生更有針對性的種子文件.
3.2.1 輸入生成階段改進(jìn)
輸入生成階段又可分為種子調(diào)度階段和突變階段.
在種子調(diào)度階段:Vuzzer[11]利用程序感知的模糊策略,通過在程序測試期間對程序進(jìn)行輕量級靜態(tài)和動態(tài)分析推斷控制流特性,使得Vuzzer[11]可優(yōu)先選擇執(zhí)行深度路徑的種子進(jìn)行突變.CollAFL應(yīng)用3種不同的策略優(yōu)先選擇具有更多未覆蓋的相鄰分支或后代的種子.Cerebro[35]使用了一個(gè)在線多目標(biāo)算法,通過平衡代碼復(fù)雜度、代碼覆蓋率、執(zhí)行時(shí)間等指標(biāo)選擇種子.同時(shí)引入輸入潛力概念分配種子能量,即通過預(yù)測種子對未覆蓋代碼的覆蓋潛力而不是對已覆蓋的執(zhí)行跟蹤來評估輸入.FuzzFactory[56]將提高代碼覆蓋率的輸入放入種子隊(duì)列,同時(shí)將特定域相關(guān)的中間輸入放入種子隊(duì)列,從而提高特定域的模糊測試覆蓋率.
在突變階段:Hybrid-Fuzz[56]利用符號執(zhí)行收集關(guān)注的程序路徑上的約束條件,使用約束求解生成能實(shí)際覆蓋該路徑的測試輸入,以達(dá)到檢測測試程序特定代碼點(diǎn)的功能;Skyfire[55]應(yīng)用數(shù)據(jù)驅(qū)動種子生成策略,以語料庫和語法作為輸入,學(xué)習(xí)概率上下文敏感語法(PCSG),以指定語法特征和語義規(guī)則,然后利用學(xué)習(xí)過的PCSG生成種子輸入;AFLFast將CGF建模為馬爾可夫鏈,指定從執(zhí)行路徑i的種子突變生成能探索到路徑j(luò)的測試用例的概率pij,并根據(jù)概率指定分配相應(yīng)的程序執(zhí)行時(shí)間;AFLsmart[32]針對需要處理復(fù)雜文件格式的應(yīng)用程序,利用種子文件的高級結(jié)構(gòu)來生成新文件.將變異的粒度由位級變更到文件級,從而在保持文件有效性的同時(shí)探索全新的輸入域;Neuzz[33]應(yīng)用了一種新的程序平滑技術(shù),該技術(shù)使用代理神經(jīng)網(wǎng)絡(luò)模型,可以增量地學(xué)習(xí)一個(gè)復(fù)雜的、真實(shí)世界的程序的分支行為的平滑近似,這種神經(jīng)網(wǎng)絡(luò)模型可以與梯度導(dǎo)向的輸入生成方案一起使用,生成能探索到新路徑的輸入;Zest[57]通過參數(shù)生成器將輸入從簡單的參數(shù)域轉(zhuǎn)換為更結(jié)構(gòu)化的域,如語法有效的XML,從而使參數(shù)級突變能夠映射到測試輸入中的結(jié)構(gòu)突變,生成語義有效的輸入;Superion[58]基于語法感知覆蓋的灰盒模糊方法處理結(jié)構(gòu)化輸入.將每個(gè)測試輸入解析為一個(gè)抽象的語法樹,進(jìn)而引入一種語法感知的調(diào)整策略,在保持輸入結(jié)構(gòu)有效性的同時(shí)調(diào)整測試輸入;Choi等人[59]利用動態(tài)符號執(zhí)行最大限制地將灰盒變白,生成能滿足分支條件的測試用例;SLF[60]利用AFL來識別輸入有效性校驗(yàn)以及對此類檢查有影響的輸入字段,然后根據(jù)這些校驗(yàn)與輸入的關(guān)系對輸入進(jìn)行分類,包括算術(shù)關(guān)系、對象偏移量、數(shù)據(jù)結(jié)構(gòu)長度等,提出多目標(biāo)搜索算法以應(yīng)用特定類別的變異.
3.2.2 程序測試階段改進(jìn)
在程序測試階段,CGF會持續(xù)跟蹤輸入在測試程序中的執(zhí)行狀態(tài),提取相關(guān)的反饋信息,指導(dǎo)如何探索新的路徑,并挑選出有價(jià)值的高質(zhì)量種子放入種子隊(duì)列.研究者們針對該階段覆蓋率信息獲取的準(zhǔn)確性、全面性挑戰(zhàn)和覆蓋率增加的挑戰(zhàn)做了大量工作,其中,性能開銷的降低是伴隨著覆蓋率信息獲取或覆蓋率增加的過程而實(shí)現(xiàn)的.
在覆蓋率信息獲取問題上,CollAFL[13]分析了AFL代碼覆蓋率計(jì)算存在的哈希碰撞問題,并提出了新的哈希算法以提高覆蓋率信息的準(zhǔn)確度.Intel處理器提供Intel PT(Intel processor trace)完成觸發(fā)和過濾功能,實(shí)時(shí)地跟蹤執(zhí)行過程,獲取更準(zhǔn)確的覆蓋信息[61].Intel PT具有執(zhí)行速度快、無源依賴等優(yōu)點(diǎn)[30].Nagy等人[62]基于大多數(shù)測試用例都是無效輸入的觀點(diǎn),提出將覆蓋率信息用于指導(dǎo)跟蹤的方法,只跟蹤增加代碼覆蓋率的測試用例,從而獲得更快的速度.
為了突破覆蓋率增長瓶頸,很多研究者都試圖在突破程序約束及路徑檢查工作上作改進(jìn).符號執(zhí)行具有天然的優(yōu)勢,可識別執(zhí)行過程中的阻塞點(diǎn),幫助模糊器通過程序控制流程中復(fù)雜的條件判斷.例如:Driller[63]利用動態(tài)符號執(zhí)行生成滿足特定條件要求的值,繞過條件判斷,從而找到更深層次的漏洞,且為了降低性能開銷,只有CGF在一定時(shí)間內(nèi)無法取得任何進(jìn)展時(shí),才會啟動動態(tài)符號執(zhí)行;Wang等人[64]提出了一種“最佳轉(zhuǎn)換”策略,分別通過模糊測試和約束執(zhí)行來量化探索每條路徑的成本,并選擇更經(jīng)濟(jì)的方法探索該路徑;Zhao等人[65]提出“區(qū)分派遣”策略,基于蒙特卡洛的概率路徑優(yōu)先級模型量化每條路徑的難度并排列優(yōu)先級,將動態(tài)符號執(zhí)行傾斜于最困難的路徑計(jì)算,從而緩解路徑爆炸問題,增加模糊測試效果.
T-Fuzz[14]刪除了代碼探測路徑上的完整性檢查,使用符號執(zhí)行檢測刪除操作所導(dǎo)致的誤報(bào)問題;Pak[66]提出“區(qū)別調(diào)度”策略,通過量化探索每條路徑的成本,對路徑進(jìn)行優(yōu)先級排序,使用協(xié)同執(zhí)行計(jì)算優(yōu)先級最高的路徑,從而避免了路徑爆炸問題,更經(jīng)濟(jì)有效地完成對路徑的探索.REDQUEEN[50]基于部分輸入直接對應(yīng)于運(yùn)行時(shí)的內(nèi)存和寄存器這一觀察,通過跟蹤程序比較指令中的使用值,創(chuàng)建輕量級的近似污染跟蹤,使用快速模糊過程驗(yàn)證是否觸發(fā)了新的和潛在的行為.
為了應(yīng)對物聯(lián)網(wǎng)設(shè)備的兼容性及性能問題,F(xiàn)IRM-AFL[67]在系統(tǒng)模擬器中模擬的posix兼容固件上應(yīng)用CGF來解決兼容性問題,并使用一種稱為增強(qiáng)流程仿真(augmented process emulation)的新技術(shù)將系統(tǒng)模式仿真和用戶模式仿真結(jié)合起來,兼具了系統(tǒng)模式仿真的高兼容性和用戶模式仿真的高吞吐量,從而突破系統(tǒng)模式仿真所導(dǎo)致的性能瓶頸.
Chen等人[68]提出了針對通信協(xié)議的有狀態(tài)協(xié)議模糊策略,探索與不同協(xié)議狀態(tài)相關(guān)的代碼,從而實(shí)現(xiàn)更高的代碼覆蓋率.具體來說,該狀態(tài)模糊器在測試程序執(zhí)行時(shí)創(chuàng)建多個(gè)狀態(tài),并識別用于不同狀態(tài)的包和字段,根據(jù)動態(tài)執(zhí)行的模糊效果,選擇合適的時(shí)間復(fù)制協(xié)議狀態(tài)、前進(jìn)到下一個(gè)協(xié)議狀態(tài)或回滾到前一個(gè)協(xié)議狀態(tài),多次重復(fù)從而確定最高代碼覆蓋率的最佳點(diǎn),實(shí)現(xiàn)最大的代碼覆蓋率和代碼執(zhí)行深度.
模糊測試在挖掘真實(shí)軟件中的安全漏洞方面取得的巨大成功極大促進(jìn)了研究者的研究熱情.近年來,越來越多的模糊測試策略和算法相繼被提出.每當(dāng)一種新的模糊算法被提出時(shí),必須在實(shí)驗(yàn)上證明它優(yōu)于現(xiàn)階段的模糊算法.
目前,對于模糊器的實(shí)驗(yàn)評估,主流方法是:首先,選擇一個(gè)現(xiàn)階段先進(jìn)且性能令人信服的模糊器作為比較對象,近年來,將AFL作為比較對象是眾多研究的選擇.其次,選擇1組用于測試模糊器效果的測試程序.測試程序主要分為實(shí)際可用的程序,如:谷歌模糊測試組件、readelf、nm、objdump等開源程序;人工構(gòu)造的程序,如CGC,LAVA-M數(shù)據(jù)集,這些數(shù)據(jù)集都被人工注入了漏洞,以測試模糊器挖掘漏洞的能力.在相同的運(yùn)行環(huán)境下比較需要評估的模糊器和作為比較對象的模糊器在尋找漏洞方面的效率和效果.通常情況下,將找到漏洞的速度、找到新的CVE漏洞數(shù)量、程序代碼的覆蓋率作為評估標(biāo)準(zhǔn),以證明模糊器的真實(shí)有效性.
Klees等人[69]對2012—2018年發(fā)表的32篇模糊測試論文的實(shí)驗(yàn)評估部分進(jìn)行了重新評估,其結(jié)果表明,沒有一個(gè)模糊測試的評估實(shí)驗(yàn)?zāi)苷_執(zhí)行所有符合規(guī)范的評估流程和評估標(biāo)準(zhǔn).而評估流程和評估標(biāo)準(zhǔn)的差異性確實(shí)可以轉(zhuǎn)化為有誤導(dǎo)性或不正確的評估結(jié)果.根據(jù)Klees等人[69]的工作結(jié)果,繼續(xù)對2018—2019年所發(fā)表的模糊器論文的實(shí)驗(yàn)評估作統(tǒng)計(jì)調(diào)查,結(jié)果如表1所示:
表1 模糊器實(shí)驗(yàn)評估數(shù)據(jù)總結(jié)
測試對象:R表示實(shí)際程序,C表示CGC數(shù)據(jù)集,L表示LAVA-M基準(zhǔn),G表示谷歌fuzzer測試套件.
性能方差:不同輪數(shù)的模糊測試的性能差異方差.A表示置信區(qū)間.
崩潰分類:S表示用堆棧哈希對相關(guān)崩潰進(jìn)行分組,O表示用其他工具/方法分類,B表示用覆蓋率信息對崩潰分類,F(xiàn)表示用現(xiàn)實(shí)依據(jù)進(jìn)行崩潰分類.
覆蓋率指標(biāo):L表示行/指令/基本塊覆蓋,M表示方法覆蓋,E表示控制流邊或分支覆蓋,Z表示其他覆蓋信息.
種子:H表示隨機(jī)取樣種子,M表示手工構(gòu)建種子,T表示自動生成種子,N表示未預(yù)設(shè)有效性的非空種子,V表示預(yù)設(shè)有效的種子,但不清楚該種子的獲取途徑,Y表示空種子,/表示在不同的程序用了不同的種子.
盡管研究者都盡量設(shè)置了客觀有效的實(shí)驗(yàn)以增加結(jié)果的可信度,但由于缺乏統(tǒng)一的評估流程、評估指標(biāo),還是難以在現(xiàn)實(shí)中用統(tǒng)一維度證明這些模糊器的進(jìn)步性.主要問題分析如下:
1) 參考對象選擇不統(tǒng)一.盡管大部分研究都選擇將AFL作為比較對象,但仍有一些選擇了其他參考對象,如REDQUEEN[50].且近年來眾多模糊器都是在AFL的基礎(chǔ)上進(jìn)行改進(jìn),一些研究會傾向于選擇與更先進(jìn)的模糊器進(jìn)行比較,以證明取得的進(jìn)步.由于參考對象選擇范圍的廣闊性,充當(dāng)參考對象的模糊器在各評估指標(biāo)上表現(xiàn)的差異性,客觀的參考標(biāo)準(zhǔn)難以確定.
2) 測試程序選擇不統(tǒng)一.通常情況下,模糊算法的進(jìn)步性在測試程序上得到驗(yàn)證后,希望其性能優(yōu)越性能在現(xiàn)實(shí)生活中的大部分程序中體現(xiàn)出來.即模糊器在測試程序上的良好性能能轉(zhuǎn)化為總體上的良好性能,這就要求測試程序具有一定的代表性.目前沒有代表性的測試基準(zhǔn)能滿足這些要求,因此不同的模糊器往往會自主選擇測試程序.部分研究會傾向于選擇模糊器表現(xiàn)優(yōu)異的程序進(jìn)行測試,這使得客觀評判模糊器在現(xiàn)實(shí)運(yùn)用中的真實(shí)性能更加困難.
3) 測試時(shí)間設(shè)置不統(tǒng)一.目前模糊器的超時(shí)時(shí)間設(shè)置通常從1 h到幾天或幾周不等,常見的選擇是24 h,5 h,6 h.大多數(shù)研究都沒有給出合理的超時(shí)報(bào)告.然而,算法之間的相對性能會隨著時(shí)間的變化而變化,較短的運(yùn)行時(shí)間可能會造成誤導(dǎo),產(chǎn)生不完整的結(jié)果.
4) 測試輪數(shù)選擇不統(tǒng)一.由于模糊測試本身的隨機(jī)性,對測試程序的每次模糊測試都可能產(chǎn)生不同的結(jié)果.所以,僅僅進(jìn)行1輪測試就比較它們的性能是不夠的.
5) 初始種子的選擇不統(tǒng)一.不同的初始種子會造成差異化的測試結(jié)果.然而,大多數(shù)研究對種子的選擇很隨意,顯然認(rèn)為任何種子都同樣有效,且沒有提供細(xì)節(jié).
6) 評估標(biāo)準(zhǔn)不統(tǒng)一.目前,直接評估模糊器所挖掘的漏洞數(shù)量是主流方法.然而,也有部分研究使用代碼覆蓋率或程序崩潰的去重輸入數(shù)量評估模糊器的性能改進(jìn).
如表1所示,沒有研究完全遵循評估準(zhǔn)則,因此對CGF的評估流程提出了如下建議:
1) 所有測試應(yīng)該持續(xù)至少10輪,且統(tǒng)計(jì)其總體方差,用統(tǒng)計(jì)學(xué)相關(guān)知識正確評估模糊測試算法性能,防止隨機(jī)性.
2) 每輪測試應(yīng)該維持足夠長的時(shí)間,并繪制發(fā)現(xiàn)bug數(shù)量隨時(shí)間變化曲線,對比不同模糊測試算法性能.
CGF作為目前流行且發(fā)展?jié)摿薮蟮穆┒赐诰蚬ぞ咧?,其未來的發(fā)展前景是值得期待的.本節(jié)大膽猜想了未來可能的發(fā)展方向,以供參考.
通用的CGF技術(shù)已經(jīng)成熟,并且在程序的初期漏洞檢測中取得了較大的成功.然而,隨著CGF所應(yīng)用的領(lǐng)域越來越廣,測試程序的輸入格式越來越復(fù)雜和多樣化,針對具體應(yīng)用場景實(shí)行專業(yè)化的智能指導(dǎo)型CGF有待進(jìn)一步發(fā)展.結(jié)合相關(guān)應(yīng)用場景的理解和特征分析,CGF能對模糊過程實(shí)現(xiàn)更精確的控制,更快更準(zhǔn)確地挖掘程序中的深度漏洞.目前,傳統(tǒng)的靜態(tài)和動態(tài)分析對CGF的性能提升已經(jīng)發(fā)展到了瓶頸期,更輕量級的替代技術(shù)或模糊策略還在持續(xù)提出.同時(shí),隨著機(jī)器學(xué)習(xí)的發(fā)展,機(jī)器學(xué)習(xí)技術(shù)也將在與CGF的結(jié)合中發(fā)揮更重要的作用.
如第4節(jié)所述,不統(tǒng)一的評估流程、不同的測試程序和評估指標(biāo)都會給評估結(jié)果帶來誤差或錯誤.這些誤差或錯誤不僅給模糊器間的性能比較帶來困難,同時(shí)也可能誤導(dǎo)相關(guān)研究者相信誤差后的性能效果,從而投入更深的研究中,造成研究人力的浪費(fèi).因此,建立一套統(tǒng)一的、可靠的模糊測試評估系統(tǒng)是有強(qiáng)烈現(xiàn)實(shí)需求的.評估系統(tǒng)可通過包含足夠數(shù)量、各種大小的程序來體現(xiàn)現(xiàn)實(shí)程序的多樣性,同時(shí)設(shè)置統(tǒng)一的評估指標(biāo)對不同的模糊器進(jìn)行同維度的比較.
目前,模糊測試技術(shù)的主要創(chuàng)新研究集中在如何更有效地挖掘漏洞上,對于模糊測試實(shí)際應(yīng)用中的可解釋性和量化性的研究還遠(yuǎn)遠(yuǎn)不夠.例如:經(jīng)過模糊測試后,程序的安全性究竟能得到多大程度的保證;如何有效地評估停止模糊測試后的剩余風(fēng)險(xiǎn),即攻擊者找到模糊測試沒有找到的漏洞的風(fēng)險(xiǎn);如何判斷停止模糊測試的合理時(shí)間.目前,上述判斷都依賴于研究者的個(gè)人經(jīng)驗(yàn),而不能根據(jù)測試過程中觀察到的程序行為進(jìn)行統(tǒng)計(jì)上有根據(jù)的推斷.因此為未發(fā)現(xiàn)的漏洞設(shè)置合理的剩余風(fēng)險(xiǎn)閾值,并用可行的統(tǒng)計(jì)框架對剩余風(fēng)險(xiǎn)進(jìn)行量化是解釋和量化模糊測試的必要工作.B?hme[78]提出了一個(gè)總體框架,可作為解決這一挑戰(zhàn)的一個(gè)起點(diǎn),并討論了未來研究的具體機(jī)遇.
隨著分布式技術(shù)的不斷發(fā)展,當(dāng)前分布式技術(shù)已經(jīng)能夠?qū)Υ罅坑?jì)算單元進(jìn)行整合,完成大規(guī)模的問題求解任務(wù).如何變異出更多有效的測試用例,以及CGF在種子變異過程中產(chǎn)生的海量測試用例,一直都是制約CGF性能的關(guān)鍵因素.將分布式技術(shù)與CGF相結(jié)合,通過大量分布式計(jì)算機(jī)并行執(zhí)行模糊測試任務(wù),可以有效提高CGF在輸入生成階段和程序執(zhí)行階段的性能.