亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

        2018-12-15 07:05:38
        電子設(shè)計(jì)工程 2018年23期
        關(guān)鍵詞:插樁測試程序測試工具

        陳 鵬

        (1.上海微系統(tǒng)與信息技術(shù)研究所上海200050;2.上??萍即髮W(xué)信息學(xué)院,上海201210;3.中國科學(xué)院大學(xué)北京100029)

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

        1 模糊測試的類型

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

        2 American Ffuzzy Lop(AFL)

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

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

        3 設(shè)計(jì)概覽

        與AFL一樣,我們的模糊測試工具是基于修改的、基于覆蓋率的、灰盒的。該工具主要包括兩個(gè)部分:程序插樁和動(dòng)態(tài)執(zhí)行。

        3.1 程序插樁與代碼覆蓋率

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

        圖1 程序插樁的插入代碼:分支計(jì)數(shù)

        插樁通過LLVM Pass[6]來實(shí)現(xiàn)。我們使用的是LLVM 4.0版本。插樁作為程序編譯過程的最后一個(gè)環(huán)節(jié),對(duì)原先程序代碼插入檢查分支是否被執(zhí)行的代碼,從而讓它可以在動(dòng)態(tài)執(zhí)行時(shí)獲取每個(gè)輸入對(duì)應(yīng)的執(zhí)行路徑,也就是我們所說的內(nèi)部狀態(tài)。此外,我們也可以通過Intel Pin或者QEMU來解決沒有源代碼時(shí)的插樁問題。

        3.2 動(dòng)態(tài)執(zhí)行與反饋回路

        動(dòng)態(tài)執(zhí)行部分包括以下幾個(gè)步驟:

        1)從輸入樣本池中選擇一個(gè)輸入樣本。選擇哪個(gè)輸入樣本是有輸入樣本本身的信息或者產(chǎn)生的內(nèi)部狀態(tài)所決定。

        2)隨機(jī)修改該輸入樣本,然后使用該修改后的輸入啟動(dòng)被測試程序。該輸入會(huì)被寫到磁盤中,測試程序?qū)⒄{(diào)用自身程序中的IO函數(shù)讀取該輸入。

        3)獲取程序的運(yùn)行時(shí)的內(nèi)部狀態(tài)等信息。這些信息被用來判別是否觸發(fā)異常、是否為一個(gè)新的輸入樣本。如果是一個(gè)對(duì)應(yīng)內(nèi)部狀態(tài)沒出現(xiàn)過的輸入,則將該輸入放入輸入樣本池中。此外,這些內(nèi)部信息還可以用來指導(dǎo)怎么選擇輸入樣本和修改輸入樣本。

        4)重復(fù)步驟1)~3)

        4 模塊化與可拓展策略

        根據(jù)第3節(jié),我們對(duì)模糊測試工具進(jìn)行模塊化。

        4.1 程序插樁的模塊化

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

        圖2 程序插樁的模塊化

        4.2 動(dòng)態(tài)執(zhí)行的模塊化

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

        圖3 動(dòng)態(tài)執(zhí)行部分的模塊化

        4.2.1 輸入樣本池

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

        4.2.2 可拓展的調(diào)度策略

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

        4.2.3 可拓展的修改策略

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

        4.2.4 執(zhí)行器與高性能措施

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

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

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

        3)綁定CPU核心(CPU Binding)。我們的模糊測試工具支持多線程同時(shí)工作。當(dāng)使用多線程時(shí),我們把每個(gè)線程綁定到具體一個(gè)CPU核心中,從而避免CPU任務(wù)調(diào)度,并對(duì)CPU緩存更加友好。

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

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

        5 結(jié) 論

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

        猜你喜歡
        插樁測試程序測試工具
        砂土中樁靴插樁對(duì)臨近筒型基礎(chǔ)的影響研究
        邊緣智力兒童及其智力測試工具的研究進(jìn)展
        基于TXL的源代碼插樁技術(shù)研究
        Http并發(fā)連接測試工具
        基于性能分析的自適應(yīng)插樁框架
        基于Castle型機(jī)械手的三溫量產(chǎn)測試平臺(tái)實(shí)現(xiàn)
        手機(jī)APP交互界面人因適合性測試程序的設(shè)計(jì)與實(shí)現(xiàn)
        中心主導(dǎo)制訂的《VHF/UHF頻率范圍內(nèi)測向系統(tǒng)測向靈敏度的測試程序》等兩項(xiàng)國際標(biāo)準(zhǔn)在ITU官網(wǎng)正式發(fā)布
        電氣自動(dòng)化控制設(shè)備可靠性測試探討
        福祿克推出先進(jìn)的連接式測試工具系統(tǒng)
        美女福利一区二区三区在线观看| 无码一级视频在线| 国产无码swag专区| 国产成人福利av一区二区三区| 久久青青草原一区网站| 亚洲视频在线观看一区二区三区 | 亚洲av高清资源在线观看三区| 人妻少妇精品视中文字幕免费| 妺妺窝人体色777777| 亚洲中文字幕成人无码| 精品一区二区久久久久久久网站| 久久亚洲道色宗和久久| 大屁股流白浆一区二区| 内射爆草少妇精品视频| 国产成人精品免费视频大全软件| 三叶草欧洲码在线| 亚洲av色先锋资源电影网站| 亚洲色成人WWW永久在线观看| 久久伊人精品只有这里有| 日本不卡的一区二区三区中文字幕| 亚洲理论电影在线观看| 日韩欧群交p片内射中文| 亚洲色图+国产精品| 人妻系列无码专区久久五月天 | (无码视频)在线观看| 亚洲综合精品伊人久久| 亚洲男人的天堂网站| 亚洲αv在线精品糸列| 亚洲国产综合精品一区| 免费无码又爽又刺激网站直播 | 欧洲人妻丰满av无码久久不卡| 98色花堂国产精品首页| 北岛玲中文字幕人妻系列 | 尤物国产一区二区三区在线观看| 欧美性高清另类videosex| 欧美 丝袜 自拍 制服 另类| 亚洲人成综合网站在线| 中文字幕一区,二区,三区| 久久午夜av一区二区| 国产麻豆剧果冻传媒一区| 精品亚洲aⅴ在线观看 |