american fuzzy lop

american fuzzy lop (AFL) 是一個自由的模糊測試工具,採用遺傳算法以有效地提高測試用例代碼覆蓋率。目前為止,它幫助檢測了數十個主要自由軟件項目中的重大程序錯誤,包括X.Org Server[2]PHP[3]OpenSSL[4][5] pngcrushbash[6]Firefox[7]BIND[8][9] Qt[10]SQLite[11]

american fuzzy lop
使用american fuzzy lop進行模糊測試
使用american fuzzy lop進行模糊測試
開發者Michał Zalewski
首次發布2013年11月12日,​11年前​(2013-11-12
當前版本
  • 2.57b(2020年6月30日)[1]
編輯維基數據鏈接
源代碼庫 編輯維基數據鏈接
編程語言C匯編語言
操作系統跨平台
類型模糊測試器
許可協議Apache License 2.0
網站lcamtuf.coredump.cx/afl/

american fuzzy lop的源代碼發布在GitHub上。american fuzzy lop得名於美國垂耳兔英語American Fuzzy Lop

典型用法

編輯

AFL要求用戶提供一個運行測試應用程序的示例命令和至少一個示例輸入文件。例如,在對音頻播放器進行測試時,可以指示AFL用它打開一個簡短的聲音文件。然後,模糊測試器嘗試實際執行指定的命令,如果成功,它會嘗試將輸入文件減少到觸發相同行為的最小文件。

在初始階段之後,AFL通過對輸入文件進行各種修改來開始實際的模糊測試過程。當被測程序崩潰假死機時,表明發現了一個新錯誤,可能是一個安全漏洞。此時修改後的輸入文件被保存以供用戶進一步檢查。

為了最大限度地提高模糊測試性能,建議使用american fuzzy lop進行灰盒測試,即在一個實用程序的幫助下編譯被測程序源代碼,該實用程序在編譯被測程序時插入跟蹤控制流的輔助函數(即「插樁」)來instrument英語Instrumentation_(computer_programming)代碼。這允許模糊測試器檢測目標的行為何時響應輸入而改變。在灰盒測試不可能的情況下,也支持黑盒測試

特性

編輯

模糊引擎

編輯
 
AFL的logo通過模糊測試輸入拼接為一個動畫產生。[12]

american fuzzy lop的模糊測試引擎使用幾個算法儘可能觸發被測程序的異常行為,如位翻轉或將輸入的整數數據修改為可能引發異常的邊界值。[13] 除此之外,AFL可以根據示例關鍵字生成測試用例,這有助於對使用基於文本語法的程序進行模糊測試,例如 SQLite。[14] 生成的測試用例執行程序代碼的不同部分,AFL記錄會引起異常的輸入數據,之後可以將這些數據輸入到更專業的診斷程序進行進一步分析。進行模糊測試時,假死機可以通過設定的定時器超時來檢測,而崩潰通過結束程序時的信號處理程序檢測。

使用AFL進行模糊測試時,輸入的測試用例可以通過標準輸入或作為進程命令行中指定的輸入文件提供給測試程序。目前不支持對通過網絡接受輸入數據的網絡應用程序進行模糊測試,但在某些情況下有可行的解決方案。[15]

性能

編輯

american fuzzy lop面臨的一大挑戰是每秒對幾百個進程的spawn英語spawn (computing)。除了從頭開始spawn每個進程的原始引擎,american fuzzy lop提供高度依賴fork系統調用的默認引擎。[16] 可以通過利用LLVM延遲分叉服務器模式或類似的持久模式進一步加快速度,但這是以必須修改測試程序為代價的。[17] 另外,american fuzzy lop支持通過網絡對同一個程序進行模糊測試。

用戶界面

編輯

american fuzzy lop擁有彩色的命令行界面,實時顯示模糊測試過程和統計信息,可以通過命令行界面或者環境變量修改配置,也可以從機器可讀文件格式中讀取運行時統計信息。

實用程序

編輯

除了提供afl-fuzz用於模糊測試,american Fuzzy lop還包含用於監控模糊測試過程的實用程序。除此之外,afl-cminafl-tmin可以用於最小化測試用例和語料庫,當其他模糊測試器也需要使用afl-fuzz生成的測試用例時尤其實用。

AFL++
首次發布2.52c / 2019年6月5日,​5年前​(2019-06-05
當前版本
  • 4.21c(2024年6月9日;穩定版本)[18]
 
源代碼庫https://github.com/AFLplusplus/AFLplusplus/
許可協議  
網站lcamtuf.coredump.cx/afl/  

由於Google2017年9月以後對AFL的上游開發相對停滯,故誕生了一個社區維護的AFL分叉AFL++ (AFLplusplus)[19] 。它包含了一些新特性和性能提升。[20]

Google推出的為開源軟件提供免費模糊測試服務的OSS-Fuzz計劃,也於2021年1月將AFL選項替換為了AFL++。[21]

參考資料

編輯
  1. ^ Release 2.57b. 2020年6月30日 [2020年7月1日]. 
  2. ^ Advisory-2015-03-17. x.org. [2022-01-11]. (原始內容存檔於2021-12-06). 
  3. ^ NVD - Detail. nist.gov. [2022-01-11]. (原始內容存檔於2016-04-16). 
  4. ^ NVD - Detail. nist.gov. [2022-01-11]. (原始內容存檔於2016-03-04). 
  5. ^ NVD - Detail. nist.gov. [2022-01-11]. (原始內容存檔於2016-03-04). 
  6. ^ CVE - CVE-2014-6278. mitre.org. [2022-01-11]. (原始內容存檔於2015-05-23). 
  7. ^ CVE - CVE-2014-8637. mitre.org. [2022-01-11]. (原始內容存檔於2022-01-11). 
  8. ^ How to fuzz a server with American Fuzzy Lop. Fastly. [2022-01-11]. (原始內容存檔於2016-01-11). 
  9. ^ CVE - CVE-2015-5477. mitre.org. [2022-01-11]. (原始內容存檔於2022-04-23). 
  10. ^ [Announce] Qt Project Security Advisory - Multiple Vulnerabilities in Qt Image Format Handling. qt-project.org. [2022-01-11]. (原始內容存檔於2021-12-06). 
  11. ^ How SQLite Is Tested # 4.1.1. SQL Fuzz Using The American Fuzzy Lop Fuzzer. sqlite.org. [2022-01-11]. (原始內容存檔於2022-04-16). 
  12. ^ Zalewski, Michał. Logo for afl-fuzz. afl-users | Google Groups. 2015-02-27 [2019-07-25]. 
  13. ^ Binary fuzzing strategies: what works, what doesn't. lcamtuf.blogspot.com. 
  14. ^ Finding bugs in SQLite, the easy way. lcamtuf.blogspot.com. 
  15. ^ Technion. Fuzzing nginx - Hunting vulnerabilities with afl-fuzz. lolware.net. [2022-01-11]. (原始內容存檔於2020-11-08). 
  16. ^ Fuzzing random programs without execve(). lcamtuf.blogspot.com. 
  17. ^ New in AFL: persistent mode. lcamtuf's blog. 11 June 2015. 
  18. ^ Release 4.21c. 2024年6月9日 [2024年6月20日]. 
  19. ^ Fioraldi, Andrea; Maier, Dominik; Eißfeldt, Heiko; Heuse, Marc. AFL++: Combining incremental steps of fuzzing research. 14th USENIX Workshop on Offensive Technologies (WOOT 20). August 2020 [2022-01-11]. (原始內容存檔於2022-03-21). 
  20. ^ The AFL++ fuzzing framework. AFLplusplus. [2022-01-11]. (原始內容存檔於2022-03-14) (英語). 
  21. ^ metzman, jonathan. [afl++] Use AFL++ instead of AFL for fuzzing. by jonathanmetzman · Pull Request #5046 · google/oss-fuzz. GitHub. [2022-01-11]. (原始內容存檔於2022-01-12) (英語). 

拓展閱讀

編輯