前言
在之前關(guān)于AFL的程序執(zhí)行路徑在AFL第三節(jié)講過详羡,首先是afl-gcc對每個基本塊隨機賦予一個隨機值州弟,然后在執(zhí)行的時候钧栖,通過fork()后的“子進程”去執(zhí)行插樁的部分代碼,把隨機值亦或后的字節(jié)加一婆翔,通過共享的bitmap存儲區(qū)域就可以知道執(zhí)行當前種子的bitmap(執(zhí)行路徑)是多少了拯杠。但是存在幾點問題:1、bitmap利用率啃奴,bitmap大小為65536個字節(jié)潭陪,有些程序的邊可能會超過(概率很小)最蕾,但是也存在很多利用率不足的問題依溯。2、可能存在碰撞瘟则,因為隨機分配的值就有可能相同黎炉,其次異或操作之后可能會相同,那么兩條不同的邊對應(yīng)的值卻相等了醋拧。
有一個解決方法就是使用Intel Processor Tracing慷嗜,Intel研發(fā)的一個程序跟蹤功能,這個部件可以直接對二進制程序進行跟蹤丹壕。由于程序執(zhí)行的時候庆械,它本身的代碼在CPU中的地址是固定的,PT可以返回CPU中的數(shù)據(jù)流操作雀费,通過篩選程序的地址的包信息干奢,就可以獲取程序的操作流從而獲得程序執(zhí)行路徑。舉個例子盏袄,hello world這個程序運行的時候忿峻,基本塊在CPU中的id是45-90,那么運行這個程序的時候使用PT就可以捕獲CPU中的執(zhí)行數(shù)據(jù)辕羽,可能有很多包(包括鼠標逛尚、顯示器、其他程序刁愿、終端等等)绰寞,篩選id在45-90的PT包,這些數(shù)據(jù)包就是運行“hello world”產(chǎn)生的包信息,然后對包信息中的基本塊id就可以描繪出程序執(zhí)行的邊路徑了滤钱。因為一個程序載入內(nèi)存運行后地址是固定的觉壶,準確無碰撞,且不依靠源碼的插樁件缸,還比AFL自帶的QEMU模式快不少铜靶,成為一個不錯的方法。
我在這就介紹以下在fuzz中使用的一個PTFuzzer他炊、NEUFuzz和Honggfuzz争剿。
PTFuzz
這個工具是在AFL的基礎(chǔ)上做出了改進,把AFL的基礎(chǔ)上去除了插樁的依賴痊末,把run_target里面的fork子進程跑插樁代碼部分改成fork一個子進程利用PT收集包信息蚕苇、篩選包信息,根據(jù)包信息獲取當前種子的執(zhí)行路徑凿叠。
簡單說一下他的創(chuàng)新點:
利用PT包信息
通過PT部件可以獲得兩個種類的包信息:基本執(zhí)行信息(時間戳計時器涩笤、包流邊界等)和控制流信息(時間、程序執(zhí)行流等)幔嫂。PT提供了三類調(diào)用包:直接調(diào)用辆它、間接調(diào)用和遠轉(zhuǎn)換調(diào)用誊薄。當捕獲了這樣的Change of Flow Instructions(COFI)包時履恩,就可以獲取基本塊的跳轉(zhuǎn)信息,即邊信息呢蔫。
不同于統(tǒng)一大小的bitmap
AFL中的bitmap時固定大星行摹(65536),而PTfuzz會在初始化載入二進制程序的時候片吊,就構(gòu)建了COFI map绽昏。利用python的CLE和capstone庫把程序中text部分的調(diào)用地址記錄下來并且存放在MSR寄存器,那么MSR寄存器就可以用來篩選PT的包信息俏脊。(MSR寄存器是PT指定可以實現(xiàn)篩選功能的寄存器)全谤。
在實驗部分,分為對有源碼的代碼進行測試比較和對二進制程序進行測試比較爷贫。
在有源碼可插樁的代碼比較中认然,PTfuzz比AFL稍慢(有python編寫的decoder的腳本收集PT包信息并處理得到運行路徑),但是可以測試出更多漏洞漫萄,并且在單位時間發(fā)現(xiàn)更多的邊卷员。
在無源碼的二進制程序比較中,PTfuzz優(yōu)于QEMU模式的AFL腾务,QEMU需要使用虛擬化技術(shù)毕骡,性能比AFL源碼插樁速度慢2到5倍,因此發(fā)現(xiàn)的邊信息也就比PTFuzz少了。
最后說一下PTFuzz文章中說的不足未巫,需要使用包含PT功能的Intel芯片窿撬,內(nèi)核版本有限制,必須在linux使用叙凡,這些局限導致了PTFuzz不能廣泛使用尤仍。
NeuFuzz
這個fuzzer看名字是深度網(wǎng)絡(luò)訓練,由兩部分組成狭姨,offline的深度學習模塊和正常的PTFuzz部分宰啦,在PTFuzz的種子選取部分,通過加入預測模型對種子進行排序饼拍,預測模型認為是1(vulnerable seed)的種子會優(yōu)先執(zhí)行赡模,更快地發(fā)現(xiàn)crash。
訓練模型
在模型訓練方面师抄,他選了NIST SARD項目(人工合成注入的漏洞)漓柑、Gtihub項目和Exploit-DB的項目。認為存在漏洞或者有注入漏洞的為vulnerable 程序叨吮,打過補丁或者沒有注入漏洞的程序為non-vulnerable程序辆布。一共收集了28475個vulnerable和27436個non-vulnerable。
然后通過使用POC(能觸發(fā)漏洞的輸入)跑上面這些程序茶鉴,如果觸發(fā)漏洞锋玲,程序執(zhí)行路徑稱為vulnerable path,反之涵叮,為non-vulnerable path惭蹂。同時用PT來獲取執(zhí)行路徑。
再把獲取到的執(zhí)行路徑轉(zhuǎn)換成向量形式割粮。NEUFuzz選擇了Word2vec(這個機器學習對向量長度有一定限制盾碗,輸入一大就不行了)。每條指令的地址(如0x223344)就轉(zhuǎn)換成向量舀瓢,路徑中指令數(shù)的上限為n伦乔,不足n的用0向量補齊祝峻。在Word2vec轉(zhuǎn)換后盛龄,使用LSTM(長短期記憶網(wǎng)絡(luò))這個深度學習網(wǎng)絡(luò)進行學習夜牡。在后面的結(jié)果顯示他的模型準確率高達92%。
online fuzz
之前提到過PT利用TNT(jnz朵锣,je這樣的直接調(diào)用)谬盐、TIP(call,jmp這樣的間接調(diào)用)和FUP(exception诚些、interrupt這樣的遠程調(diào)用)獲取hit的基本塊并記錄邊信息飞傀。NEUFuzz則繼續(xù)利用PT皇型,在對種子重跑獲取執(zhí)行路徑后使用預測模型判斷種子是否是vulnerable。
結(jié)果
NEUFuzz使用和PTFuzz一樣的實驗程序——LAVA-M以及一些實際存在程序(libtiff砸烦、binutils等)弃鸦。效果非常好,可能是因為有深度網(wǎng)絡(luò)的輔助幢痘,在PTFuzz基礎(chǔ)上更快找到crash唬格。很明顯,因為PTFuzz是coverage-oriented颜说,這是改善了覆蓋信息购岗,NEUFuzz在此基礎(chǔ)上還做了crash-oriented。
個人覺得他這樣的實驗不是很好门粪,雖然深度學習網(wǎng)絡(luò)的應(yīng)用增加了效率喊积,但是他只跟PTFuzz比較,在a的基礎(chǔ)上加了優(yōu)點變成b玄妈,只跟a比卻不跟基礎(chǔ)AFL乾吻、AFL的變種進行比較或者跟其他二進制程序fuzz的fuzzer比較是有失公允的。
Honggfuzz
面向安全的Honggfuzz模糊測試器是多線程的拟蜻,而且經(jīng)過了優(yōu)化绎签,可以利用各種系統(tǒng)資源。很多模糊測試工具必須運行多個實例才能達到這種效果酝锅,但Honggfuzz自動使用所有可用CPU核心加速模糊測試過程诡必。
Honggfuzz不僅僅適用于Windows,也可以測試在Linux屈张、Mac擒权,甚至Android環(huán)境中運行的應(yīng)用程序。由于其多平臺適用的特性阁谆,Honggfuzz有一系列例子和測試用例可供開發(fā)人員使用,或一字不改直接套用愉老,或根據(jù)自身需求加以修改场绿,或者僅做簡單參考以便設(shè)計自己的模糊測試規(guī)則。
可能是由于能在多平臺執(zhí)行模糊測試的能力嫉入,Honggfuzz用來展示開發(fā)人員捕獲漏洞的戰(zhàn)果頁面相當龐大焰盗。開發(fā)者介紹,找出引發(fā)全球安全補丁的OpenSSL關(guān)鍵漏洞的模糊測試工具僅此一款咒林。
關(guān)于honggfuzz的文章大家可以去看這篇https://bbs.pediy.com/thread-247954.htm
熬拒,講的非常到位。