国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

模糊測試技術綜述

2021-06-04 00:21:42任澤眾張嘉元王文杰張玉清
計算機研究與發(fā)展 2021年5期
關鍵詞:覆蓋率漏洞程序

任澤眾 鄭 晗 張嘉元 王文杰 馮 濤 王 鶴 張玉清,,4

1(中國科學院大學國家計算機網絡入侵防范中心 北京 101408) 2(蘭州理工大學計算機與通信學院 蘭州 730050) 3(西安電子科技大學網絡與信息安全學院 西安 710071) 4(海南大學計算機與網絡空間安全學院 海口 570228)

“常用系統(tǒng)中可能會潛伏著嚴重的漏洞.”[1]這一論述源自于模糊測試首次面世的論文中,它揭示了一個事實,隱藏的漏洞無處不在.漏洞可以引發(fā)嚴重的危害,2011年披露的震網[2]蠕蟲病毒,利用軟件漏洞損壞了伊朗核設施的離心機.2017年發(fā)生的WannaCry勒索攻擊[3],通過利用漏洞,惡意加密了超過150個國家的至少23萬臺計算機中的文件,并以此進行勒索.2019年波音737MAX客機控制系統(tǒng)的漏洞被發(fā)現(xiàn)[4],在此之前,已經造成了2起墜機事件,導致346人死亡,這些事件凸顯著漏洞檢測技術的重要性.

模糊測試是漏洞檢測技術的一種,通過使用針對目標程序生成的隨機字符流,對目標程序進行多次測試,以檢測可能存在的漏洞[1].

目前模糊測試已經成為漏洞檢測的一種重要方法,在2019年Google Project Zero[5]的報告中,通過模糊測試發(fā)現(xiàn)的漏洞數(shù)目,比例高達37%.在安全界中,對于模糊測試技術的研究工作自始至終從未停止.

模糊測試相關的研究工作,一方面集中在提升模糊測試的漏洞檢測能力,另一方面集中在拓寬模糊測試的應用范圍.為了提升模糊測試的檢測能力,業(yè)界引入了諸如符號執(zhí)行、污點分析等程序分析技術,提升了模糊測試在覆蓋率等評估指標上的表現(xiàn),進而獲得了更好的漏洞檢測效果.Zhang等人[6]以及Wang等人[7]對該方向的定向檢測部分進行了很好的總結.為了拓寬模糊測試的應用范圍,模糊測試目前已被應用到了諸如物聯(lián)網、內核安全等領域中,并為滿足相應應用領域的特殊要求,誕生了不同的研究成果,具體將在第5節(jié)介紹.

目前,已有綜述文章[8-12]對模糊測試做了歸納和整理,但自2018年起,模糊測試技術開始快速發(fā)展,有必要重新梳理和總結該領域的研究工作.

通過檢索2010—2020年的網絡與系統(tǒng)安全國際四大頂級會議(IEEE S&P,USENIX Security,CCS,NDSS),在圖1中展示了模糊測試相關研究工作數(shù)量的逐年變化.可以看到,2018年以后的成果數(shù)量在急速地增加,因此基于這些文獻,分析與歸納模糊測試的研究現(xiàn)狀與方向有重要現(xiàn)實意義.

Fig. 1 The number of papers related to fuzzing published at famous security international conferences in the past ten years圖1 10年內在國際著名安全會議上發(fā)表的 與fuzzing相關的論文數(shù)量

我們的主要貢獻有4個方面:

1) 分析回顧了模糊測試的發(fā)展歷史,選取模糊測試研究的重要時間節(jié)點.這些時間節(jié)點中即包含模糊測試發(fā)展史上開創(chuàng)性的工作,比如首次將模糊測試思想應用到不同領域中,也包含了諸多意義重大的研究成果,比如AFL(American fuzzy lop)[13]的誕生.

2) 目前一些綜述文章提出了模糊測試的工作流程,但是并沒有以此作為文章的脈絡結構,讀者無法對模糊測試有一個整體工作流程的理解.對此,我們按照自己總結出的模糊測試基本工作流程,依次介紹每個環(huán)節(jié)的目的以及面臨的挑戰(zhàn),并結合相應的研究成果介紹與討論,從而使讀者可以對模糊測試的整體工作流程有充分了解.

3) 模糊測試在不同的應用場景下,有著自己獨特的使用需求.本文對于近年來不同領域的模糊測試研究進行了分析與整理,比如模糊測試在物聯(lián)網、內核安全等領域的應用,基本上囊括了可以使用模糊測試技術的各個領域,為各個領域的安全從業(yè)人員使用模糊測試提供了參考.

4) 近年來隨著反模糊測試、機器學習等相關領域的快速發(fā)展,給模糊測試技術領域帶來了新的挑戰(zhàn)和機遇.我們介紹了反模糊測試的思路,指出應該加強模糊測試平臺建設,分析了機器學習同模糊測試結合的困難,并指明了模糊測試的下一步研究方向.

1 模糊測試

1.1 模糊測試的發(fā)展歷程

為了給讀者一個直觀的印象,我們首先在圖2中展示了模糊測試的發(fā)展歷程,圖2中的所有時間節(jié)點都會在本文詳細介紹.如圖2中所示,模糊測試誕生于1988年[1],并在那時設計了一個被稱為Fuzz的工具,通過生成隨機連續(xù)字符串對以字符串為輸入的對象進行模糊測試,同時設計了一個名為ptyjig的工具,對輸入有特殊要求的目標進行模糊測試.這時的模糊測試,其主要目的是嘗試使用非常規(guī)的數(shù)據(jù)對目標的魯棒性進行檢測.

Fig. 2 The development of fuzzing圖2 模糊測試的發(fā)展歷程

在1988—2004年之間誕生的模糊測試方法大多是黑盒模糊測試,其中比較重要的有Protos[14]以及Peach[15].Protos[14]項目誕生于2001年,它將模糊測試首次應用到了網絡協(xié)議的測試中,也是模糊測試技術成為實用性工具的開始.2004年出現(xiàn)的Peach[15]是初期被應用在文件模糊測試的項目,之后歷經改進,時至2021年仍然在被使用.此外,Peach[15]可以由用戶手工定義用于生成輸入數(shù)據(jù)的數(shù)據(jù)模型,是基于語法生成輸入思想的早期應用.

在2007年,受益于動態(tài)符號執(zhí)行和測試數(shù)據(jù)生成技術的進步,誕生了Sage[16]模糊測試方法,該方法是使用符號執(zhí)行的白盒模糊測試方法.通過使用符號執(zhí)行技術,在程序運行過程中收集條件語句對輸入的約束,通過用約束求解器進行求解產生新的輸入.白盒模糊測試由于能夠對目標內部情況有足夠的了解,可以獲得高質量的輸入數(shù)據(jù),繞過目標的輸入檢查,獲得較高的覆蓋率和深層漏洞檢測效果.

2008年,為了對輸入數(shù)據(jù)高度結構化的目標進行模糊檢測,誕生了jsfunfuzz[17].該方法根據(jù)語法模型生成隨機的但語法正確的JavaScript代碼,這種基于語法生成輸入的思想,成為之后對輸入數(shù)據(jù)高度結構化目標進行模糊測試的重要指導思想.

在使用符號執(zhí)行的白盒模糊測試中,通常會受限于符號執(zhí)行自身的問題,比如資源消耗過多以及路徑爆炸等,導致模糊測試效率不高.白盒模糊測試因為需要充分了解目標內部信息,因此會消耗大量的資源,比如消耗時間去分析程序內部細節(jié),而且對于復雜的程序,得到詳細而全面的內部信息是不現(xiàn)實的.為了提高模糊測試效率,誕生了繼續(xù)改進白盒模糊測試和使用少量的目標內部信息進行模糊測試的2個方向.

沿著繼續(xù)改進白盒模糊測試的方向,在2009年出現(xiàn)了Vganesh[18].通過使用污點分析技術替代了開銷巨大的符號執(zhí)行技術.污點分析技術,可以將程序攻擊點中使用到的變量值,同輸入數(shù)據(jù)特定部分建立聯(lián)系,進而指導模糊測試的變異策略.該思想也被灰盒模糊測試借鑒使用.

使用少量目標內部信息進行模糊測試的思想帶來了灰盒模糊測試,該方向最重要的成果是在2013年出現(xiàn)的AFL[13]模糊測試工具.AFL[13]是一款以覆蓋率為導向的模糊測試工具,通過插樁的方法,采集輸入數(shù)據(jù)對應的邊覆蓋率,作為模糊測試種子選取的衡量指標.AFL[13]通過使用進化算法以及精心構造的突變策略,獲得了很好的模糊測試效果,發(fā)現(xiàn)了大量漏洞,也因此被研究人員所關注,在2013年至今誕生了大量衍生性工作,這些工作會在2.2.4節(jié)有詳細介紹.

我們列舉了模糊測試發(fā)展過程中比較重要的幾個時間點,期間誕生了開創(chuàng)性的或者影響深遠的工作,圖2中還預測了未來模糊測試可能取得突破的方向,依據(jù)是:程序分析技術是與模糊測試結合最為緊密的領域,因此下一個對模糊測試產生重大影響的時間節(jié)點很可能來自兩者的結合領域.另外,機器學習的強大威力在圖像和自然語言處理等領域大放異彩,機器學習技術與模糊測試的結合很可能在未來給模糊測試帶來性能上的巨大提升.

1.2 模糊測試基本工作流程

模糊測試的基本工作流程可以用來描述一個完整的模糊測試工作過程.如圖3所示,該流程可以劃分為5步:預處理(preprocessing)、輸入構造(input building)、輸入選擇(input selection)、評估(evaluation)、結果分析(post-fuzzing).其中第1和第5個環(huán)節(jié)屬于模糊測試開始前的準備工作和模糊測試結束后的收尾工作,實際測試環(huán)節(jié)是第2~4個環(huán)節(jié).

Fig. 3 Fuzzing basic working process圖3 模糊測試基本工作流程

按照工作流程,首先進入預處理環(huán)節(jié),該環(huán)節(jié)的工作是:搜集目標相關信息并制定模糊測試的策略,為監(jiān)控目標在測試中的運行狀態(tài)做必要的準備.通常依賴于插樁、符號執(zhí)行以及污點分析這類程序分析技術.

完成預處理后,在測試環(huán)節(jié)的工作包括:輸入構造、輸入選擇以及評估3個子環(huán)節(jié).

其中,輸入構造的工作是:首先獲取一定數(shù)量的種子,隨后確定種子的能量分配策略、種子的優(yōu)先級以及種子的突變策略,最后依據(jù)這些信息獲得大量的輸入數(shù)據(jù).

得到大量輸入數(shù)據(jù)后,可以考慮通過輸入選擇環(huán)節(jié),對數(shù)據(jù)進行篩選.其主要工作是:嘗試通過提前過濾掉無效的輸入數(shù)據(jù),以節(jié)省模糊測試的時間.從工作的目的來看,該環(huán)節(jié)適合使用機器學習技術,通過完成模式識別任務,在輸入被執(zhí)行前就提前判斷數(shù)據(jù)的有效性.

作為測試環(huán)節(jié)的最后一步,評估部分的主要工作是:設計合適的實驗,依照評估指標對模糊測試進行評估.合適的評估指標,可以給模糊測試帶去執(zhí)行結果的真實反饋,這是制定模糊測試執(zhí)行策略的重要依據(jù).同時,設計合適的實驗更能反映模糊測試方法的實際性能,增加可信度.一個合適的模糊測試實驗通常需要考慮:選擇合適的模糊測試方法用作對比、選擇合適的對象作為模糊測試的目標、選擇合適的重復測試次數(shù)以及測試使用的超時時間等.

模糊測試結束以后,由于獲得的結果無法被直接使用,還需要在結果分析環(huán)節(jié)進行處理.該環(huán)節(jié)的工作是:對獲得的測試結果進行去重、復現(xiàn)、分析以及威脅性評估等工作,最終確定是否發(fā)現(xiàn)了有價值的漏洞.

2 預處理

預處理環(huán)節(jié)的目的是搜集目標相關信息,比如目標的輸入數(shù)據(jù)格式、目標的內部結構,并為監(jiān)控測試中目標的狀態(tài)變化做必要的準備.該環(huán)節(jié)面臨的挑戰(zhàn)是:使用什么程序分析技術,以及模糊測試究竟需要對目標內部信息有多詳細的了解.

接下來會先介紹預處理階段經常使用的程序分析技術以及其優(yōu)缺點.之后會根據(jù)預處理階段對程序內部信息了解程度的不同,對模糊測試的類型進行劃分,并結合相應研究成果,對每一類模糊測試做介紹.

2.1 分析技術與獲取的信息

常用的程序分析技術包括:插樁、符號執(zhí)行以及污點分析.

1) 插樁

插樁技術通過向目標的代碼中合適的位置添加預設好的代碼,獲得程序的靜態(tài)或動態(tài)執(zhí)行信息.比如程序的抽象語法樹,覆蓋率以及函數(shù)內變量取值等.

常用的插樁技術分為動態(tài)插樁和靜態(tài)插樁2種.靜態(tài)插樁通常在源碼或者中間代碼的編譯過程中進行,常見的比如通過GCC編譯器在匯編語言上插樁,LLVM在生成的中間語言LLVM IR(low level virtual machine intermediate representation)上插樁.優(yōu)點是節(jié)省時間、速度快,缺點是依賴于程序源碼.動態(tài)插樁則是在運行的過程中對運行過的代碼進行插樁.比如利用QEMU[19]等模擬技術,進行動態(tài)插樁,可以獲得程序運行時的信息,缺點是資源的開銷大.插樁技術已經被應用到模糊測試中,比如AFL[13]中就有靜態(tài)插樁和動態(tài)插樁的2種模式,使得AFL[13]可以在源碼以及二進制代碼上進行模糊測試.

插樁技術的缺點是會帶來資源的開銷,比如在UnTracer[20]的論文中提到,相比于黑盒測試而言,以AFL為例的灰盒測試引入了將近1300%的開銷.

2) 符號執(zhí)行

符號執(zhí)行將程序行為的推理歸結為邏輯領域的推理[21],通過構建一個表示程序執(zhí)行的邏輯公式,可以同時推斷一個程序在不同輸入上的行為.該方法可以使模糊測試獲得較好的覆蓋率,并可以深入到程序深處,探尋可能存在漏洞的區(qū)域.

符號執(zhí)行可以分為靜態(tài)符號執(zhí)行以及動態(tài)符號執(zhí)行.靜態(tài)符號執(zhí)行通常會因為程序中循環(huán)和遞歸的存在,陷入到路徑爆炸中,還會因為路徑約束中包含諸如取Hash值等操作,導致約束求解失敗.由于存在這2種問題,使用較多的是動態(tài)符號執(zhí)行,動態(tài)符號執(zhí)行通過對程序進行實際執(zhí)行與符號化執(zhí)行,維護程序的實際狀態(tài)和符號化狀態(tài),通過將難以求解的約束替換為實際值,緩解了靜態(tài)符號執(zhí)行的問題,并按照深度優(yōu)先的搜索策略對目標程序進行了探索.

動態(tài)符號執(zhí)行也有自己的問題.①由于程序分支的存在,路徑爆炸的問題仍然存在,程序越復雜,路徑爆炸的問題就越嚴重.解決的一種辦法是通過啟發(fā)式的方法,選擇比較重要的路徑進行探索.②雖然動態(tài)符號執(zhí)行使用實際值替換的方法,解決了一部分靜態(tài)符號執(zhí)行無法繞過的約束,但是也會丟失一些路徑,造成探索結果的不完整.③所有的符號執(zhí)行技術都受限于約束求解方法的能力,比如如何處理類似取余操作這樣的非線性約束,仍然是符號執(zhí)行面臨的挑戰(zhàn).

為了能夠將符號執(zhí)行更好地應用到模糊測試中,近年來誕生了一些工作,比如Pangolin[22]通過允許符號執(zhí)行重用之前的計算結果,Intriguer[23]通過利用字段級的信息,都實現(xiàn)了對符號執(zhí)行過程的加速.ILF[24]通過使用神經網絡,對由符號執(zhí)行專家生成的大量高質量輸入數(shù)據(jù)進行學習,得到了合適的模糊測試策略.

3) 污點分析

該技術會觀測程序中,哪些程序數(shù)據(jù)受到了預先準備好的污染源(比如輸入)的污染,目的是跟蹤污染源和匯聚點(比如有敏感信息的程序數(shù)據(jù))之間的信息流[21].

污點分析存在靜態(tài)污點分析和動態(tài)污點分析2種.靜態(tài)污點分析不需要程序實際運行,通過對程序靜態(tài)分析,獲得程序控制流圖、抽象語法樹等信息,依據(jù)數(shù)據(jù)流以及依賴關系進行污點分析;動態(tài)污點分析則是在程序實際執(zhí)行的過程中,利用程序的動態(tài)執(zhí)行信息進行污點分析.兩者相比較而言,動態(tài)污點分析檢測的可信度更高,但是檢測結果是否全面,取決于動態(tài)污點分析對程序的覆蓋情況,而且動態(tài)污點分析會消耗更多的資源;靜態(tài)污點分析又會和符號執(zhí)行一樣,可能會陷入到路徑爆炸中,而簡化后的靜態(tài)污點分析又存在著嚴重的過度污染問題.

將污點分析技術應用到模糊測試中,并降低其資源消耗是近年來的重要研究方向.比如GREYONE[25]嘗試通過減少污點分析跟蹤的對象、降低污點分析的開銷、提升模糊測試的檢測效率.

程序分析技術還有很多,本文只介紹了模糊測試中常用的3種.另外在黑盒測試中,只需要目標對象輸入數(shù)據(jù)的格式等不涉及目標內部結構的信息.在一些特殊的應用場景下,預處理需要添加相應準備工作.比如在物聯(lián)網設備上進行模糊測試會涉及到虛擬化等操作,相關內容會在第5節(jié)具體介紹.

2.2 模糊測試在預處理階段的類型劃分

根據(jù)模糊測試對程序內部信息分析的程度,現(xiàn)代的模糊測試方法可以劃分為3類:黑盒模糊測試(black-box fuzzing)、灰盒模糊測試(grey-box fuzzing)和白盒模糊測試(white-box fuzzing).3種類型的模糊測試,沒有優(yōu)劣之分,只是有著各自的特點.本節(jié)對這3種模糊測試的特點以及相關的研究成果做介紹.

2.2.1 黑盒模糊測試

黑盒測試也被稱為輸入輸出驅動(IO-driven)的測試,或者是數(shù)據(jù)驅動(data-driven)的測試.黑盒模糊測試不能對目標內部狀態(tài)以及結構進行分析,只能獲得諸如目標的輸入數(shù)據(jù)格式等內部無關信息.此外在測試過程中,黑盒模糊測試無法跟蹤目標內部的執(zhí)行狀態(tài),只能通過檢測目標的輸出數(shù)據(jù),對目標的狀態(tài)進行判斷.

對于黑盒模糊測試的研究是有意義的.首先,不是所有的被檢測目標都是開源的,其次黑盒測試工具設計簡單,開發(fā)和檢測速度快[26].

黑盒模糊測試的問題是,由于不了解檢測目標的內部信息,會生成大量無效輸入,導致測試的覆蓋率相對偏低,檢測深層漏洞的能力有限.

黑盒模糊測試比較適用于輸入數(shù)據(jù)高度結構化的目標以及復雜且難以分析的目標.黑盒模糊測試從最早的PROTOS[14],Peach[15],發(fā)展到如今的DELTA[27],IFuzzer[28],IMF[29],IoT Fuzzer[30],在網絡、文件、內核以及物聯(lián)網模糊測試上都有著重要的應用.

2.2.2 白盒模糊測試

白盒模糊測試會獲得充足的目標內部信息,通常采用符號執(zhí)行的方法.好處是可以生成高質量輸入數(shù)據(jù),在覆蓋率以及程序的深層漏洞檢測上有更好的表現(xiàn).

但是實際應用的過程中,檢測的目標比較復雜,符號執(zhí)行容易陷入路徑爆炸的問題中.另外,對目標程序細致全面的分析會消耗大量資源,嚴重影響模糊測試的效率.

為了盡量在不影響模糊測試效率的情況下,獲得詳細的目標內部信息,研究人員進行了很多改進工作,比如Driller[31]以及基于Driller[31]而誕生的QSYM[32],DigFuzz[33].Driller[31]中使用AFL[13]檢索程序淺層的漏洞,當AFL[13]隨機生成的輸入無法繼續(xù)深入探查程序的時候,任務轉交給符號執(zhí)行.QSYM[32]通過使用動態(tài)二進制轉換,將符號執(zhí)行與本地執(zhí)行緊密的集成在一起,實現(xiàn)了更細粒度的指令級符號執(zhí)行,解決了形成路徑約束緩慢,甚至無法形成正確的約束的問題.如何正確快速的判斷哪些程序的路徑應該使用符號執(zhí)行技術,是一個混合模糊測試器的優(yōu)化問題.基于這個思想,DigFuzz[33]量化了處理每條路徑的困難程度,將難以通過隨機種子到達的路徑轉交給符號執(zhí)行,較好的優(yōu)化了在模糊測試中使用符號執(zhí)行的策略.

近年來有一些研究嘗試加速符號執(zhí)行的速度,或者盡量將模糊測試和符號執(zhí)行分離成2個過程.

為了加快符號執(zhí)行,Pangolin[22]提出允許符號執(zhí)行重用之前的計算結果,Intriguer[23]則通過利用字段級的信息,對符號執(zhí)行在模糊測試中的使用作出了優(yōu)化.

為了盡量避免因使用符號執(zhí)行而影響模糊測試的效率,He等人[24]提出在模仿學習的框架之下,通過對學習任務的描述,從符號執(zhí)行中學習一種高效、快速的模糊測試方法以及策略.在T-Fuzz[34]中通過設計算法,識別出程序中阻礙模糊測試繼續(xù)進行的非關鍵校驗和關鍵校驗.通過二進制重寫,覆蓋掉非關鍵校驗,最大限度地解除程序校驗對模糊測試的限制,這是對程序而不是輸入進行變異.符號執(zhí)行在T-Fuzz[34]中只作為最后的驗證方法以過濾誤報.

2.2.3 灰盒模糊測試

灰盒模糊測試是白盒模糊測試的一種變體,它只能獲得部分程序內部信息,用于模糊測試.其蘊含的思想是:對程序內部進行細致而全面的分析,并不是獲得良好測試結果的必要條件,僅依靠有限的與測試目標相關的信息,再配合良好的測試策略,仍然可以獲得令人滿意的測試結果.

灰盒模糊測試并不是一個妥協(xié)后的方案,比如Matryoshka[35]通過使用良好的策略,解決了深度嵌套條件語句帶來的路徑約束問題,其效果要好于采用符號執(zhí)行的白盒模糊測試.

灰盒模糊測試中,最重要的研究成果是AFL[13]模糊測試工具.它通過在編譯時插樁,搜集模糊測試中邊緣覆蓋率信息,并使用了進化算法,將邊覆蓋率作為算法的適應函數(shù)(fitness function),使得模糊測試可以沿著覆蓋率增大的方向進行,極大地改善了模糊測試的效果.圍繞著AFL[13]誕生了一系列的改進工作,2.2.4節(jié)會對其中一些有代表性的成果做介紹.

總的來說,黑盒模糊測試工具是輕量級的測試工具,設計簡單,測試速度快,但是檢測效果并不理想,適用于難以對內部進行檢測的對象,以及對于開發(fā)和檢測時間有較高限制的情況下.白盒模糊測試工具是重量級的測試工具,更加智能,檢測效果更好,對于深層的漏洞有更好的檢測效果,但是無論是設計實現(xiàn)還是執(zhí)行測試更加復雜與耗時,適用于可以分析內部信息的檢測對象,以及對于深層漏洞有較高檢測需求的任務.灰盒模糊測試并沒有明確的定位,當對于目標內部信息分析較多的時候,灰盒模糊測試就更加偏向于白盒,反之則會偏向于黑盒.相比于白、黑盒模糊測試,灰盒模糊測試總體上來看會更有優(yōu)勢,通過靈活的設計,灰盒模糊測試可以在檢測能力與資源消耗之間尋找一個合適的平衡點,獲得最佳的檢測效果.

2.2.4 AFL及其改進工作

AFL[13]雖然有一定效果,但是其設計上仍有缺陷,比如其能量分配(power schedule)的策略,以及種子選擇的策略,都會影響AFL[13]的檢測效率.而且AFL[13]更偏向于黑盒一些,對程序內部分析有限,這也限制了其檢測深層漏洞的能力.所以通過對程序內部情況進一步分析,獲得更好的檢測效果也是AFL[13]改進的一個方向.針對AFL存在的不足,在AFL[13]誕生后,大量改進工作緊隨其后.

在這些工作中TriforceAFL[36],kAFL[37],Peri-Scope(fuzz)[38]都是AFL[13]在內核模糊測試的使用,會在5.2節(jié)介紹.

在整體建模方面,AFLFast[39]與EcoFuzz[40]都嘗試通過對模糊測試進行更準確地建模以完成對模糊測試的能量分配.AFLFast[39]將整個模糊測試過程建模為一個馬爾可夫鏈(Markov Chain, MC),以此嘗試對低頻路徑分配更多的能量.EcoFuzz[40]進一步改進了建模,使用多臂老虎機(muti-armed bandit)模型,模糊測試需要依據(jù)現(xiàn)有信息從嘗試不同策略與選擇當前最優(yōu)策略之間進行選擇,以達到更合理的能量分配.

在符號執(zhí)行方面,Driller[31]將符號執(zhí)行和模糊測試結合起來,設計合適策略使兩者交替運行.QSYM[32]使用動態(tài)二進制轉換將符號執(zhí)行與本機執(zhí)行更好結合,以實現(xiàn)更細粒度、更快的指令級符號仿真.

符號執(zhí)行對于模糊測試的效率影響較大.為了在不使用符號執(zhí)行的情況下,解決路徑約束問題,研究人員開始考慮使用污點分析,VUzzer[41]在模糊測試過程中使用靜態(tài)動態(tài)結合的方法,通過污點分析,指導種子變異.Angora[42]則更進一步,基于大部分路徑約束只由輸入的少量字節(jié)決定這一思想提出了可伸縮的字節(jié)級的污點分析.并且通過與AFL[13]進行實驗對比,得出使用上下文敏感的分支覆蓋率統(tǒng)計更加有效的結論.此外Angora[42]還借鑒了機器學習中的梯度下降,進行導向性的突變.文中實驗證明,Angora[42]在保證效率的前提下有效地解決了路徑約束問題.REDQUEEN[43]通過使用觀察到的輸入與狀態(tài)(input-to-state)一致性現(xiàn)象進一步優(yōu)化了污點分析,降低了開銷.GREYONE[25]對REDQUEEN[43]進行了改進,通過使用分支的關鍵變量監(jiān)視器(variable monitor)來避免復雜的靜態(tài)分析.

在處理輸入高度結構化的目標方向,Skyfire[44]利用已有的樣本知識,生成具有良好分布的種子輸入.黑盒狀態(tài)下,如何使用生成算法產生高質量數(shù)據(jù)是一個挑戰(zhàn),GLADE[45]在這一方面作出了嘗試.

在2017年誕生的AFLGo[46]中提出了定向模糊測試的概念,以幫助發(fā)現(xiàn)特定的漏洞.AFLGo[46]使用模擬退火算法,有效地引導模糊測試到目標程序特定的位置進行檢測.Hawkeye[47]在AFLGo[46]的基礎上,優(yōu)化了路徑的計算,同時引入了路徑相似度概念以及自適應的種子變異策略,并優(yōu)化了種子優(yōu)先級調度.在實際測試的過程中實現(xiàn)了超過AFL[13]以及AFLGo[46]的測試效果.

在提升程序覆蓋率上,CollAFL[48]對于AFL[13]粗略的覆蓋率統(tǒng)計方法做出了修改,通過利用程序控制流圖以及精心構造的Hash算法,在統(tǒng)計覆蓋率的時候有效地解決了路徑碰撞問題,可以為模糊測試提供精確完整的路徑覆蓋信息,從而提高了發(fā)現(xiàn)新路徑和漏洞的速度.FareFuzz[49]認為基于AFL[13]一系列的各種模糊器仍然沒有覆蓋到足夠廣泛的程序狀態(tài),通過自動識別檢測密度低的路徑,以及一種新的動態(tài)生成的突變掩碼創(chuàng)建算法,提高了模糊測試的覆蓋率.

在實際使用的時候,并沒有一個合適的標準規(guī)定某個具體情況下應該使用什么樣的模糊測試工具,而是需要根據(jù)實際的情況具體分析.比如當模糊測試的目標比較簡單且容易分析時,可使用結合了符號執(zhí)行的測試工具,如果目標有些復雜,就可以使用結合了污點分析的測試工具,如果目標非常復雜,這時候可以直接采用AFL[13]進行模糊測試.

AFL[13]及一些代表性研究工作如表1所示,表1中總結了每個方法的特點以及對應論文中使用的實驗對象.

Table 1 Fuzzer Based on the AFL表1 基于AFL的模糊測試方法

續(xù)表1

3 實際測試環(huán)節(jié)

在經歷了必要的準備工作后,開始進行實際測試,該部分由輸入構造、輸入選擇、以及評估3部分構成.

3.1 輸入構造

輸入構造環(huán)節(jié)的目的是構造出可以被檢測目標執(zhí)行,用于模糊測試的輸入數(shù)據(jù).具體的挑戰(zhàn)是如何在盡量滿足語法語義檢查的情況下,短時間內生成大量的輸入,用以對目標做全面而深入分析.

為應對這樣的挑戰(zhàn),目前獲得輸入數(shù)據(jù)的普遍方法是:首先得到一個數(shù)據(jù)S,然后數(shù)據(jù)S按照一定的策略進行一定次數(shù)的變異,獲得大量新數(shù)據(jù)I,最后將I輸入到被測試對象中進行測試.其中數(shù)據(jù)S被稱為種子(seed),I是測試實際使用的輸入數(shù)據(jù).這樣做的好處是可以通過精心構造種子來保證輸入的有效性,然后通過對種子進行合理的變異,獲得大量的高質量輸入數(shù)據(jù).

為了獲得足夠多的高質量輸入數(shù)據(jù),需要經過種子獲取、種子篩選、種子突變3個階段.種子獲取階段將介紹種子的來源,種子篩選階段會介紹種子的能量分配以及優(yōu)先級分配策略,種子突變則會介紹相應的突變策略.

3.1.1 種子獲取

種子可以直接使用提前準備好的高質量數(shù)據(jù)集,也可以通過模型生成得到.按照一定的策略從執(zhí)行過的數(shù)據(jù)中進行選擇,也是種子生成的常用手段.

模糊測試第1次使用的種子可以是事先準備好的高質量的輸入數(shù)據(jù),也可以是通過生成器生成得到.指導生成的策略可以是用戶定義的,也可以是模糊測試器自行學習到的.比如為了給高度結構化的測試對象(比如JavaScript)生成輸入,Skyfire[44]通過使用提前準備好的詞典,學習得到一個概率性上下文敏感語法(probabilistic context-sensitive grammar),該語法包含有輸入的語法和語義特征,被用做指導種子生成.

采用生成的方法獲取種子,不一定總可以獲得目標語言的語法作為前置條件.在黑盒條件下,GLADE[45]通過使用少量輸入樣本,以及黑盒測試的輸入輸出信息,合成輸入數(shù)據(jù)的上下文無關語法,自動生成有效的輸入數(shù)據(jù)用于模糊測試.

在特定的使用環(huán)境下,模糊測試器的種子生成需要有特定的方法.比如針對Android本機系統(tǒng)服務中的漏洞,F(xiàn)ANS[50]通過收集目標服務中的所有接口,以及變量名稱和類型,得到接口模型和依賴信息,依次生成有效的事務序列,對目標服務的接口進行模糊測試.在協(xié)議分析領域,F(xiàn)iterau-Brostean等人[51]推斷出協(xié)議實現(xiàn)的模型.該模型描述了如何實現(xiàn)響應格式正確的消息序列.在JS引擎安全領域,Montage[52]優(yōu)化了相應的數(shù)據(jù)生成.

生成的方法不僅可以獲得種子,甚至可以直接生成模糊測試模型.比如傳統(tǒng)模糊測試中,需要通過對庫的靜態(tài)分析或者動態(tài)跟蹤才能將其納入到模糊測試中,F(xiàn)uzzGen[53]可以在給定的環(huán)境中,利用整個系統(tǒng)分析來推斷庫的界面,進而自動合成針對復雜庫的模糊器的工具,之后結合LibFuzzer[54]可以實現(xiàn)更好的代碼覆蓋率并檢測庫深處的漏洞.除此之外,F(xiàn)uzzGen[53]還可以合成遵循有效API序列的模糊器代碼.

在進行模糊測試的過程中,按照策略選取一些執(zhí)行過的輸入數(shù)據(jù)作為種子也是一個普遍的做法.比如AFL[13]會使用進化算法,以提升覆蓋率為主要引導方向,從執(zhí)行過的輸入數(shù)據(jù)中篩選合適的數(shù)據(jù)作為種子.值得注意的是由于進化算法常常會使模糊測試過程陷入到無果的隨機突變序列中,對此NEUZZ[55]提出了使用梯度引導的方式替代進化算法.常用的選取策略都關注輸入數(shù)據(jù)的執(zhí)行速度,所在路徑頻率以及深度,并沒有直接關注模糊測試未能到達的路徑.為了改進選取策略,CollAFL[48]提出:如果輸入的執(zhí)行路徑中有許多未探索到的鄰居節(jié)點的分支,則該路徑的變異就很可能探索到未覆蓋的區(qū)域;如果輸入的執(zhí)行路徑中,存在很多未探索到的后代節(jié)點,則該路徑的變異很可能引導模糊測試探索這些后代節(jié)點;如果輸入的執(zhí)行路徑中有許多內存訪問操作,則通過變異更容易觸發(fā)內存損壞漏洞.

總的來說,可以在模糊測試開始前直接使用已有高質量數(shù)據(jù)作為種子,也可以通過合適的策略進行生成,還可以是在模糊測試中按照策略從輸入數(shù)據(jù)中選擇.獲取良好構造的種子是模糊測試得到良好檢測效果的重要保障.

3.1.2 種子的篩選

獲得備選種子以后,需要對種子池里的備選種子進行篩選劃分不同權重,以確定每個種子要用來生成多少輸入,按照什么樣的順序從種子池中選擇種子.這涉及2個概念:種子的能量分配(power schedules)和種子的優(yōu)先級(priority).

1) 種子的能量分配(power schedule)

一個種子蘊含的能量,代表了該種子可以生成輸入數(shù)據(jù)的多少.能量越高,由該種子變異得到的輸入數(shù)據(jù)就會越多.能量分配策略面臨的最大問題是能量分配不合理,這會直接影響模糊測試的執(zhí)行速度以及覆蓋率.

比如由于在AFL[13]的能量分配策略中,沒有考慮到程序不同執(zhí)行路徑頻率上的差異,造成種子的能量分配不合理.具體而言,在模糊測試執(zhí)行一段時間后,有些路徑會被高頻次地訪問到,而部分難以到達的路徑因為只有少數(shù)種子能夠到達而執(zhí)行頻率過低.這些難以到達的路徑對應的種子顯然需要更多的能量.這是AFL[13]無法做到的,也因此造成探索頻率相對較低的路徑上存在漏洞,需要更長時間的模糊測試才能暴露出來.

為了解決這一問題,AFLFast[39]將模糊測試過程,建模為對馬爾可夫鏈狀態(tài)空間的遍歷過程.將種子變異導致的程序執(zhí)行路徑轉移概率,視為馬爾可夫鏈上的狀態(tài)轉移概率.然后通過制定能量分配策略,使模糊測試過程也就是對馬爾可夫鏈狀態(tài)空間的遍歷過程,更傾向于訪問低訪問頻率的區(qū)域,少訪問高訪問頻率的區(qū)域,使得能量分配更加合理.通過這些改進措施,AFLFast[39]在維持和AFL[13]近似的檢測能力的條件下,獲得了更快的檢測速度.

雖然提高了檢測速度,但是AFLFast[39]的能量分配策略還不是很合理.首先,它無法根據(jù)模糊測試的過程靈活地調整能量分配策略,從而增加了發(fā)現(xiàn)新路徑的平均能量消耗,其次,從一個種子開始,選擇下一個種子,并對其分配一定的能量是博弈論中經典的“探索與利用”權衡問題,而非一個簡單的概率問題,基于這樣的想法,EcoFuzz[40]使用多臂老虎機模型(multi-armed bandit model)建模模糊測試的過程,通過使用基于平均損耗的自適應能量分配策略,有效地減少了能量損耗,在有限時間內實現(xiàn)了模糊測試覆蓋率的最大化.

能量分配策略不止可以用于提升模糊測試執(zhí)行速度,還可以引導模糊測試到指定的程序位置進行檢測,比如AFLGo[46]針對傳統(tǒng)的灰盒模糊測試存在的局限性,提出了導向型灰盒模糊測試(directed greybox fuzzing),用于對目標程序給定的位置進行模糊測試.AFLGo[46]通過使用基于模擬退火算法(simulated annealing)的能量調度方法,逐漸將能量更多地分配到距離目標更近的種子上,并減少距離目標較遠的種子上的能量分配.AFLGo[46]相比于使用符號執(zhí)行的白盒模糊測試和非直接灰盒模糊測試,在探查給定目標程序上獲得了更好的效果.但是AFLGo[46]在路徑選擇上偏向于距離目標更近的路徑,這可能會導致漏掉一些潛在的漏洞.

為了克服這個問題,Hawkeye[47]通過使用靜態(tài)分析,全面地搜集與目標程序位置相關的調用圖、函數(shù)以及基本塊層面的距離信息.通過使用和AFLGo[46]相同的基本塊路徑距離(basic block trace distance)以及新增的覆蓋函數(shù)相似度(covered function similarity)這2個指標,制定能量分配策略.對應覆蓋函數(shù)相似度越大,基本塊路徑距離越小的種子將會被分配到更大的能量,產生更多的測試數(shù)據(jù).

值得注意的是,AFLFast[39]的能量分配并不會顯著地改善模糊測試器檢測漏洞的能力極限,只是縮短了達到檢測能力極限的時間,而AFLGo[46]以及Hawkeye[47]的能量分配更多的是有目標的引導模糊測試方向,而不是為了拓展程序的覆蓋率.

2) 種子的優(yōu)先級

種子的優(yōu)先級決定了模糊測試從種子池中選擇種子的順序.

以經典的AFL[13]為例,AFL[13]引入了進化算法(genetic algorithm),該算法中使用了適應度函數(shù)(fitness function),通過適應度函數(shù)可以對輸入進行評估,并從中選取最佳的輸入作為種子放入種子池,該種子池實際上是一個隊列,種子按照入隊順序依次被用于模糊測試.這種方法,在一段時間后會因沒有新種子的加入而被固定下來,形成一個循環(huán),這也帶來AFL[13]的一些問題.AFLFast[39]在種子優(yōu)先級的確定上做出了自己的改進,不再嚴格遵循先入隊先執(zhí)行的策略,而是會適當提升比較少被執(zhí)行種子的優(yōu)先級,也會提升能量分配較少的種子的優(yōu)先級,盡量平衡在不同路徑上的檢測密度.

對于定向灰盒模糊測試,種子的優(yōu)先級選擇會有所不同,比如在Hawkeye[47]中,根據(jù)種子是否觸發(fā)了新的執(zhí)行路徑,種子與目標種子的相似度(比如分配的能量),種子是否包含有目標函數(shù),將種子分配到3個等級的隊列中.

值得注意的是種子的長度是影響種子優(yōu)先級的一個重要因素.通常而言,長度越短的輸入數(shù)據(jù),會占用越少的內存,加快模糊測試的速度.所以在對覆蓋率增加貢獻相同的情況下,長度更短的輸入會獲得更高的優(yōu)先級.這一思想在Rebert等人[56]的工作中通過詳細的實驗做出了驗證,他們認為多個包含不同程序基本塊的小文件,在效果和效率上要好于一個包含全部基本塊的大文件,因而算法會更傾向于更小的輸入.值得注意的是,AFL[13]采用了在維持覆蓋率不變的條件下,通過反復地刪除種子的不同部分,來試圖縮短種子的大小的方法.

更多的種子篩選策略在Rebert[56]的工作中通過大量的實驗做出了對比,總的來說模糊測試中使用良好的種子篩選方法要好于隨機采樣的方法.

3.1.3 種子突變

通過種子獲取和種子的篩選這2個環(huán)節(jié)后,獲得了大量種子以及對應的能量分配和優(yōu)先級策略,接下來需要在突變策略的指引下快速地生成大量輸入數(shù)據(jù).變異的策略直接決定了變異生成數(shù)據(jù)的好壞,變異策略太保守,導致覆蓋率偏低,變異策略太激進,導致生成大量無效的輸入,嚴重影響模糊測試的效率.

突變的具體操作大體上有6種:比特翻轉(bit-flips)、簡單算數(shù)運算(simple arithmetic)、覆蓋(over-writing)、插入(inserting)、刪除(deleting)、拼接(splice).比特翻轉是指按比特位翻轉,通常會按照一定的步長,連續(xù)翻轉幾個比特位,或者是在隨機或特定的某個位置,對固定寬度的比特位進行翻轉.簡單算術運算是AFL[13]中使用的一種方法,該方法按照8 b的步長,依次按照8 b,16 b,32 b的寬度,從頭開始進行加減操作.覆蓋、插入是通過使用預設的值將種子中的一些部分進行覆蓋,或者將其插入到種子的一些位置,預設的值可以是隨機生成的,也可以是用戶指定的.刪除是刪除種子的某些部分、拼接會選擇2個差異較大的種子進行拼接,得到新的數(shù)據(jù).

根據(jù)突變所依據(jù)的策略不同,我們將突變的方式劃分為2種:黑盒突變(black-box mutation)和導向型突變(guided mutation).

1) 黑盒突變

所謂黑盒突變是指不依賴于目標相關信息,依照隨機突變策略對種子進行突變的方法.這種類型的突變方式優(yōu)點是可以快速大量地生成輸入.AFL[13]中大量使用了這種突變方式,通過精心構造的突變策略,獲得良好的實際測試效果.這種方法不關心特定突變方式對程序狀態(tài)的影響.黑盒突變常常作為整個突變策略的一部分出現(xiàn).

2) 導向型突變

導向型突變是指有引導性的對種子進行突變,使突變后的輸入盡可能地將程序引導到預期的程序狀態(tài),或者獲得相應性能的提升.具體來說,導向性的突變又可以細分為程序狀態(tài)導向型突變和性能導向型突變.

程序狀態(tài)導向型突變,通過程序分析技術,得到種子與程序狀態(tài)的關系,以此制定突變策略,針對感興趣的程序狀態(tài)生成相應的測試數(shù)據(jù).

比如VUzzer[41],通過使用靜態(tài)和動態(tài)結合的程序分析方法,獲得程序的控制流和數(shù)據(jù)流,控制流指導VUzzer[41]在種子突變的時候選擇更深的路徑,而數(shù)據(jù)流指導VUzzer[41]具體如何對種子進行突變.該突變方法被稱為感知突變策略(application-aware mutation strategy).

確定突變位置是突變策略中的重要一環(huán),通常使用污點分析等技術,尋找輸入與程序狀態(tài)的關系,進而確定突變位置.

比如Angora[42]使用可伸縮的字節(jié)級別的污點分析指明突變位置.VUzzer[41]和REDQUEEN[43]也使用到了數(shù)據(jù)污染的相關技術,試圖尋找合適的突變位置,但是他們只能分析輸入數(shù)據(jù)或者輸入數(shù)據(jù)的直接拷貝同程序分支的約束的關系,而無法有效處理非直接拷貝的情況.對于這個問題GREYONE[25]通過使用模糊測試驅動的污點推斷技術(fuzzing-driven taint inference),獲得污點屬性(taint attributes),解決了該問題.

對于輸入格式高度結構化的目標,傳統(tǒng)的種子突變策略不太適用,需要保證既可以獲得足夠的輸入數(shù)據(jù),又不破壞種子的結構,比如在Skyfire[44]中,為了防止突變修改關鍵字段,只能選擇種子的特定位置進行突變.ProFuzzer[57]認為結構化的輸入,可以根據(jù)不同的語義,劃分成不同的字段,在不了解其底層語法和語義的情況下進行突變,會生成大量的無效輸入.該方法自動恢復并分析對于模糊測試過程中發(fā)現(xiàn)漏洞至關重要的輸入字段,智能地調整突變策略以重點對這些重要字段進行突變,從而提高了模糊測試的效率.

除了突變位置的選擇外,覆蓋、替換和插入所使用的備選字段的有效性也需要考慮到.比如Lang-Fuzz[58]中,通過分析提供的輸入目標語法以及足夠多的有效輸入樣例,得到有效的代碼段并存入代碼段池中等待使用,同時LangFuzz[58]還可以使用步進算法自行生成有效的代碼段.

此外在對JS引擎進行模糊測試的方案中,DIE[59]使用輕量化的動態(tài)和靜態(tài)程序分析技術,實現(xiàn)了被命名為結構保存(structure preservation)和類型保存(type preservation)的2種與程序狀態(tài)相關的突變策略.

有時需要根據(jù)程序執(zhí)行狀態(tài),及時調整突變策略.Hawkeye[47]設計了自適應突變策略,策略中劃分了輕微突變(fine mutation)以及粗粒度突變(coarse mutate)2種類型,每種類型的突變方式都被分配了相應的概率,根據(jù)實際的執(zhí)行情況,動態(tài)的調整2種突變方式的概率分配.

突變除了可以應用到種子上,還可以用于程序本身.T-Fuzz[34]中通過對程序中非必要校驗進行二進制的覆寫,實現(xiàn)了種子對于程序非必要校驗的繞過.

性能導向型突變,不會試圖分析輸入與程序內部狀態(tài)的關系,而是根據(jù)輸入數(shù)據(jù)同模糊測試評估指標的關系制定突變的策略.

比如在AFL[13]中進行連續(xù)字節(jié)翻轉的時候,會衡量翻轉每個字節(jié)時對于覆蓋率提升的程度,如果覆蓋率沒有上升,則認為該字節(jié)對于覆蓋率提升無意義.通過該過程可以獲得一個effectmap,用于存儲種子中所有字節(jié)的有效性(以0,1區(qū)分),突變的時候如果該字節(jié)無效(為0)則跳過突變,否則按策略進行突變.

總的來說,黑盒突變可以快速地獲取大量輸入數(shù)據(jù).程序狀態(tài)導向型的突變,更適合用于有目標導向的模糊測試.性能導向型的突變,可以在性能指標上有良好的體現(xiàn).一個優(yōu)秀的突變策略往往是將3種突變策略結合使用,針對不同的應用場景進行合適的策略組合.

3.2 輸入選擇

輸入選擇的主要目的是在輸入被實際執(zhí)行前,盡量將其中的無效數(shù)據(jù)濾除掉,以節(jié)省執(zhí)行時間.雖然通過良好的策略,可以盡量保證輸入數(shù)據(jù)的質量,但是無效數(shù)據(jù)仍然是多數(shù),造成模糊測試運行緩慢效果不佳.

輸入選擇環(huán)節(jié)主要的挑戰(zhàn)是如何在輸入數(shù)據(jù)執(zhí)行之前就識別出數(shù)據(jù)是否有效,這是一個模式識別的問題,使用機器學習技術是一個不錯的選擇.接下來我們對直接灰盒模糊測試中的輸入選擇工具FuzzGuard[60]進行介紹.

FuzzGuard[60]是針對直接灰盒模糊測試而設計的,但是對其他類型的模糊測試仍然有啟示作用.FuzzGuard[60]通過使用機器學習技術,預測新產生的輸入可否使得程序執(zhí)行到有漏洞的代碼處,將結果預測為不可達的輸入濾除,配合之后的模糊測試工具進行高效地定向模糊測試.

FuzzerGuard[60]中討論了機器學習應用到模糊測試所要面對的一些問題,比如數(shù)據(jù)不平衡問題,具體來說輸入數(shù)據(jù)中真正有效的數(shù)據(jù)只占少數(shù),正負樣本非常不平衡,這對于機器學習模型的訓練是不利的.而且由于突變后種子執(zhí)行路徑變化的隨機性,使用類似圖像處理領域的數(shù)據(jù)擴展方法也是不可行的.FuzzGuard[60]針對這一問題提出了步進式的訓練方法(step-forwarding approach)一定程度上緩解了該問題.

基于覆蓋率的模糊測試等其他模糊測試方法也可以嘗試借鑒該思想,通過進一步篩選待執(zhí)行的輸入數(shù)據(jù),提升模糊測試的效率.需要注意的是,這個環(huán)節(jié)不是必要的.如果增加輸入選擇的環(huán)節(jié)可以在有限的資源消耗下,大幅提升模糊測試整體效率,那么增加該環(huán)節(jié)才是有意義的.

3.3 評 估

評估的主要目的是選取一個合適的評估指標,用于評估模糊測試執(zhí)行結果,從而幫助模糊測試制定合理的策略并反映模糊測試檢測漏洞的真實能力.

現(xiàn)階段的研究都會聚焦于模糊測試器在2個指標上的表現(xiàn):覆蓋率和暴露漏洞平均時間.

選擇了合適的評估指標以后,如何設計實驗,以評估一個模糊工具是否有效?將是評估環(huán)節(jié)中最大的挑戰(zhàn).

3.3.1 覆蓋率

覆蓋率是軟件測試中的一個衡量指標,指的是在測試過程中,對象被覆蓋到的數(shù)目占總數(shù)的比例.通常而言,高覆蓋率更可能發(fā)現(xiàn)更多的隱藏漏洞,眾多研究因此集中在覆蓋率提升上.

在覆蓋率使用的對象上,可以有不同選擇.比如AFL[13]使用上下文無關的邊覆蓋率作為評估指標.相比較而言,Angora[42]使用上下文敏感的分支覆蓋率.此外VUzzer[41]使用了塊覆蓋率替代邊覆蓋率作為覆蓋率評估的對象.

對于復雜程序的覆蓋信息統(tǒng)計是一個重要環(huán)節(jié),傳統(tǒng)的采用位圖跟蹤的方法比較粗略,直接使用Hash算法,也會帶來嚴重的沖突問題.覆蓋信息記錄不夠完整與詳細,會造成覆蓋率的不準確.CollAFL[48]通過使用足夠大的存儲空間,以及精心設計的Hash沖突解決方案,確保每一個基本塊都有一個獨特的ID,每一個邊都有一個唯一的Hash值,很好地解決了沖突問題,為模糊測試提供更精確完整的覆蓋信息.

一味地提升覆蓋率是唯一正確的研究方向嗎?雖然這從意圖找全所有潛在漏洞的目標上來看是有道理的,然而TortoiseFuzz[61]認為專注于提升覆蓋率,而將已經覆蓋到的內容視為同等重要的這一思想是不合理的,這可能導致在某些不包含漏洞的邊或基本塊上浪費過多的檢測時間.而且使得模糊測試更容易受到反模糊測試技術的影響.TortoiseFuzz[61]提出了邊緣安全敏感性的概念,通過從函數(shù)、循環(huán)與基本塊3個層次評估邊緣安全敏感性,并依次對輸入數(shù)據(jù)進行優(yōu)先級排序.

此外,研究人員能夠在覆蓋率提升的工作中起什么作用,同樣值得思考.IJON[62]提出,可以通過人工介入,發(fā)現(xiàn)阻礙模糊工具的常量,進而使用一段自定義注釋解決該障礙,以使得覆蓋率能夠快速提升.

覆蓋率的統(tǒng)計是需要消耗資源的.研究人員發(fā)現(xiàn),用于標識代碼覆蓋率的插樁技術,對于程序的執(zhí)行效率有著非常嚴重的影響.相比于黑盒測試而言,灰盒測試(以AFL[13]為例)引入了將近1300%的開銷.如何降低開銷是需要考慮的問題.對此,UnTracer[20]發(fā)現(xiàn)在測試過程中,只有不到萬分之一的測試樣例,能夠帶來覆蓋率的增長,可以說對于大部分種子,覆蓋率跟蹤都是無效的.換而言之,我們只跟蹤覆蓋率增長的部分,就可以有效減少開銷.

3.3.2 暴露漏洞平均時間

對于部分特殊場景,例如需要根據(jù)漏洞報告復現(xiàn)某個已知未知的漏洞之類的情況,覆蓋率不再是一個合適的評估指標.此外,在一個程序中漏洞分布并不均勻,部分代碼更有可能存在漏洞,而部分代碼可能根本沒有漏洞.純粹以覆蓋率為指標,可能會使模糊工具在不存在漏洞的部分浪費過多精力.基于這一特點,定向灰盒模糊的概念被提出,它旨在快速找到一個特定位置的漏洞.它不再使用代碼覆蓋率為主要指標,而是以一種暴露漏洞平均時間的指標來進行評估.

暴露漏洞平均時間被B?hme[46]提出的AFLGo[46]選做評估指標.在與基準模糊工具AFL[13]的對比實驗中,AFLGo[46]復現(xiàn)單個漏洞的時間遠比AFL少,這證明了該評估指標的有效性.此后Hawakeye[47]同樣使用了這一指標來證明其性能.Parmesan[63]在通過sanitizer來發(fā)現(xiàn)潛在漏洞的研究工作中,也是用暴露漏洞平均時間作為評估指標同Angora[42]等定向灰盒模糊工具進行比較.

暴露漏洞平均時間相對于傳統(tǒng)的覆蓋率指標,更接近模糊工具的本質.模糊工具的目標就是發(fā)現(xiàn)漏洞,覆蓋率這一指標只是基于覆蓋率越高可能觸發(fā)更多漏洞的假設.當然暴露漏洞平均時間也有自身的局限性,由于定向模糊的原因,發(fā)現(xiàn)的漏洞數(shù)目可能有限,而覆蓋率指標有助于模糊工具發(fā)現(xiàn)更多的漏洞.

3.3.3 驗證實驗的設計

應該如何設置實驗以評估一個模糊工具是否有效?對此,Klees等人[64]進行了實驗并提出了一些相應標準.

Klees等人[64]認為目前的評估方法存在諸多不足:比如大多數(shù)論文未能進行多次執(zhí)行,而實驗證明單次執(zhí)行可能導致結果存在較大偏差.同時一些論文中并不是以發(fā)現(xiàn)的漏洞數(shù)目而是以去重后的崩潰狀況(unique crash)作為評判標準.實際情況中,unique crash的數(shù)目遠遠比實際的漏洞數(shù)目要多.這可能導致對性能的高估.并且許多論文使用的測試超時時間過短,實驗證明,較高的超時時間才能體現(xiàn)模糊測試方法的真實性能.最后許多論文都忽略了初始種子可能對實驗產生的較大影響,而且不同論文對目標的選擇也不統(tǒng)一,這對會對真實性能評估產生很大影響.

Klees等人[64]推薦研究人員在設計實驗時遵循4個標準:1)要進行多次實驗,并進行統(tǒng)計與檢驗以區(qū)獲得結果的分布情況;2)應使用例如CGC/LAVA等具有確定錯誤的測試集或使用具有已知漏洞的程序作為被測試對象;3)應考慮嘗試各種種子輸入,比如使用空種子;4)超時時間應至少設置為24 h,或嘗試不同超時對性能造成的影響.

4 結果分析

結果分析發(fā)生在模糊測試結束以后,主要目的是對于模糊測試的輸出信息進行分析和處理.面臨的挑戰(zhàn)是對于得到的輸出狀態(tài),安全人員通常要手動去重,然后進行復現(xiàn)并分析根本原因,最后根據(jù)威脅程度,判斷是否是有意義的漏洞.該過程高度依賴于相關領域知識以及必要的漏洞分析和復現(xiàn)能力.

為了加快結果分析環(huán)節(jié)的速度,節(jié)省安全研究人員的精力,將機器學習技術應用到該環(huán)節(jié)成為一個研究方向.Gary等人[65]介紹了機器學習在該環(huán)節(jié)的應用情況,感興趣的讀者可以閱讀相應文章.

該環(huán)節(jié)是模糊測試不可或缺的一部分,但不屬于模糊測試主要工作,本文在這里不做過多討論.

5 具體應用場景下的模糊測試

我們已經介紹了模糊測試的基本工作流程,讓讀者對模糊測試有一個整體的了解,然而在不同的領域中實際使用模糊測試時,通常會有著自身的特點.

本節(jié)會針對不同的領域,介紹模糊測試的研究成果,重點介紹近年來研究最為集中的2個領域,分別是物聯(lián)網的模糊測試以及內核模糊測試,其他領域的研究會在5.3節(jié)中集中介紹.之所以選擇這2個領域詳細討論,一方面是因為相應的研究成果相對較多,可以被集中論述,另一方面是因為物聯(lián)網領域在近幾年快速發(fā)展,留下了大量的安全隱患,而內核作為操作系統(tǒng)的核心程序,一旦存在漏洞,將帶來致命的威脅,兩者有必要單獨討論.

5.1 物聯(lián)網中的模糊測試

物聯(lián)網是近幾年最受關注的研究領域之一,大量的物聯(lián)網設備從實驗室進入到普通人的家庭中,然而物聯(lián)網領域快速地發(fā)展,遺留了大量安全問題.在復雜的物聯(lián)網應用環(huán)境下使用模糊測試技術,面臨著極大的需求和挑戰(zhàn).

物聯(lián)網設備的威脅源自于哪里?針對這個問題,F(xiàn)IRM-AFL[66]認為通過利用物聯(lián)網固件中的軟件漏洞,實現(xiàn)針對物聯(lián)網設備的攻擊是物聯(lián)網設備面臨嚴重威脅的主要來源.

將模糊測試應用到物聯(lián)網領域,首先要面對的問題就是特定物聯(lián)網設備上運行的程序通常對于其實際硬件的配置有著高度的依賴性.簡單的從固件中提取一個用戶級別的程序,然后使用模糊測試進行檢測,通常是行不通的.為了解決這個問題,Iot-Fuzzer[30]認為大多數(shù)物聯(lián)網設備通過其官方移動應用程序進行控制,并且此類應用程序通常包含有與設備進行通信所使用協(xié)議的豐富信息,因此通過識別和重用特定于程序的邏輯(比如加密)來改變測試用例(尤其是消息字段),就能夠有效地對物聯(lián)網目標進行模糊測試,而無需依賴于有關其協(xié)議規(guī)范的任何知識.

檢測速度是模糊測試的重要指標,而大部分的物聯(lián)網設備遠遠無法滿足模糊測試需要的吞吐率,為了提高吞吐率AVATAR[67]通過提供更好的硬件組件支持來構建一個混合執(zhí)行環(huán)境,使嵌入式固件的動態(tài)程序分析成為可能.為了進一步提高吞吐率,F(xiàn)irmadyne[68]為系統(tǒng)模式QEMU增加了物聯(lián)網固件的硬件支持,并通過修改內核和驅動程序來處理由于缺乏實際硬件而導致的物聯(lián)網異常,從而完全仿真系統(tǒng).它同時支持ARM和MIPS這2種架構.

多項研究成果表明物聯(lián)網設備采用全仿真的系統(tǒng),可以獲得最高的吞吐量,這是因為真實的物聯(lián)網設備相比于桌面工作站或者服務器要慢得多.

FIRM-AFL[66]認為即使采用完全的系統(tǒng)仿真,吞吐量也遠不能達到理想的水平.其開銷主要源自于使用軟件實現(xiàn)內存管理單元(SoftMMU)以及模擬系統(tǒng)調用.解決方法是通過啟用可在系統(tǒng)仿真器中被仿真的POSIX兼容固件,并使用增強過程仿真技術.

除了吞吐率帶來的挑戰(zhàn),模糊測試在物聯(lián)網領域還要面對檢測能力下降的挑戰(zhàn),比如Muench等人[69]在文中通過實驗證明了內存損壞通常會導致嵌入式設備與臺式機系統(tǒng)發(fā)生不同的行為.特別是在嵌入式設備上,內存損壞的影響通常不太明顯,這大大降低了模糊測試的檢測能力.

模糊測試應用于物聯(lián)網領域有著迫切的需求,但是卻受限于物聯(lián)網領域獨特的特點,從傳統(tǒng)領域誕生的模糊測試技術很難直接使用到物聯(lián)網領域,物聯(lián)網設備的吞吐量通常難以達到模糊測試的要求,而且物聯(lián)網領域中特別的異常狀態(tài)對于模糊測試的檢測能力也提出了挑戰(zhàn).

5.2 內核安全中的模糊測試

內核是構成計算機操作系統(tǒng)的核心程序,可以完全控制操作系統(tǒng)中的一切事物.內核中存在的漏洞,對整個操作系統(tǒng)有著致命的威脅.

內核模糊測試通常利用暴露出來的系統(tǒng)調用接口和外圍接口,從用戶空間進入到內核組件中進行模糊測試,以檢測內核中可能存在的漏洞.

內核模糊測試面臨一系列挑戰(zhàn),首先由于Windows內核程序以及很多相關組件的源代碼并不開源,將導致傳統(tǒng)的反饋機制不再適用.其次內核中的代碼由于存在中斷、多線程操作等機制,使得模糊測試變的很復雜.最后內核模糊測試一旦檢測到程序的崩潰,將會導致整個操作系統(tǒng)重新啟動,極大地影響了模糊測試的效率.

為了克服這些問題,產生了一些專門針對內核安全進行模糊測試的研究,比如syzkaller[70]是由Google開發(fā)的一種以獲得高覆蓋率為導向的內核模糊測試工具,目前實際使用比較多,并經常被用于對比實驗中.Razzer[71]是基于syzkaller[70]通過使用LLVM和修改后的SVF技術針對內核中存在的數(shù)據(jù)爭用問題進行的模糊測試.TriforceAFL[36]基于AFL[13]的QEMU模式,在系統(tǒng)模擬器的幫助下,通過跟蹤分支信息,對Linux的內核進行模糊測試.kAFL[37]通過利用Intel提供的進程追蹤技術,獲取代碼運行時的控制流信息,并通過使用Intel的硬件虛擬特征(VT-x)提升效率并使得kAFL[37]獨立于特定的操作系統(tǒng).

為了緩解由于內核代碼執(zhí)行時間過長,測試案例互相干擾,以及內核崩潰帶來的內核模糊測試性能上的損失,Agamotto[72]提出一個輕量化的虛擬機檢查點作為新的原語,并動態(tài)的創(chuàng)建多個檢查點,提高了內核模糊測試的吞吐量.通過使用Linux中的USB和PCI驅動程序作為外圍攻擊面對其評估,平均性能相比于syzkaller[70],提升了66.6%.

為了將混合模糊測試方法運用到內核模糊測試中,誕生了HFL[73],實驗中獲得了同等數(shù)量資源下的相比于syzkaller[70]高出26%的代碼覆蓋率,以及快3倍以上的速度.

對于內核安全的威脅可以是源自于外部固件.比如PeriScope(fuzz)[38]研究發(fā)現(xiàn)存在一些不通過系統(tǒng)調用的額外路徑也會導致內核泄漏,比如通過破壞WiFi芯片組的固件向內核發(fā)送惡意輸入.對此PeriScope(fuzz)[38]通過被動的檢測驅動與其硬件的流量以及模擬攻擊者在外圍設備上的攻擊行為,在實際實驗中,對2款比較流行的芯片產品,通過WiFi組件和驅動進行模糊測試,發(fā)現(xiàn)了15個獨特漏洞,其中9個是首次發(fā)現(xiàn)的.

考慮到大量的驅動程序是由第三方開發(fā)者提供的,安全性存疑,DIFUZE[74]通過自動的識別驅動程序,將其映射到設備文件名,再自動地構造復雜的參數(shù)實例,對內核驅動程序進行了模糊測試.實驗中在7款現(xiàn)代Android智能手機上檢測出了內核中32個從未被發(fā)現(xiàn)的漏洞.

通過5.2節(jié)介紹,我們可以看到,傳統(tǒng)的模糊測試應用到內核模糊測試上將面臨著眾多的問題,包括內核態(tài)代碼的復雜執(zhí)行環(huán)境,以及內核崩潰的處理問題.另外內核安全面臨的威脅來源是不確定的,可以是外部固件,也可以是第三方開發(fā)的驅動程序,還可以是內核程序自身設計的問題.模糊測試在內核安全領域的應用還有待進一步的研究.

5.3 其他領域

模糊測試除了5.1~5.2節(jié)提到的在物聯(lián)網以及內核安全領域的應用,在安卓系統(tǒng)安全,算法復雜度等方面也有著廣泛的應用,這里我們集中介紹近年來模糊測試在多個領域的研究成果.

SpecFuzz[75]使用動態(tài)推測執(zhí)行來發(fā)現(xiàn)類似于Spectre V1等類型的漏洞.FANS[50]使用接口模型和推斷依賴關系生成測試用例,對安卓系統(tǒng)的本機服務進行模糊工具.Frankenstein[76]通過構建一個固件模擬器,使用虛擬調制解調器對藍牙協(xié)議進行了模糊測試.

USB驅動由于能夠直接與內核交互而被視為具有高風險.然而對USB協(xié)議的模糊測試需要跨越軟件與硬件,因此頗具難度.對此,USBFuzz[77]提出了基于覆蓋率的針對USB驅動的模糊測試.

灰盒測試的代碼覆蓋率并不能很好地反映多線程程序中存在的問題.MUZZ[55]通過使用多種插樁技術,選擇在單線程中表現(xiàn)更好的種子來探索多線程程序.對于多線程的數(shù)據(jù)競爭問題,KRACE[78]引入新的覆蓋率跟蹤指標與進化算法,進行模糊測試.

此外還有針對文件系統(tǒng)的模糊工具JANUS[79],針對錯誤處理代碼進行模糊測試的FIFUZZ[80],針對Java算法復雜度進行模糊測試的工具Hot-Fuzz[81],面向虛擬機監(jiān)控器的模糊工具HYPER-CUBE[82],針對算法復雜度進行模糊測試的Slow-Fuzz[83],以及通過自然語言處理進行信息提取,進而進行基于語義模糊測試的SemFuzz[84],還有針對Web瀏覽器DOM引擎的模糊測試工具FreeDom[85].

模糊測試在各個領域都有著不同的應用,雖然各自有著自身獨特的使用條件,但是整個模糊測試的工作流程仍然是沿著我們提出的基本工作模型進行,只是在具體實現(xiàn)的時候,需要按照實際情況尋找合適的解決方案.

6 模糊測試的挑戰(zhàn)與機遇

模糊測試在漏洞檢測上起著重要的作用,但這一技術同樣可以被攻擊者利用,為惡意攻擊者提供便利,因此針對模糊測試的對抗技術反模糊測試出現(xiàn)了,無論是反模糊測試自身的研究,還是其帶給模糊測試技術的挑戰(zhàn),都是研究的重要方向.

除此之外,模糊測試的種類復雜繁多,每一個應用領域都有著自身獨特的需求,能否將各種各樣的模糊測試工具集成起來,形成一個通用的平臺,是模糊測試實用化的一個重要挑戰(zhàn)和方向.

近幾年來,機器學習的相關技術飛速發(fā)展,已經在圖像識別,自然語言處理等領域大放異彩,模糊測試與其相結合可以說是趨勢所在,但是找到兩者合適的結合點,最大限度發(fā)揮兩者的優(yōu)勢仍然是一個需要研究的方向.

6.1 反模糊測試

目前主流的模糊測試技術通常依賴于4個前提:1)單次執(zhí)行速度要足夠快;2)模糊工具可以獲得覆蓋率的反饋;3)目標程序中的路徑約束可以被符號求解;4)崩潰可以被模糊工具所檢測到.

基于這些依賴條件,為了實現(xiàn)反模糊測試,要在不對正常執(zhí)行造成過大的影響的條件下,減緩模糊測試的執(zhí)行速度,或者通過干擾覆蓋率圖,使得模糊工具無法從覆蓋率圖中獲取有效信息,也可以干擾混合執(zhí)行,使得正常能夠被符號執(zhí)行或污點分析求解的內容變得無法求解.

Güler等人[86]和Jung等人[87]都提出了在低頻執(zhí)行路徑插入延時代碼,以減緩模糊測試速度的方案.并通過將常量比較等價替換為Hash后的比較干擾混合執(zhí)行.在干擾覆蓋率獲取的方向上,他們都提出用無意義的代碼填充覆蓋率圖,進而干擾模糊工具的判斷.

反模糊測試技術一方面可以阻止惡意模糊測試對安全的威脅,另一方面也給今后的模糊測試技術提出了新的挑戰(zhàn).

6.2 模糊工具的集成

通過6.1節(jié)的內容可以看到,研究人員針對不同的領域提出不同的模糊測試方法,產生了種類繁多的模糊測試工具.研發(fā)出一種適用于所有場景的模糊工具并不現(xiàn)實,如何將不同模糊測試工具進行整合,構造一個通用模糊測試平臺,是模糊測試實用化的一個重要研究方向.

6.3 機器學習在模糊測試的應用

機器學習技術在圖像識別以及自然語言處理領域有著廣泛的應用,將其使用到模糊測試領域是一個非常值得探索的領域,但是仍然有很多挑戰(zhàn)需要應對.

首先要面對的就是數(shù)據(jù)源問題,模糊測試雖然可以生成大量的輸入數(shù)據(jù),但是大多是即時生成的,無法在不同的測試目標之間通用,這就對于構建通用數(shù)據(jù)集,方便模型訓練,造成了很大的阻礙,也導致了無法生成一個提前訓練好的,可被多種模糊測試使用的預訓練模型,只能使用模糊測試實時生成的數(shù)據(jù)訓練模型.

其次就是數(shù)據(jù)不平衡問題,模糊測試生成的數(shù)據(jù)中,能夠真正實現(xiàn)測試目的的數(shù)據(jù),在數(shù)量上相對偏少,正負樣本的極度不平衡,使用步進式訓練的方法只能緩解該問題,但無法從根本上解決.

最后,執(zhí)行速度對于模糊測試來說非常重要,而復雜機器學習模型的訓練往往會耗費大量時間,并且已有的不使用機器學習技術的模糊測試工具在性能上尚能滿足人們的需求,模糊測試對于機器學習技術的需要并不迫切.

關于機器學習與模糊測試結合的內容,感興趣的讀者可以閱讀Saavedra等人[65]以及Wang等人[88]的文章,這里不做過多的敘述.

7 結束語

模糊測試自誕生以來,能力不斷提升,應用領域不斷擴展,今日的模糊測試工具,已經逐漸成為漏洞發(fā)掘的重要工具.

本文對模糊測試進行了全面的總結.我們介紹了模糊測試流程中,各個環(huán)節(jié)的研究情況.也總結了具體場景下的模糊測試取得的進展.最終對模糊測試面臨的機遇和挑戰(zhàn)進行展望.

模糊測試的設計時刻體現(xiàn)著博弈的思想,是“精確”一些還是“模糊”一些,不同的策略可以帶來不同的效果,總的來說模糊測試與其說是一門技術,不如說是一門藝術.

猜你喜歡
覆蓋率漏洞程序
民政部等16部門:到2025年村級綜合服務設施覆蓋率超80%
漏洞
我國全面實施種業(yè)振興行動 農作物良種覆蓋率超過96%
試論我國未決羈押程序的立法完善
人大建設(2019年12期)2019-05-21 02:55:44
“程序猿”的生活什么樣
英國與歐盟正式啟動“離婚”程序程序
三明:“兩票制”堵住加價漏洞
漏洞在哪兒
兒童時代(2016年6期)2016-09-14 04:54:43
基于噴丸隨機模型的表面覆蓋率計算方法
創(chuàng)衛(wèi)暗訪程序有待改進
石门县| 渝北区| 泽库县| 内丘县| 霍州市| 阿拉善右旗| 阜宁县| 襄垣县| 北碚区| 巨野县| 深泽县| 县级市| 钦州市| 通渭县| 张家口市| 湘潭县| 侯马市| 池州市| 桃源县| 溆浦县| 疏附县| 文化| 潜山县| 昌邑市| 涞源县| 锡林郭勒盟| 同江市| 房山区| 隆子县| 图木舒克市| 昆山市| 甘肃省| 台山市| 峡江县| 旬邑县| 五莲县| 肇庆市| 康马县| 沁水县| 长治县| 灵石县|