找到最奇怪的錯(cuò)誤:十款優(yōu)秀模糊測(cè)試工具
在創(chuàng)建應(yīng)用程序時(shí),程序員會(huì)花費(fèi)大量時(shí)間預(yù)測(cè)用戶將如何使用他們的軟件以及這些操作會(huì)產(chǎn)生什么樣的效果。優(yōu)秀的程序員不僅有著簡(jiǎn)潔、高效的編碼質(zhì)量,還要考慮到發(fā)生意外的情況。但沒有人能夠預(yù)測(cè)用戶所有的可能操作,尤其是非常規(guī)性的操作(比如黑客攻擊,安全人員尤其關(guān)注這一點(diǎn)),這時(shí)就需要模糊測(cè)試(fuzzing)。
什么是模糊測(cè)試?
模糊測(cè)試(以下簡(jiǎn)稱模測(cè))是一個(gè)自動(dòng)化的過程,在這個(gè)過程中,測(cè)試引擎嘗試向應(yīng)用程序發(fā)送大量意外的、錯(cuò)誤的或隨機(jī)的輸入,以觀察程序的反應(yīng)。然后,再根據(jù)情況編寫合適的響應(yīng)代碼,盡可能的保證應(yīng)用程序的穩(wěn)定性和安全性。
例如,如果一個(gè)電子商務(wù)網(wǎng)站用戶訂購(gòu)了200億件緊腰夾克,會(huì)發(fā)生什么?網(wǎng)站會(huì)崩潰嗎?會(huì)打折嗎?或者拿它當(dāng)正常訂單處理嗎?再比如,如果用戶輸入了有效的優(yōu)惠券代碼,但輸錯(cuò)了地方會(huì)發(fā)生什么?回到網(wǎng)絡(luò)安全上,如果惡意用戶輸入命令行功能、加密內(nèi)容、操作系統(tǒng)命令或原始代碼,應(yīng)用程序?qū)⑷绾畏磻?yīng)?
一個(gè)好的模測(cè)引擎可以回答所有這些問題,甚至更多。
模測(cè)工具如何工作?
由于模測(cè)的價(jià)值,有相當(dāng)多的商業(yè)工具售賣,也有數(shù)百個(gè)優(yōu)秀程序員在GitHub等平臺(tái)上共享的免費(fèi)工具。有不同類別的模測(cè)工具,如以發(fā)送大量隨機(jī)信息為特色的,再比如,通過非常規(guī)輸入來檢測(cè)運(yùn)行中的程序,還有專門用于測(cè)試可編程接口(API)的工具。
在大多數(shù)情況下,模測(cè)的目標(biāo)是生成一些有效的意外數(shù)據(jù),當(dāng)然,至少是能夠被測(cè)試軟件解析器接受的數(shù)據(jù)。然后,提交應(yīng)用程序?qū)Ψ钦]斎胨a(chǎn)生的結(jié)果,最為典型的,如程序崩潰。
模測(cè)工具可以支持各種編程語言進(jìn)行測(cè)試,主流的如C、C++、Go、Rust、Python、Java、Kotlin、Scala和Swift。還有些測(cè)試工具只使用單一語言的應(yīng)用程序測(cè)試。如,Python程序員的特定工具。但不管是哪種語言,合適的才是最好的。
本文嘗試推薦一些頂級(jí)的模測(cè)工具。商業(yè)工具來自O(shè)WASP網(wǎng)站上的列表,免費(fèi)工具則是在GitHub上搜索“fuzz”,按“打星”的人氣數(shù)量排序,同時(shí)也兼顧另一個(gè)衡量受歡迎程度的指標(biāo),即該項(xiàng)目被分叉(fork)的次數(shù)。
四款商業(yè)模測(cè)
1. beSTORM
Beyond Security出品的beSTORM是商業(yè)市場(chǎng)上最通用的模測(cè)之一。無需訪問源代碼即可執(zhí)行測(cè)試,幾乎可與任何應(yīng)用程序、協(xié)議、語言乃至硬件一起工作,甚至還可以測(cè)試為特定行業(yè)和特種應(yīng)用設(shè)計(jì)的設(shè)備和程序。比如物聯(lián)網(wǎng)、過程控制應(yīng)用、與can總線兼容的汽車應(yīng)用、航空工具和低耗能藍(lán)牙設(shè)備。
多功能性是beSTORM的最為突出的價(jià)值所在,程序員只需學(xué)習(xí)使用單個(gè)界面,就可以針對(duì)幾乎無限數(shù)量的設(shè)備或應(yīng)用程序發(fā)起模測(cè)。beSTORM測(cè)試平臺(tái)預(yù)置了250個(gè)測(cè)試模塊,并且還能輕松地添加新的模塊,以覆蓋另類或?qū)S械膽?yīng)用程序。
此外,beSTORM還可以作為云服務(wù)訪問。通過這種方式,一個(gè)大型機(jī)構(gòu)可以購(gòu)買該平臺(tái),然后向不同地點(diǎn)的多個(gè)用戶提供模測(cè)工具的使用。
2. CI Fuzz
該工具內(nèi)置在一個(gè)Ubuntu虛擬機(jī)中,在本地或云端均可部署。將CI Fuzz集成到CI/CD(持續(xù)集成和持續(xù)交付)管道中,就可以在每次“pull Request"時(shí)自動(dòng)運(yùn)行。由于它是CI/CD過程的一部分,所以能夠防止程序在有了新的更改時(shí),無意中增加漏洞或破壞程序。如果發(fā)生問題也能很快被標(biāo)記,從而很容易確定何時(shí)引入的程序錯(cuò)誤。
每當(dāng)CI Fuzz檢測(cè)到錯(cuò)誤時(shí),它立即開始發(fā)送該輸入的不同組合,以嘗試映射問題的范圍。然后生成一份詳細(xì)的報(bào)告,以消除誤報(bào),并能夠幫助程序員在修復(fù)代碼時(shí)手動(dòng)重現(xiàn)這些錯(cuò)誤。
CI Fuzz引擎需要直接訪問被測(cè)程序或應(yīng)用程序的源代碼,因此它只支持某些語言和框架,主要為C、C++、Java和Go。但該工具正在努力集成其他框架,如.Net Core和Python。
3. 新思模測(cè)套件(FTS)
與大多數(shù)產(chǎn)品相比,新思的模測(cè)產(chǎn)品有著不同的做法。FTS是一整套測(cè)試工具,每一個(gè)工具都針對(duì)于特定的語言、協(xié)議或用例,而不是一個(gè)測(cè)試工具去匹配盡可能對(duì)的應(yīng)用程序。這種做法的好處在于,用戶可以購(gòu)買他們所需要模測(cè)工具,而無需購(gòu)買他們可能永遠(yuǎn)不會(huì)需要的額外功能。
每個(gè)工具都有一組標(biāo)準(zhǔn)的功能,比如一組高度相關(guān)的現(xiàn)成測(cè)試用例、一個(gè)結(jié)果和報(bào)告分析組件、一個(gè)用于配置工具的圖形界面,以及如何使用它的說明文檔等。
FTS包括各種針對(duì)性的測(cè)試工具,從DNS服務(wù)器等常見組件,到CAN總線或IKEv2等很小眾、專業(yè)的應(yīng)用程序。用戶購(gòu)買工具時(shí),還可配送一定程度的支持。
4. Mayhem for Code
ForAllSecure的這款模測(cè)具備大多數(shù)模測(cè)引擎的優(yōu)點(diǎn),并兼具額外的學(xué)習(xí)功能,因此可隨著使用時(shí)間的延長(zhǎng)變得更加高效。該平臺(tái)可獨(dú)立運(yùn)行,盡量減少人工干預(yù)。
Mayhem for Code在持續(xù)運(yùn)行期間,可學(xué)習(xí)環(huán)境并挖掘利用系統(tǒng)的深度信息。它甚至可以根據(jù)所學(xué)到的知識(shí)動(dòng)態(tài)生成測(cè)試用例。簡(jiǎn)而言之,使用的次數(shù)越多、時(shí)間越長(zhǎng),它就能變得愈加高效和獨(dú)立。
該平臺(tái)目前可支持多種語言,如Java、Python、Ada、OCaml、Fortran、Jovial、C、C++、Go和Rust,且無需訪問源代碼。
六款免費(fèi)/開源模測(cè)
1. PeachTech
PeachTech的模測(cè)在2020年之前一直都是商業(yè)付費(fèi)產(chǎn)品,直到2020年被GitLab收購(gòu),并放出免費(fèi)版本的PeachTech項(xiàng)目,但不再受支持或更新。
PeachTech投入了大量精力,具有高度可配置性,幾乎可以用任何語言或在任何操作系統(tǒng)上運(yùn)行。然而,其說明文檔非常復(fù)雜,又取消了產(chǎn)品支持,用戶需要了解很多模測(cè)試的知識(shí),以及使用的語言或框架,才能獲得該工具的益處。非專業(yè)人員不適用。
2. Google OSS-Fuzz
谷歌在為Chrome操作系統(tǒng)或?yàn)g覽器開發(fā)新組件時(shí),模測(cè)起到了很大的幫助作用,谷歌遂將其開源。
OSS-Fuzz適用于x86-64和i386版本,并利用了其他幾種模測(cè)引擎,包括AFL++、libFuzzer和Hongfuzz,并支持多種語言,包括C、C++、Rust、Go、Python和Java/JVM代碼。
OSS-Fuzz是目前GitHub上評(píng)價(jià)最高的項(xiàng)目之一,擁有一個(gè)很大的社區(qū),并在開源社區(qū)中得到很多支持。
3. FuzzDB
FuzzDB本身并不是一個(gè)模測(cè)引擎,而是一個(gè)復(fù)雜的攻擊載荷庫和注入技術(shù)庫(也許是世界上最大的庫),用于破壞或入侵未得到恰當(dāng)保護(hù)的程序和應(yīng)用。這些攻擊以各種方式進(jìn)行分類,例如按平臺(tái)類型、已知問題、潛在源暴露,以及許多其他的分類。
FuzzDB庫的最佳利用方式,就是與可編程模測(cè)引擎結(jié)合。將FuzzDB中的攻擊模式加載在模測(cè)引擎中,配合模測(cè)的隨機(jī)輸入,可覆蓋很大范圍,從已知攻擊和漏洞到未知攻擊和未發(fā)現(xiàn)的漏洞。
4. Ffuf (Fuzz Faster U Fool)
Ffuf是一個(gè)用Go語言編寫的模測(cè)引擎。對(duì)于免費(fèi)工具而言,它好用的出人意料。
它可以執(zhí)行最常見的模測(cè)功能,如檢查應(yīng)用程序?qū)ξ粗腉ET和POST請(qǐng)求的反應(yīng)。Ffuf沒有什么用戶界面,主要使用命令行功能。但一旦學(xué)習(xí)了這些功能,就會(huì)了解它的強(qiáng)大之處。
Ffuf在GitHub上有許多如何部署的示例,開發(fā)人員還會(huì)定期發(fā)布新的功能和特性。雖然它是免費(fèi)的,但屬于贊助模式,新功能將優(yōu)先發(fā)布給那些付費(fèi)贊助該工具進(jìn)一步開發(fā)的人。30天后,其他才可以使用新功能。
5. Google ClusterFuzz
Google ClusterFuzz是用來檢查Chrome漏洞的模測(cè)引擎,它也是上述第二個(gè)免費(fèi)工具OSS-Fuzz項(xiàng)目后端的一部分。但ClusterFuzz適用于任何程序或應(yīng)用,而不僅僅是開源領(lǐng)域的程序或應(yīng)用。
有了ClusterFuzz在后端的配合,OSS-Fuzz在谷歌產(chǎn)品中成功發(fā)現(xiàn)了超過2.9萬個(gè)bug,在開源項(xiàng)目中成功發(fā)現(xiàn)了2.6萬個(gè)bug。ClusterFuzz還設(shè)計(jì)成可在任何環(huán)境下運(yùn)行,并具有高度可擴(kuò)展性。該項(xiàng)目的GitHub頁面列出了ClusterFuzz與10萬臺(tái)虛擬機(jī)一起工作的一個(gè)項(xiàng)目,可以說滿足任何人所需要的可伸縮性。
6. go-fuzz
該平臺(tái)是一個(gè)有著高分評(píng)級(jí)的模測(cè)工具,針對(duì)性地測(cè)試go語言中的包。它主要用于解析復(fù)雜文本和二進(jìn)制輸入的數(shù)據(jù)包。作者在Github的該項(xiàng)目頁面中的說明,go-fuzz對(duì)于加固系統(tǒng)尤其有用,這些系統(tǒng)解析來自潛在惡意用戶的輸入,例如通過網(wǎng)頁公開部署的任何內(nèi)容。
go-fuzz的說明文檔很好地描述了使用方法,同時(shí),還附帶了一個(gè)存儲(chǔ)庫,包含了大量測(cè)試函數(shù)和和初始輸入設(shè)置的許多示例。
觀點(diǎn)
模糊測(cè)試不再只是一個(gè)異想天開的高級(jí)選項(xiàng),來自ISO和其他知名機(jī)構(gòu)的許多重要標(biāo)準(zhǔn)現(xiàn)在都推薦它??梢灶A(yù)見,不遠(yuǎn)的將來它一定會(huì)成為程序測(cè)試的其中一個(gè)標(biāo)準(zhǔn)。