作者:天融信阿爾法實驗室
公眾號:https://mp.weixin.qq.com/s/G7l5wBB7oKjXCDGtjuxYTQ
一、前言
模糊測試(Fuzzing)技術作為漏洞挖掘最有效的手段之一,近年來一直是眾多安全研究人員發現漏洞的首選技術。AFL、LibFuzzer、honggfuzz等操作簡單友好的工具相繼出現,也極大地降低了模糊測試的門檻。筆者近期學習漏洞挖掘過程中,感覺目前網上相關的的資源有些冗雜,讓初學者有些無從着手,便想在此對學習過程中收集的一些優秀的博文、論文和工具進行總結與梳理、分享一些學習過程中的想法和心得,同時對網上一些沒有涉及到的內容做些補充。
由於相關話題涉及的內容太廣,筆者決定將所有內容分成一系列文章,且只圍繞AFL這一具有里程碑意義的工具展開,從最簡單的使用方法和基本概念講起,再由淺入深介紹測試完后的後續工作、如何提升Fuzzing速度、一些使用技巧以及對源碼的分析等內容。因為筆者接觸該領域也不久,內容中難免出現一些錯誤和紕漏,歡迎大家在評論中指正。
第一篇文章旨在讓讀者對AFL的使用流程有個基本的認識,文中將討論如下一些基本問題:
- AFL的基本原理和工作流程;
- 如何選擇Fuzzing的目標?
- 如何獲得初始語料庫?
- 如何使用AFL構建程序?
- AFL的各種執行方式;
- AFL狀態窗口中各部分代表了什麼意義?
二、AFL簡介
AFL(American Fuzzy Lop)是由安全研究員Micha? Zalewski(@lcamtuf)開發的一款基於覆蓋引導(Coverage-guided)的模糊測試工具,它通過記錄輸入樣本的代碼覆蓋率,從而調整輸入樣本以提高覆蓋率,增加發現漏洞的概率。
①從源碼編譯程序時進行插樁,以記錄代碼覆蓋率(Code Coverage);
②選擇一些輸入文件,作為初始測試集加入輸入隊列(queue);
③將隊列中的文件按一定的策略進行“突變”;
④如果經過變異文件更新了覆蓋範圍,則將其保留添加到隊列中;
⑤上述過程會一直循環進行,期間觸發了crash的文件會被記錄下來。
3. 修剪
網上找到的一些大型語料庫中往往包含大量的文件,這時就需要對其精簡,這個工作有個術語叫做——語料庫蒸餾(Corpus Distillation)。AFL提供了兩個工具來幫助我們完成這部工作——afl-cmin
和afl-tmin
。
(1) 移除執行相同代碼的輸入文件——AFL-CMIN
afl-cmin
的核心思想是:嘗試找到與語料庫全集具有相同覆蓋範圍的最小子集。舉個例子:假設有多個文件,都覆蓋了相同的代碼,那麼就丟掉多餘的文件。其使用方法如下:
$ afl-cmin -i input_dir -o output_dir -- /path/to/tested/program [params]
更多的時候,我們需要從文件中獲取輸入,這時可以使用“@@”代替被測試程序命令行中輸入文件名的位置。Fuzzer會將其替換為實際執行的文件:
$$ afl-cmin -i input_dir -o output_dir -- /path/to/tested/program [params] @@
下面的例子中,我們將一個有1253個png文件的語料庫,精簡到只包含60個文件。
[2]Yet another memory leak in ImageMagick
[3]Vulnerability Discovery Against Apple Safari
[4]Pulling JPEGs out of thin air
[6]Fuzzing workflows; a fuzz job from start to finish
[7]Open Source Fuzzing Tools – ‘Chapter 10 Code Coverage and Fuzzing’
[8]Fuzzing for Software Security Testing and Quality Assurance – ’7.2 Using Code Coverage Information’