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

?

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

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

陳 鵬

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

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

1 模糊測(cè)試的類(lèi)型

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

2 American Ffuzzy Lop(AFL)

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

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

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

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

3.1 程序插樁與代碼覆蓋率

程序插樁的目的是讓執(zhí)行的程序能夠收集到程序本身內(nèi)部狀態(tài)。這些信息被用來(lái)指導(dǎo)模糊測(cè)試工具如何去產(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í)行過(guò)的次數(shù)。我們通過(guò)圖1的代碼來(lái)做訪問(wèn)分支的計(jì)數(shù),從而代表程序的執(zhí)行路徑。

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

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

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)被測(cè)試程序。該輸入會(huì)被寫(xiě)到磁盤(pán)中,測(cè)試程序?qū)⒄{(diào)用自身程序中的IO函數(shù)讀取該輸入。

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

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

4 模塊化與可拓展策略

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

4.1 程序插樁的模塊化

圖2為程序插樁的模塊化。我們?cè)O(shè)計(jì)和實(shí)現(xiàn)了分支計(jì)數(shù)、污點(diǎn)分析和Fork Server 3個(gè)模塊。每個(gè)模塊可以是LLVM的一個(gè)Pass,或者是一個(gè)可以用來(lái)編譯時(shí)動(dòng)態(tài)鏈接的動(dòng)態(tài)鏈接庫(kù)。其中,分支計(jì)數(shù)和污點(diǎn)分析為L(zhǎng)LVM Pass,F(xiàn)ork Server為動(dòng)態(tài)鏈接庫(kù)。污點(diǎn)分析模塊用來(lái)定位樣本輸入中的重要部分。Fork Sever模塊用來(lái)減少被測(cè)試程序的啟動(dòng)時(shí)間。每個(gè)模塊基本上由一個(gè)代碼文件實(shí)現(xiàn),彼此之間不相互依賴(lài)。我們可以選擇性的開(kāi)啟和關(guān)閉某些模塊。此外,這些模塊的啟用順序可以自由調(diào)整。基于這個(gè)設(shè)計(jì),開(kāi)發(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語(yǔ)言編寫(xiě)。Rust語(yǔ)言不但可以確保我們編寫(xiě)的程序安全高效,還提供了包管理、Trait等特性能使我們能更好的去模塊化動(dòng)態(tài)執(zhí)行部分。

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

4.2.1 輸入樣本池

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

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

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

4.2.3 可拓展的修改策略

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

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

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

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

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

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

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

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

5 結(jié) 論

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

猜你喜歡
插樁測(cè)試程序測(cè)試工具
邊緣智力兒童及其智力測(cè)試工具的研究進(jìn)展
基于TXL的源代碼插樁技術(shù)研究
Http并發(fā)連接測(cè)試工具
基于性能分析的自適應(yīng)插樁框架
基于Castle型機(jī)械手的三溫量產(chǎn)測(cè)試平臺(tái)實(shí)現(xiàn)
基于記錄重播的嵌入式系統(tǒng)死鎖檢測(cè)方法
手機(jī)APP交互界面人因適合性測(cè)試程序的設(shè)計(jì)與實(shí)現(xiàn)
中心主導(dǎo)制訂的《VHF/UHF頻率范圍內(nèi)測(cè)向系統(tǒng)測(cè)向靈敏度的測(cè)試程序》等兩項(xiàng)國(guó)際標(biāo)準(zhǔn)在ITU官網(wǎng)正式發(fā)布
電氣自動(dòng)化控制設(shè)備可靠性測(cè)試探討
福祿克推出先進(jìn)的連接式測(cè)試工具系統(tǒng)
抚顺市| 青川县| 南皮县| 香港| 车险| 黄骅市| 安仁县| 屯留县| 贺州市| 久治县| 宝山区| 星子县| 十堰市| 冷水江市| 镇巴县| 彰化市| 庄浪县| 腾冲县| 米脂县| 广汉市| 蓝山县| 东平县| 沂南县| 阿鲁科尔沁旗| 神池县| 长宁县| 固镇县| 会东县| 盐城市| 沾益县| 介休市| 宜昌市| 报价| 海南省| 柳河县| 龙山县| 略阳县| 大埔区| 贵阳市| 衡阳县| 辽阳县|