模糊測試

概念
模糊測試(fuzz testing, fuzzing)是一種軟件測試技術(shù)。其核心思想是將自動或半自動生成的隨機數(shù)據(jù)輸入到一個程序中,并監(jiān)視程序異常,如崩潰、斷言(assertion)失敗,以發(fā)現(xiàn)可能的程序錯誤,比如內(nèi)存泄漏。模糊測試常常用于檢測軟件或計算機系統(tǒng)的安全漏洞。
模糊測試包括幾個基本的測試步驟:確定被測系統(tǒng)->確定輸入->生成模糊數(shù)據(jù)->使用模糊數(shù)據(jù)執(zhí)行測試->監(jiān)控分析系統(tǒng)的行為->輸出日志
Fuzzing通常由盲Fuzzing(Blind Fuzzing)和導(dǎo)向性Fuzzing(Guided Fuzzing)兩種。
Blind Fuzzing生成測試數(shù)據(jù)的時候不考慮數(shù)據(jù)的質(zhì)量,通過大量測試數(shù)據(jù)來概率性地觸發(fā)漏洞。
Guided Fuzzing則關(guān)注測試數(shù)據(jù)的質(zhì)量,期望生成更有效的測試數(shù)據(jù)來觸發(fā)漏洞的概率,比如,通過測試覆蓋率來衡量測試輸入的質(zhì)量,希望生成有更高測試覆蓋率的數(shù)據(jù),從而提升觸發(fā)漏洞的概率。

基本方案
構(gòu)造大量測試用例(初始seed)
篩選可行測試用例(seed選擇)
種子變異(對seed代碼進行簡單修改)
程序執(zhí)行測試用例
若出bug則保存該用例,否則繼續(xù)執(zhí)行第二步
AFL模糊測試工具
指令插樁和邊覆蓋。首先AFL是基于插樁的,能夠輔助程序分析;其次AFL是基于邊覆蓋的,是對Charlie Miller等人基于塊覆蓋用樣本篩選的一個改進和提升。
AFL工作流程大致如下:
從源碼編譯程序時進行插樁,以記錄代碼覆蓋率(Code Coverage);
選擇一些輸入文件,作為初始測試集加入輸入隊列(queue);
將隊列中的文件按一定的策略進行“突變”;
如果經(jīng)過變異文件更新了覆蓋范圍,則將其保留添加到隊列中;
上述過程會一直循環(huán)進行,期間觸發(fā)了crash的文件會被記錄下來。
