american fuzzy lop

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

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

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的原始碼發佈在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++[編輯]

AFL++
首次發佈2.52c / 2019年6月5日,​4年前​(2019-06-05
目前版本
  • 4.20c (2024年4月13日;穩定版本)[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.20c. 2024年4月13日 [2024年4月19日]. 
  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) (英語). 

拓展閱讀[編輯]