999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

一種模塊化可拓展策略的模糊測試工具

2018-12-15 07:05:38
電子設計工程 2018年23期
關鍵詞:模塊化程序策略

陳 鵬

(1.上海微系統與信息技術研究所上海200050;2.上海科技大學信息學院,上海201210;3.中國科學院大學北京100029)

近年來,由于軟件漏洞導致的安全問題屢屢發生。軟件漏洞作為當前計算機安全的主要缺陷,給計算機用戶帶來了極大的威脅。這些漏洞會被攻擊者利用,入侵用戶的系統和軟件,從而導致隱私泄露、系統破壞等安全問題。雖然類型安全和帶有垃圾回收機制的編程語言(如JAVA)可以幫助開發者避免一些內存安全問問題。此外,Rust語言的出現,也給內存和線程安全問題帶來了極大的改善,減少出現軟件漏洞的可能。但由于歷史原因,大量核心系統和軟件仍然采用C/C++語言來實現。C/C++語言并沒有提供這些安全機制,因此通過軟件測試的手段來發現漏洞成為了主要的方法。雖然現在有多種用來檢測軟件漏洞的技術,模糊測試(Fuzzing)[1-2]仍然是最有效的一種軟件測試手段,并在產業界中被廣泛應用。

1 模糊測試的類型

模糊測試(Fuzzing)是一種發現軟件漏洞的自動化測試技術。它最早被提出用來測試UNIX utilities軟件的可靠性[1]。自那以后,它被不斷的改進,并被廣泛使用在不同的場景下。基于對程序內在結構的不同了解程度,我們可以把模糊測試工具(Fuzzer)分為3類:白盒,黑盒,和灰盒[3]。黑盒模糊測試工具不需要了解程序的內部狀態,而白盒模糊測試工具需要程序的源代碼來執行高級的程序分析得到詳細的內部狀態。灰盒模糊測試是黑盒和白盒之間的一種折中的辦法。它只需要對程序做輕量級的程序分析來得到部分程序的內部狀態。從如何生成程序輸入的角度來看,我們可以把模糊測試工具分為基于修改的和基于生成的兩種。基于修改的模糊測試工具通過修改原先存在的輸入樣本來得到新的輸入,基于生成的模糊測試工具在根據已知的輸入格式生成新的輸入。

2 American Ffuzzy Lop(AFL)

American fuzzy lop(AFL)[4]是目前應用最廣的模糊測試工具。它是一種基于修改的灰盒模糊測試工具。AFL在編譯時對程序插入輕量的代碼來獲取程序內部狀態,并使用基因算法來自動的生成可能會觸發新的內部狀態的輸入。此外,AFL是一種基于覆蓋率的模糊測試工具。它通過不斷生成輸入來遍歷程序內部的不同的執行路徑(內部狀態)來觸發漏洞[5]。

AFL作為一個開源的程序,不單單在工業界被大范圍使用,在學術界,由于它出色的效果和性能,在大量工作中也作為工作的基礎,被修改來解決各種各樣的實際場景和嘗試新的模糊測試方法。但由于它的實現過于耦合,并沒有對程序進行模塊化,對其修改往往是一件非常困難的事情。為了解決這一問題,我們設計和實現了一種模塊化可拓展策略的模糊測試工具。在確保它能夠有與AFL不相上下的性能表現的基礎上,我們的模糊測試工具對開發者拓展其功能更加友好。模塊化的設計可以方便其他開發者以我們的工具為基礎,更容易的去實現他們的想法。同時,可以更準確的去對比不同策略的效果。

3 設計概覽

與AFL一樣,我們的模糊測試工具是基于修改的、基于覆蓋率的、灰盒的。該工具主要包括兩個部分:程序插樁和動態執行。

3.1 程序插樁與代碼覆蓋率

程序插樁的目的是讓執行的程序能夠收集到程序本身內部狀態。這些信息被用來指導模糊測試工具如何去產生輸入。在此,我們將程序動態執行的路徑當成它的內部狀態。程序路徑由一串分支組成,而分支是基本代碼塊間的跳轉信息。在實現上,路徑由一張固定大小的Table表示,Table中每個單元的Key代表某個分支,Value代表這個分支被執行過的次數。我們通過圖1的代碼來做訪問分支的計數,從而代表程序的執行路徑。

圖1 程序插樁的插入代碼:分支計數

插樁通過LLVM Pass[6]來實現。我們使用的是LLVM 4.0版本。插樁作為程序編譯過程的最后一個環節,對原先程序代碼插入檢查分支是否被執行的代碼,從而讓它可以在動態執行時獲取每個輸入對應的執行路徑,也就是我們所說的內部狀態。此外,我們也可以通過Intel Pin或者QEMU來解決沒有源代碼時的插樁問題。

3.2 動態執行與反饋回路

動態執行部分包括以下幾個步驟:

1)從輸入樣本池中選擇一個輸入樣本。選擇哪個輸入樣本是有輸入樣本本身的信息或者產生的內部狀態所決定。

2)隨機修改該輸入樣本,然后使用該修改后的輸入啟動被測試程序。該輸入會被寫到磁盤中,測試程序將調用自身程序中的IO函數讀取該輸入。

3)獲取程序的運行時的內部狀態等信息。這些信息被用來判別是否觸發異常、是否為一個新的輸入樣本。如果是一個對應內部狀態沒出現過的輸入,則將該輸入放入輸入樣本池中。此外,這些內部信息還可以用來指導怎么選擇輸入樣本和修改輸入樣本。

4)重復步驟1)~3)

4 模塊化與可拓展策略

根據第3節,我們對模糊測試工具進行模塊化。

4.1 程序插樁的模塊化

圖2為程序插樁的模塊化。我們設計和實現了分支計數、污點分析和Fork Server 3個模塊。每個模塊可以是LLVM的一個Pass,或者是一個可以用來編譯時動態鏈接的動態鏈接庫。其中,分支計數和污點分析為LLVM Pass,Fork Server為動態鏈接庫。污點分析模塊用來定位樣本輸入中的重要部分。Fork Sever模塊用來減少被測試程序的啟動時間。每個模塊基本上由一個代碼文件實現,彼此之間不相互依賴。我們可以選擇性的開啟和關閉某些模塊。此外,這些模塊的啟用順序可以自由調整。基于這個設計,開發者可以靈活的增減模塊,拓展自己想要的功能。

圖2 程序插樁的模塊化

4.2 動態執行的模塊化

圖3為動態執行部分的模塊化,主要包括4個模塊:輸入樣本池、調度策略、修改策略和執行器。動態執行部分的代碼均使用Rust語言編寫。Rust語言不但可以確保我們編寫的程序安全高效,還提供了包管理、Trait等特性能使我們能更好的去模塊化動態執行部分。

圖3 動態執行部分的模塊化

4.2.1 輸入樣本池

輸入樣本池管理已經收集的輸入樣本。這些樣本包含正常的輸入樣本、可以導致程序崩潰的輸入樣本、可以導致超時的輸入樣本。在加入樣本池前,每個輸入樣本都會通過它們相應的內部狀態與樣本池中一張全局的表進行對比,用來確保它們在樣本池中是否為獨一無二的。如果是,會把它們的內部狀態更新到全局的表中,并將該輸入樣本加入到樣本池中[5]。樣本池中輸入樣本的內容會被存儲在磁盤中,其他信息會存儲在內存中,包含它的內部狀態和文件長度、文件內容在磁盤中的路徑等。開發者一般不會對輸入樣本池模塊進行修改。

4.2.2 可拓展的調度策略

怎么從輸入樣本池中選擇合適的樣本用來修改是基于修改的模糊測試的一大難點。對模糊測試來說,最好的選擇是能夠找到一個在修改它之后最有可能找到漏洞或者新的內部狀態的輸入樣本。在現有的實現中,研究人員除了使用輪詢調度和隨機選擇外,還會通過一些啟發去選擇這些樣本,比如根據路徑長度、輸入樣本大小等[7]。在最近的研究中,AFLFast[8]嘗試使用馬爾可夫模型來調度樣本,VUzzer[9]根據路徑包含代碼塊的權重和來選擇樣本。在此,我們實現了基本的輪詢調度和路徑最長優先調度。我們的調度策略是模塊化可拓展的,開發者可以通過預先暴露的接口(Rust trait)編寫自己的調度策略。

4.2.3 可拓展的修改策略

如何去修改選擇的輸入樣本是模糊測試的第二大難點,也是大部分模糊測試研究的工作。對目前的模糊測試工作來說,隨機修改占了絕大部分。隨機修改包含:隨機的增減輸入,隨機的對某些輸入進行數值上的加減、以及取反等。在最近的研究中,越來越多的工作嘗試更加智能的去修改這些樣本輸入。AFL使用基因算法來拼接兩個優先選擇的樣本。BuzzFuzz[10-11]使用污點分析識別樣本輸入中可能會觸發漏洞的部分,并隨機修改它們。DART[12]、SYMFUZZ[13]、Driller[14]使用符號執行來對輸入樣本進行修改。VUzzer和Steelix[15]識別代碼中的“Magic Bytes”,并將它們賦值到輸入樣本中。修改策略和調度策略一樣,也是豐富多樣的。開發者可能根據自身需求,選擇不同的策略。因此,我們對修改策略也是模塊化可拓展的。我們實現了基本的隨機修改策略、基因算法策略和基于污點分析的修改策略。在此之上,開發者可以選擇或者混合使用這些策略,也可以通過預先暴露的接口(Rust trait)實現自己的策略。

4.2.4 執行器與高性能措施

執行器負責調用被測試程序,并將修改后的輸入樣本輸入到被測試程序中。此外,執行器還會與被測試程序進行通訊(IPC)來獲取被測試程序的內部狀態,并將它們提供給其他模塊。跟輸入樣本池一樣,開發者一般不會修改執行器模塊。一個好的執行器必須要高效和減少IO。我們通過以下5點來確保執行器高效運行。

1)Rust語言。Rust是一門編譯型語言,自身沒有垃圾回收等會使得運行速度變慢的運行時。同時,Rust編寫的程序能夠保證內存安全和線程安全。

2)Fork Server。Fork Server是 AFL 提出的一種技術。它通過在啟動一個Server進程與模糊測試工具進行通訊,根據收到的命令來Fork產生子進程作為被測試程序。這樣的機制可以大大減少程序被啟動時的初始化時間。

3)綁定CPU核心(CPU Binding)。我們的模糊測試工具支持多線程同時工作。當使用多線程時,我們把每個線程綁定到具體一個CPU核心中,從而避免CPU任務調度,并對CPU緩存更加友好。

4)高效的進程間通訊(IPC)。我們使用Shared Memory的方式實現模糊測試工具和被測試程序間的通訊。直接分享內存使得數據的通訊更加高效,沒有其他IO延遲。

5)虛擬內存文件系統(TMPFS)。該工具在啟動時會自動在內存中劃分一塊區域作為虛擬內存系統。我們將樣本池中的輸入樣本文件內容,以及一些必須記錄在磁盤的信息記錄在內存文件系統中,減少IO延遲。

5 結 論

我們調研了現有的模糊測試工具,根據目前模糊測試工具耦合太嚴重的缺點,提出了一種新的模塊化可拓展策略的模糊測試工具。在這個工具為基礎,我們可以方便的去根據自己的需求設計實現不同的調度策略和修改策略。這種方式能快速的測試一個實驗性的思想是否工作。此外,我們使用Rust語言實現、采用Fork Server等機制保證了我們的模糊測試在其他基礎模塊的高性能。

猜你喜歡
模塊化程序策略
模塊化自主水下機器人開發與應用
模塊化住宅
現代裝飾(2020年5期)2020-05-30 13:01:56
例談未知角三角函數值的求解策略
我說你做講策略
試論我國未決羈押程序的立法完善
人大建設(2019年12期)2019-05-21 02:55:44
高中數學復習的具體策略
數學大世界(2018年1期)2018-04-12 05:39:14
“程序猿”的生活什么樣
ACP100模塊化小型堆研發進展
中國核電(2017年2期)2017-08-11 08:00:56
模塊化VS大型工廠
流程工業(2017年4期)2017-06-21 06:29:50
英國與歐盟正式啟動“離婚”程序程序
環球時報(2017-03-30)2017-03-30 06:44:45
主站蜘蛛池模板: 1024国产在线| 高潮爽到爆的喷水女主播视频| 天天摸天天操免费播放小视频| 91亚瑟视频| 亚洲精品无码久久毛片波多野吉| 欧美日韩久久综合| 成人午夜精品一级毛片| 国产色网站| 园内精品自拍视频在线播放| 久久99国产乱子伦精品免| 呦系列视频一区二区三区| 久久国产精品国产自线拍| 99热在线只有精品| 在线观看91香蕉国产免费| www.狠狠| 无码网站免费观看| 一本色道久久88| 色悠久久久| 国产亚洲高清视频| 亚洲成人一区二区三区| 中文字幕无码制服中字| 免费国产在线精品一区| 精品久久高清| 国产麻豆va精品视频| 一本大道香蕉久中文在线播放| 国产精品视频3p| 亚洲综合色在线| 亚洲欧洲日韩国产综合在线二区| 国产精品林美惠子在线播放| 欧美一区日韩一区中文字幕页| 国产在线观看人成激情视频| 中文纯内无码H| 深夜福利视频一区二区| AV不卡无码免费一区二区三区| 免费女人18毛片a级毛片视频| 新SSS无码手机在线观看| 亚洲品质国产精品无码| 亚洲人成网站18禁动漫无码| 亚洲午夜福利精品无码不卡| 国产毛片片精品天天看视频| 免费国产一级 片内射老| 欧美a在线| 国产亚洲欧美在线视频| 一本大道在线一本久道| 久久99久久无码毛片一区二区 | 在线毛片免费| 在线观看91香蕉国产免费| 成人免费黄色小视频| 成年看免费观看视频拍拍| 88国产经典欧美一区二区三区| 亚洲国产成人自拍| 亚洲中文在线看视频一区| 亚洲AV色香蕉一区二区| 97超碰精品成人国产| 1024你懂的国产精品| 欧美a在线视频| 亚洲成人黄色网址| 亚洲天堂视频在线观看免费| 国产成人1024精品下载| 日韩在线中文| 欧美日韩午夜| 伊人无码视屏| 日韩欧美国产三级| 亚洲色精品国产一区二区三区| 精品少妇人妻一区二区| 99久久性生片| 亚洲成人动漫在线| 亚州AV秘 一区二区三区| 欧美、日韩、国产综合一区| 亚洲精品少妇熟女| 国产91视频观看| 日本亚洲成高清一区二区三区| 日韩欧美国产区| 秋霞一区二区三区| 亚洲无码高清一区二区| 欧美一级一级做性视频| 67194亚洲无码| 午夜高清国产拍精品| 欧美高清视频一区二区三区| 色哟哟国产精品| 99精品在线看| 伊人国产无码高清视频|