american fuzzy lop
american fuzzy lop (AFL) 是一個自由的模糊測試工具,採用遺傳算法以有效地提高測試用例的代碼覆蓋率。目前為止,它幫助檢測了數十個主要自由軟件項目中的重大程序錯誤,包括X.Org Server、[2]PHP、[3]OpenSSL、[4][5] pngcrush、bash、[6]Firefox、[7]BIND、[8][9] Qt[10] 和SQLite。[11]
開發者 | Michał Zalewski |
---|---|
首次發布 | 2013年11月12日 |
當前版本 |
|
源代碼庫 | |
編程語言 | C、匯編語言 |
操作系統 | 跨平台 |
類型 | 模糊測試器 |
許可協議 | Apache License 2.0 |
網站 | lcamtuf |
american fuzzy lop的源代碼發布在GitHub上。american fuzzy lop得名於美國垂耳兔。
典型用法
編輯AFL要求用戶提供一個運行測試應用程序的示例命令和至少一個示例輸入文件。例如,在對音頻播放器進行測試時,可以指示AFL用它打開一個簡短的聲音文件。然後,模糊測試器嘗試實際執行指定的命令,如果成功,它會嘗試將輸入文件減少到觸發相同行為的最小文件。
在初始階段之後,AFL通過對輸入文件進行各種修改來開始實際的模糊測試過程。當被測程序崩潰或假死機時,表明發現了一個新錯誤,可能是一個安全漏洞。此時修改後的輸入文件被保存以供用戶進一步檢查。
為了最大限度地提高模糊測試性能,建議使用american fuzzy lop進行灰盒測試,即在一個實用程序的幫助下編譯被測程序源代碼,該實用程序在編譯被測程序時插入跟蹤控制流的輔助函數(即「插樁」)來instrument代碼。這允許模糊測試器檢測目標的行為何時響應輸入而改變。在灰盒測試不可能的情況下,也支持黑盒測試。
特性
編輯模糊引擎
編輯american fuzzy lop的模糊測試引擎使用幾個算法儘可能觸發被測程序的異常行為,如位翻轉或將輸入的整數數據修改為可能引發異常的邊界值。[13] 除此之外,AFL可以根據示例關鍵字生成測試用例,這有助於對使用基於文本語法的程序進行模糊測試,例如 SQLite。[14] 生成的測試用例執行程序代碼的不同部分,AFL記錄會引起異常的輸入數據,之後可以將這些數據輸入到更專業的診斷程序進行進一步分析。進行模糊測試時,假死機可以通過設定的定時器超時來檢測,而崩潰通過結束程序時的信號處理程序檢測。
使用AFL進行模糊測試時,輸入的測試用例可以通過標準輸入或作為進程命令行中指定的輸入文件提供給測試程序。目前不支持對通過網絡接受輸入數據的網絡應用程序進行模糊測試,但在某些情況下有可行的解決方案。[15]
性能
編輯american fuzzy lop面臨的一大挑戰是每秒對幾百個進程的spawn。除了從頭開始spawn每個進程的原始引擎,american fuzzy lop提供高度依賴fork
系統調用的默認引擎。[16] 可以通過利用LLVM延遲分叉服務器模式或類似的持久模式進一步加快速度,但這是以必須修改測試程序為代價的。[17] 另外,american fuzzy lop支持通過網絡對同一個程序進行模糊測試。
用戶界面
編輯american fuzzy lop擁有彩色的命令行界面,實時顯示模糊測試過程和統計信息,可以通過命令行界面或者環境變量修改配置,也可以從機器可讀文件格式中讀取運行時統計信息。
實用程序
編輯除了提供afl-fuzz
用於模糊測試,american Fuzzy lop還包含用於監控模糊測試過程的實用程序。除此之外,afl-cmin
和afl-tmin
可以用於最小化測試用例和語料庫,當其他模糊測試器也需要使用afl-fuzz
生成的測試用例時尤其實用。
AFL++
編輯首次發布 | 2.52c / 2019年6月5日 |
---|---|
當前版本 |
|
源代碼庫 | https://github.com/AFLplusplus/AFLplusplus/ |
許可協議 | |
網站 | lcamtuf |
由於Google2017年9月以後對AFL的上游開發相對停滯,故誕生了一個社區維護的AFL分叉AFL++ (AFLplusplus)[19] 。它包含了一些新特性和性能提升。[20]
Google推出的為開源軟件提供免費模糊測試服務的OSS-Fuzz計劃,也於2021年1月將AFL選項替換為了AFL++。[21]
參考資料
編輯- ^ Release 2.57b. 2020年6月30日 [2020年7月1日].
- ^ Advisory-2015-03-17. x.org. [2022-01-11]. (原始內容存檔於2021-12-06).
- ^ NVD - Detail. nist.gov. [2022-01-11]. (原始內容存檔於2016-04-16).
- ^ NVD - Detail. nist.gov. [2022-01-11]. (原始內容存檔於2016-03-04).
- ^ NVD - Detail. nist.gov. [2022-01-11]. (原始內容存檔於2016-03-04).
- ^ CVE - CVE-2014-6278. mitre.org. [2022-01-11]. (原始內容存檔於2015-05-23).
- ^ CVE - CVE-2014-8637. mitre.org. [2022-01-11]. (原始內容存檔於2022-01-11).
- ^ How to fuzz a server with American Fuzzy Lop. Fastly. [2022-01-11]. (原始內容存檔於2016-01-11).
- ^ CVE - CVE-2015-5477. mitre.org. [2022-01-11]. (原始內容存檔於2022-04-23).
- ^ [Announce] Qt Project Security Advisory - Multiple Vulnerabilities in Qt Image Format Handling. qt-project.org. [2022-01-11]. (原始內容存檔於2021-12-06).
- ^ How SQLite Is Tested # 4.1.1. SQL Fuzz Using The American Fuzzy Lop Fuzzer. sqlite.org. [2022-01-11]. (原始內容存檔於2022-04-16).
- ^ Zalewski, Michał. Logo for afl-fuzz. afl-users | Google Groups. 2015-02-27 [2019-07-25].
- ^ Binary fuzzing strategies: what works, what doesn't. lcamtuf.blogspot.com.
- ^ Finding bugs in SQLite, the easy way. lcamtuf.blogspot.com.
- ^ Technion. Fuzzing nginx - Hunting vulnerabilities with afl-fuzz. lolware.net. [2022-01-11]. (原始內容存檔於2020-11-08).
- ^ Fuzzing random programs without execve(). lcamtuf.blogspot.com.
- ^ New in AFL: persistent mode. lcamtuf's blog. 11 June 2015.
- ^ Release 4.21c. 2024年6月9日 [2024年6月20日].
- ^ 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).
- ^ The AFL++ fuzzing framework. AFLplusplus. [2022-01-11]. (原始內容存檔於2022-03-14) (英語).
- ^ 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) (英語).
拓展閱讀
編輯- S. K. Cha, M. Woo, D. Brumley, "Program-Adaptive Mutational Fuzzing," (頁面存檔備份,存於網際網路檔案館) in Proceedings of the 36th IEEE Symposium on Security and Privacy, 2015. (to appear)
- Multi-System and Internet Security Cookbook, Hors-Serie No. 11 "Outils de sécurité", p. 36, "American Fuzzy Lop", Kevin Denis, June 2015. [1] (頁面存檔備份,存於網際網路檔案館)
- "Fuzz and strings (lwn.net)" (頁面存檔備份,存於網際網路檔案館)
- "Fuzzing (on) FreeBSD - (Mostly) automated bug discovery with security/afl" (頁面存檔備份,存於網際網路檔案館) - a presentation at FOSDEM
- "Testing with two failure seeking missiles: fuzzing and property based testing" (頁面存檔備份,存於網際網路檔案館) - a presentation at EuroPython 2015.
- "Stagefright: Scary Code in the Heart of Android" (頁面存檔備份,存於網際網路檔案館) a presentation at Black Hat Briefings
- "The Fuzzing Project" (頁面存檔備份,存於網際網路檔案館)
- "Grammatical Inference and Language Frameworks for LANGSEC" (頁面存檔備份,存於網際網路檔案館)
- "Fuzzing Code with AFL", Peter Gutmann, ;login, Vol. 41, No. 2, Summer 2016, [2] (頁面存檔備份,存於網際網路檔案館)
- "AFL++" (頁面存檔備份,存於網際網路檔案館), an advanced fork of AFL