工地被强伦系列小说最新章节_丰满少妇被猛烈进入高清在线观看_九九精品99久久久香蕉_久色精品视频_男女互被舔69式免费视频_99精品久久免费看蜜臀剧情介绍_911精产国品一二三区在线观看 _边做饭边被躁高h小_国产gay男性玩奴sm_死神来了9在线观看完整版国语

模糊測試技術(shù)入門,Part 1-2

2021-03-02

模糊測試技術(shù)入門,Part 1:理論概述

R5f30c73115b63941e9cc8525d61302d8.jpg


首先,到底什么是模糊測試?當(dāng)我們對一個(gè)接收輸入(任何類型的輸入)的程序或函數(shù)進(jìn)行模糊測試時(shí),我們會嘗試不同的輸入組合,直至令程序崩潰或獲得其他想要的結(jié)果(經(jīng)常是內(nèi)存泄漏)為止。如果一個(gè)程序沒有正確地對其輸入進(jìn)行過濾的話,那么,當(dāng)用戶提供畸形或不正確的輸入內(nèi)容時(shí),就會導(dǎo)致程序崩潰,或引發(fā)意想不到或未定義的行為。對于模糊測試,大家可能聽說過的一個(gè)例子就是dirbusting技術(shù)——當(dāng)我們嘗試不同的URL,可以先從常見的開始,直到找到網(wǎng)站中的合法目錄為止。為了完成這種測試,我們可以借助于像fuff這樣的工具。

實(shí)際上,模糊測試技術(shù)特別適用于用低級編程語言或過時(shí)的編程語言編寫的程序,這些編程語言包括Basic、Assembly、C/C++等,因?yàn)檫@類程序在編寫過程中更容易出錯(cuò),比如不恰當(dāng)?shù)念愋娃D(zhuǎn)換、釋放后使用漏洞、或者內(nèi)存溢出漏洞(緩沖區(qū)溢出、棧溢出、整數(shù)溢出)。更重要的是,這些錯(cuò)誤通常不一定會導(dǎo)致運(yùn)行時(shí)崩潰或編譯時(shí)錯(cuò)誤,因此,它們更有可能被精明的攻擊者所利用。通常情況下,當(dāng)提到模糊測試一詞時(shí),指的就是這種類型的模糊測試。

模糊測試的類型

實(shí)際上,常見的模糊測試技術(shù)有三種,下面分別進(jìn)行介紹。

白盒模糊測試

我們所說的白盒模糊測試,實(shí)際上指的是這樣一種測試技術(shù):Fuzzer會試圖分析程序的內(nèi)部結(jié)構(gòu),以跟蹤和最大化代碼覆蓋率。代碼覆蓋率指的是我們的代碼所達(dá)到的分支比例;每次運(yùn)行if或while等條件語句時(shí),代碼都會選擇一個(gè)分支,也就是說,當(dāng)條件語句為真時(shí),代碼會選擇一個(gè)分支;當(dāng)條件為假時(shí),代碼會選擇另一個(gè)分支。白盒模糊測試的工作原理是,如果某個(gè)分支中隱藏著編程錯(cuò)誤,我們首先必須確保在第一時(shí)間到達(dá)了那個(gè)分支。要進(jìn)行這種分析,必須在編譯過程中對程序進(jìn)行插樁處理。

插樁技術(shù)的工作原理是,每次運(yùn)行一個(gè)分支時(shí),都會調(diào)用一個(gè)特殊的函數(shù),將該分支記錄為已經(jīng)運(yùn)行,有時(shí)甚至?xí)涗浤囊恍斜贿\(yùn)行,以便跟蹤覆蓋范圍。此外,插樁技術(shù)還可以用來發(fā)現(xiàn)安全漏洞。例如,Address Sanitation(ASan)有助于找到通常不會導(dǎo)致崩潰的內(nèi)存泄漏。由于完整的結(jié)構(gòu)分析需要消耗大量的系統(tǒng)資源,所以白盒模糊測試的速度通常很慢,但在尋找編程錯(cuò)誤和漏洞方面,效果還是非常好的,尤其是隱藏在程序深處的編程錯(cuò)誤和安全漏洞。當(dāng)然為了進(jìn)行廣泛的插樁分析,用戶必須能夠訪問源代碼,而源代碼并不總是可用的,特別是對于攻擊者來說,尤其如此。

黑盒模糊測試

對于這種模糊測試方法來說,我們并不關(guān)心程序的內(nèi)部結(jié)構(gòu),而是把它當(dāng)作一個(gè)黑盒子看待。不過,我們還是可以利用程序的輸出來試圖弄清楚程序里面發(fā)生的事情,從而制作出更巧妙、更有效的輸入。由于避免了白盒模糊測試相關(guān)的開銷,因此,黑盒模糊測試的速度要更快一些,但在挖掘編程錯(cuò)誤和安全漏洞方面,其效果要差一些。

灰盒模糊測試

這種方法試圖在上述方法各自的優(yōu)點(diǎn)和缺點(diǎn)之間取得平衡,它會在編譯時(shí)進(jìn)行輕量級的插樁處理,而不是進(jìn)行全面的分析處理,以便計(jì)算代碼覆蓋率和跟蹤程序的狀態(tài)。對于目前流行的大多數(shù)Fuzzer來說,如AFL、HongFuzz和LibFuzzer等,都是采用灰盒模糊測試技術(shù)。為了執(zhí)行這樣的模糊測試,通常需要訪問源代碼,但如果只有可執(zhí)行文件可用的話,也有一些變通的方法,但這些方法會嚴(yán)重影響其性能。在本文中,我不會講解這些技術(shù)。

模糊測試相關(guān)技術(shù)

和dirbusting技術(shù)一樣,模糊測試技術(shù)并不需要借助于暴力攻擊,也就是嘗試隨機(jī)輸入。事實(shí)上,暴力攻擊并不是一種很好的模糊測試技術(shù),而且很少有人這樣做。幸運(yùn)的是,實(shí)際上還有一些更聰明的技術(shù),可以在合理的時(shí)間和資源內(nèi)帶來更好的結(jié)果。接下來,我將討論其中的兩種。

基于突變的模糊測試技術(shù)

這種技術(shù)是基于灰盒模糊測試的。也就是說,我們首先從有效的、形式良好的輸入開始,并對其應(yīng)用各種類型的突變處理。同時(shí),我們還可以利用插樁技術(shù),來獲得最成功的突變,揭示新的分支,并把它們作為下一代的種子。這個(gè)過程有點(diǎn)讓人聯(lián)想到我們在自然界看到的達(dá)爾文自然選擇。實(shí)際上,這種方法還能帶來另外一個(gè)好處,那就是被程序過濾掉的突變會被淘汰,這樣的話,就會只留下有用的輸入。

對于該技術(shù),最著名的工具(也可以說是最著名的Fuzzer)是AFL,即American Fuzzy Lop。

AFL使用三種類型的基本突變,具體如下所示:

·隨機(jī)刪除一個(gè)二進(jìn)制位

·隨機(jī)插入一個(gè)二進(jìn)制位。

·隨機(jī)翻轉(zhuǎn)一個(gè)二進(jìn)制位(把0變成1,把1變?yōu)?)。

AFL在任何時(shí)候都不會只使用一種突變處理,而是在多種突變處理之間分配資源,并優(yōu)先選擇“能量”最大的突變。每個(gè)突變的“能量”取決于它運(yùn)行的代碼中的具體分支:由于輸入越多的分支越為罕見,因此會為其分配更多的能量。此外,由于每個(gè)分支都有一個(gè)唯一的哈希值,這樣就可以跟蹤其執(zhí)行次數(shù)。值得一提的是,這種技術(shù)中的初始輸入可以來自提供各種突變的字典。

基于語法的模糊測試技術(shù)

您可能知道,有許多程序是無法接收非結(jié)構(gòu)化輸入的,因?yàn)樗鼈儗θ绾涡纬奢斎胗刑囟ǖ囊?guī)則。這些規(guī)則被稱為輸入的語法,因?yàn)樗鼈冾愃朴诳谡Z中的語法規(guī)則。為了對這類程序進(jìn)行模糊測試,并使其涵蓋大多數(shù)語法選項(xiàng),F(xiàn)uzzer必須了解相關(guān)的語法,否則,直接使用簡單突變產(chǎn)生的輸入的話,它們將被過濾和丟棄。這樣的模糊Fuzzer早已面世,可以對JavaScript、WASM、URL等進(jìn)行模糊測試,但截至本文寫作時(shí),大部分都是實(shí)驗(yàn)性的,而且速度很慢,據(jù)我所知,這些Fuzzer都是用Python編寫的,對于原型設(shè)計(jì)和演示來說,Python語言是個(gè)不錯(cuò)的選擇,但對于優(yōu)化的生產(chǎn)級Fuzzer來說,該語言就有點(diǎn)力不從心了。因此,它們的應(yīng)用并不廣泛。

小結(jié)

在本文中,我們對模糊測試的理論進(jìn)行了簡單的介紹,在本系列的下一篇文章中,我們將為讀者詳細(xì)介紹如何利用AFL對一個(gè)簡單的程序進(jìn)行模糊測試。

模糊測試技術(shù)入門,Part 2:基于AFL的模糊測試技術(shù)

在本文中,我將將為讀者詳細(xì)介紹如何在可以訪問源代碼的情況下通過AFL進(jìn)行模糊測試。為了便于演示,這里將以GitHub網(wǎng)站上一個(gè)名為ccalc的開源程序?yàn)槔M(jìn)行講解。顧名思義,這是一個(gè)用C語言編寫的簡單計(jì)算器。之所以選擇它,是因?yàn)槲艺J(rèn)為這個(gè)程序較舊,有較大概率可以通過模糊測試在其中發(fā)現(xiàn)導(dǎo)致崩潰的漏洞,正如您將看到的,事實(shí)證明這個(gè)猜測是正確的。

首先,我們需要確定一個(gè)目標(biāo)。就這里來說,我決定直接對main()函數(shù)進(jìn)行模糊測試,而不是尋找一些特定的函數(shù)進(jìn)行模糊測試。其原因是,該程序在將輸入內(nèi)容交給實(shí)際進(jìn)行計(jì)算的函數(shù)之前,會先通過一系列函數(shù)解析原始的輸入內(nèi)容。由于該程序在解析過程中會篩選掉不正確的輸入,因此直接特定函數(shù)是不合理的。

最初的main()函數(shù)大致如下所示(我稍微刪減了一下):


概括來說,它包含兩個(gè)分支:要么通過argc、argv[]獲得輸入,要么通過標(biāo)準(zhǔn)輸入(stdin)獲得輸入。我不知道為什么,但AFL的創(chuàng)建者明確建議不要通過argc、argv[]以及所有其他在線資源進(jìn)行模糊測試。因此,我對這個(gè)函數(shù)做了一些修改:首先,我刪除了處理來自argc、argv的輸入內(nèi)容的代碼,然后盡可能地對其進(jìn)行優(yōu)化。畢竟,每次Fuzzer嘗試另一個(gè)輸入時(shí),都會執(zhí)行這個(gè)函數(shù)。因此,如果該函數(shù)效率低下的話,會拖慢整個(gè)測試過程。修改后的函數(shù)如下所示:


在這里,請注意我添加的循環(huán)語句。它指示AFL使用持久模式。在AFL的默認(rèn)模式下,每當(dāng)AFL運(yùn)行程序時(shí),它都會使用系統(tǒng)調(diào)用fork()來創(chuàng)建一個(gè)新的子進(jìn)程。但是,由于這個(gè)系統(tǒng)調(diào)用的開銷非常大,從而會嚴(yán)重拖慢整個(gè)模糊測試過程。當(dāng)使用持久模式時(shí),F(xiàn)uzzer會重復(fù)使用同一個(gè)進(jìn)程。這樣做的唯一的要求是,在每次循環(huán)運(yùn)行時(shí)都要擦除所有變量和緩沖區(qū)。

修改上面的函數(shù)后,將其保存到名為harness.c的文件中。在編譯代碼時(shí),為了使用該文件而不是main.c編譯程序,需要對automake文件進(jìn)行相應(yīng)的修改。修改前的automake文件如下所示:

將其改為:

現(xiàn)在,我們就可以對程序進(jìn)行模糊測試了。為此,可以通過automake來生成make文件,然后執(zhí)行下列命令:

這樣程序就可以通過AFL進(jìn)行插樁并編譯了。

現(xiàn)在,唯一要做的就是創(chuàng)建AFL的初始輸入文件夾,這里將其命名為“in”,將輸出文件夾命名為“out”。在輸入文件夾中,可以存放簡單文本文件(沒有格式),用于提供合法的輸入,比如“20/2”或“5*4”。由于我們想同時(shí)運(yùn)行多個(gè)AFL進(jìn)程(每個(gè)進(jìn)程在自己的CPU核上運(yùn)行),所以,我們需要為每個(gè)進(jìn)程創(chuàng)建一個(gè)單獨(dú)的輸入文件夾。


要進(jìn)行模糊測試,只需運(yùn)行下面的命令即可:

上面,我們創(chuàng)建了第一個(gè)進(jìn)程,下面,我們再來創(chuàng)建下一個(gè):

然后,如法炮制。

從下面的截圖中可以看到,AFL提供了一個(gè)GUI,用于顯示模糊測試過程的重要信息。例如,在map coverage部分出了覆蓋率,在findings in depth部分,GUI也給出了崩潰次數(shù)和相關(guān)信息。


在發(fā)現(xiàn)足夠數(shù)量(具體數(shù)量由您決定)的崩潰后,通常是在長時(shí)間沒有發(fā)現(xiàn)新的獨(dú)特崩潰后,我們就可以終止該進(jìn)程了。對于運(yùn)行的每一個(gè)AFL進(jìn)程,都會在輸出文件夾中生成一個(gè)單獨(dú)的文件夾。


在這些文件夾里面,數(shù)據(jù)是這樣排列的:


現(xiàn)在,我們對它們分別加以介紹:

·plot_data:以有助于生成圖形的形式提供信息。

·fuzzer_stats:模糊測試過程中的統(tǒng)計(jì)數(shù)據(jù)。

·fuzz_bitmap:一個(gè)bitmap,其中每個(gè)字節(jié)對應(yīng)于程序的一個(gè)分支。

·“AFL維護(hù)著一個(gè)“fuzz bitmap”,其中的每個(gè)字節(jié)代表著被測試程序中某一分支被測試的次數(shù)。AFL不會在特定分支和bitmap中的字節(jié)之間進(jìn)行一對一的映射。相反,AFL的嵌入式插樁技術(shù)會將一個(gè)隨機(jī)的兩個(gè)字節(jié)的常量ID放入每個(gè)分支。每當(dāng)執(zhí)行到一個(gè)被檢測的分支時(shí),AFL就會對新分支的ID和到達(dá)新分支之前看到的最后一個(gè)分支ID進(jìn)行XOR處理。這樣就捕獲到了當(dāng)前分支和到達(dá)該分支的唯一路徑(例如當(dāng)同一個(gè)函數(shù)從代碼中的多個(gè)位置被調(diào)用時(shí))。然后,AFL會使用哈希函數(shù)對用XOR處理過的值進(jìn)行相應(yīng)的處理,以確定bitmap中的哪個(gè)條目代表該分支組合。每當(dāng)一個(gè)特定的分支組合被測試后,bitmap中對應(yīng)的字節(jié)中的值就會遞增。"

·cmdline:提供給AFL的命令。實(shí)際上,就是該程序的名稱。

·.cur_input:當(dāng)前的輸入。

·queue:到現(xiàn)在為止嘗試過的所有輸入。

·crashes與hangs:用于存放測試結(jié)果。這些文件夾中的每個(gè)文件都包含了導(dǎo)致崩潰或掛起的輸入內(nèi)容。在每個(gè)文件名中指定的是崩潰的內(nèi)核信號(當(dāng)然與掛起無關(guān)),AFL用來創(chuàng)建導(dǎo)致崩潰的輸入的ID,AFL的運(yùn)行時(shí)間,以及用來從其種子生成輸入的突變方式。


——END——

  更多網(wǎng)站設(shè)計(jì)、網(wǎng)頁設(shè)計(jì)等相關(guān)內(nèi)容,歡迎您咨詢中山網(wǎng)訊科技!
  
責(zé)任編輯:中山網(wǎng)站建設(shè)
     【網(wǎng)訊網(wǎng)絡(luò)】國家高新技術(shù)企業(yè)》十二年專注軟件開發(fā),網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),APP開發(fā),小程序,微信公眾號開發(fā),定制各類企業(yè)管理軟件(OA、CRM、ERP、OMS訂單管理系統(tǒng)、WMS進(jìn)銷存管理軟件等)!服務(wù)熱線:0760-88610046、13924923903,http://www.denorpool.com

您的項(xiàng)目需求咨詢熱線:0760-88610046(國家高新技術(shù)企業(yè))

*請認(rèn)真填寫需求,我們會在24小時(shí)內(nèi)與您取得聯(lián)系。