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