關於 afl++ 如何判斷 unique crash, timeouts

緣由

 

之前有在 台科大資訊安全研究社 講過一篇 Fuzzing 資安實務課程。當中有學員提問,

「AFL 是怎麼判斷 unique crash 的?」


當時我只能回覆,「他應會依照執行路徑是否相同來判斷 unique,但實務上我不確定為何,畢竟他有高機率會產生偽陽 (false positive)。」


此文章中,會分析 afl++ 是如何判斷 unique crash 的。

分析


afl-fuzz.c 當有一函式 common_fuzz_stuff。此函式為進行 fuzz 的主迴圈。
 
 
 
1. 它於 run_target 時呼叫 fork,執行被測程式。結果會存於 u8 fault 中。
2. fault 可分為 FAULT_TMOUT, FAULT_CRASH, FAULT_ERROR,分別代表逾時、crash、錯誤。若 afl 以 fork() 執行目標時即失敗,會進入 FAULT_ERROR。若 MemorySanitizer 擊中 trap、或 exit code 滿足以下條件,亦會進入 FAULT_CRASH。
3. 若 fault 為 timeout 形式,則會檢查是否 timeout 的時間是大於設定值 (命令列上 -t)。若是,則進行後續處理。
4. 有一有趣的功能,並未在文件中明顯提到:對 afl 的程序發送 SIGUSR1,可使其拋棄當下的測試資料。
5. 後續皆以 save_if_interesting 做處理。

save_if_interesting 函式如下。
 


若為 crash_mode,則呼叫 has_new_bits 做檢查。has_new_bits 註解如下。它會檢查 afl 內部的 bitmap,若 bitmap 與此 fault 相符,則不認為是 unique crash。反之則增加 unique crash 數。

結論:afl++ 會以「該 crash 執行路徑是否有在 bitmap 出現過」來判斷是否為 unique crash。

No comments:

Post a Comment