自1988年威斯康星大學的Barton Miller首次提出模糊測試這一概念以來,模糊測試領域經歷了持續長久發展。模糊測試作為一種軟件測試方法,旨在通過向程序輸入模糊、隨機、異常的數據,探測和發現潛在的漏洞和錯誤。這種方法備受安全研究人員的青睞。隨著時間的推移,這一領域呈現出了蓬勃發展的景象,出現了豐富多樣的模糊測試工具。
根據測試的特定目標,模糊測試工具可以被劃分為不同類別,包括文件格式類模糊測試工具、網絡協議類模糊測試工具、操作系統類模糊測試工具、Web服務類模糊測試工具、專注于特定編程語言的模糊測試工具等等。這些不同類型的模糊測試工具為軟件安全性的提升帶來了創新性的貢獻。它們有針對性地探索和發現軟件中的漏洞和脆弱性,能夠幫助安全人員更好地了解潛在的安全隱患。
模糊測試領域涌現出了眾多可供選擇的工具,下面將介紹一些知名的開源模糊測試工具,以便幫助讀者選擇最適合自己需求的工具。
文件格式類模糊測試工具
文件格式類模糊測試工具主要用于測試文件格式解析器的健壯性和安全性,它專門針對某些文件格式,例如PDF、JPEG、MP3等。通過生成不符合文件規范的隨機輸入數據去嘗試觸發目標程序中未處理的異常情況,包括緩沖區溢出、內存泄漏等錯誤。
01
AFL
AFL(American Fuzzy Lop)是由安全研究員Micha? Zalewski(@lcamtuf)開發的一款基于覆蓋引導(Coverage-guided)的模糊測試工具,它通過記錄輸入樣本的代碼覆蓋率,從而調整輸入樣本以提高覆蓋率,增加發現漏洞的概率。
02
WinAFL
WinAFL是AFL的Windows版本,是一款專為Windows平臺設計的開源模糊測試工具。與傳統的AFL不同,WinAFL使用DynamoRIO動態插樁技術來監視目標程序的執行,收集代碼覆蓋率信息,并依此反饋來調整輸入樣本。
03
libFuzzer
libFuzzer是一款由LLVM項目開發的開源模糊測試庫,用于進行持續、進化的模糊測試。與AFL等其他工具不同,libFuzzer是一個針對庫函數的模糊測試器,它直接與目標庫函數鏈接,無需與外部程序進行交互。
網絡協議類模糊測試工具
網絡協議類模糊測試工具是一種專門用于測試網絡協議實現的安全和健壯性的測試工具。通過向目標系統發送隨機或半隨機的、可能違反協議規范的數據包,試圖去引發目標系統的異常行為,例如崩潰、內存錯誤、或者更嚴重的安全問題。
01
Peach Fuzzer
Peach之前是一個遵守MIT開源許可證的模糊測試框架,是第一款綜合性的開源工具,其中創建模糊器由XML語言實現。Peach主要有3個版本,最初采用Python語言編寫,發布于2004年;第二版于2007年發布;Peach 3發布于2013年初,使用C#重寫了整個框架。Peach支持對文件格式、網絡協議、API等進行模糊測試。Peach提供了豐富的擴展和定制功能,以適應各種不同的測試需求和場景。值得注意的是在2020年Peach被GitLab收購,不再開源。
02
Boofuzz
Boofuzz是一個開源的由Python編寫的網絡協議模糊測試框架,繼承自Sulley。Boofuzz提供了對于網絡協議進行模糊測試的規范和功能函數,以此作為基礎,我們可以編寫針對自己目標的Python腳本,從而可以針對特定目標量身定制模糊測試工具。
03
AFLNet
AFLNet 是一款灰盒協議模糊測試工具,采用了代碼覆蓋率反饋、種子變異以及狀態反饋等技術。與傳統的基于生成的協議模糊測試工具相比,它采用Server和 Client之間的通信消息數據作為種子,無需任何的協議規范。本質上是模擬一個Client來發送一系列消息到 Server,并保留可以觸發新的代碼執行路徑或者響應狀態的變異數據。AFLNet使用Server 端的響應碼來識別消息序列觸發的不同狀態,根據這種反饋,AFLNet 可以盡可能向有效的狀態區域靠近。
操作系統類模糊測試工具
操作系統類模糊測試工具是一種專門針對操作系統內核和相關組件進行模糊測試的工具,旨在自動發現和識別潛在的漏洞和缺陷。通過生成隨機或半隨機的輸入,并將其送入操作系統的各個層次和接口,模糊測試工具試圖觸發非預期的行為。與常規的模糊測試工具不同,操作系統模糊測試工具需處理更復雜的環境和上下文,通常涉及對底層硬件、驅動、系統調用等進行模擬和測試。
01
kAFL
kAFL(Kernel AFL)是一款專注于Linux內核和其他復雜的內核組件模糊測試的工具。基于流行的AFL設計,kAFL通過自動化、持續地提供隨機或半隨機輸入來觸發潛在錯誤。與AFL不同,kAFL專門針對內核空間的代碼進行測試,能夠識別出一些用戶空間模糊器難以發現的漏洞。kAFL具備虛擬化技術支持,能夠在虛擬機中執行測試,從而確保測試過程的隔離和安全。它還采用了覆蓋率導向的方法,自動調整輸入以最大限度地探索內核代碼的執行路徑。
02
syzkaller
syzkaller由Google的安全團隊開發和維護,是一款高效的內核模糊測試工具。它主要使用Go編程語言實現,兼容Linux、Android、FreeBSD和Windows等多種操作系統,已成功發現上千個漏洞。syzkaller通過不斷生成并執行一系列隨機化的系統調用,嘗試去觸發內核的異常行為,如崩潰、死鎖或內存泄露。
Web服務類模糊測試工具
Web服務類模糊測試工具是一種專門針對Web應用程序的安全測試工具,用于自動發現潛在的Web安全漏洞。通過生成一系列隨機或半隨機的HTTP請求,Web模糊器能夠測試Web應用程序的各個組件,如URL、表單、參數、頭部等。它可以快速識別常見的安全問題,如SQL注入、跨站腳本攻擊(XSS)、文件包含等安全問題。
01
WFuzz
WFuzz是用Python實現的Web應用程序安全性模糊工具和庫。它基于一個簡單的理念:它將給定有效負載的值替換為對關鍵字的任一引用。它是一款出色的輔助模糊測試工具,可以在HTTP請求中插入各種輸入值,用于對不同的Web應用程序組件進行多種復雜攻擊,包括參數、認證、表單、頭部等等。
02
WebScarab
WebScarab是一款開源的Web應用程序安全測試工具,由OWASP開發和維護。它是一款用Java編寫的代理工具,主要用于分析和審查HTTP和HTTPS通信。它包含了一個基礎的模糊測試器,能夠將模糊測試值注入到應用參數中。
特定編程語言的模糊測試工具
特定編程語言的模糊測試工具是專門為某種編程語言設計的工具,用于自動檢測代碼中的漏洞和錯誤。特定編程語言的模糊測試工具有更深入的語言集成和理解,可以更精確地針對特定語言特性進行測試。與其他模糊測試工具相比,這些工具通常能提供更有效的測試,更容易集成到開發工作流程中,并能發現更深入、更特定的問題。
01
go-fuzz
go-fuzz是一款針對Go語言的模糊測試工具,使用覆蓋率指導技術自動尋找能觸發程序異常的輸入。與Go的工具鏈緊密集成,它可以自動發現和最小化觸發漏洞的輸入,有效簡化漏洞診斷和修復過程。作為Go開發人員和安全工程師的重要工具,go-fuzz在許多知名Go項目中成功地發現了漏洞。
02
Kelinci
Kelinci是一款配合AFL進行Java程序模糊測試的工具,通過插樁Java字節碼來分析程序覆蓋率。它通過創建一個C語言接口與AFL通信,接收AFL的變異數據,并通過TCP傳遞給Java端的Instrumentor。Instrumentor則負責將這些數據傳遞給Java的原始目標程序,并將運行結果反饋給C語言接口。Kelinci與AFL共同構建了一個閉環數據流,使AFL能夠間接地對Java程序進行有效的模糊測試。
03
fuzzilli
fuzzilli是Google開源的一款JavaScript的模糊測試工具,使用swift語言開發。它整合了語法變異、模板生成、覆蓋引導等多種技術,使用自定義中間語言用于語法變異,再將變異后的中間語言轉換成JS代碼。fuzzilli在3大主流JS引擎的測試中,收獲頗豐,發現了不少漏洞,
這些開源工具為安全專業人員提供了更多選擇,使他們能夠更有效地發現安全漏洞,進而推動整個軟件安全領域向前發展。