傳奇開服表seo教程培訓(xùn)
安全之安全(security2)博客目錄導(dǎo)讀
ATF(TF-A)/OPTEE之FUZZ安全漏洞挖掘匯總
目錄
一、AFL簡介
二、AFL的安裝
三、代碼示例及種子語料庫
四、AFL插樁編譯
五、AFL運(yùn)行及測試
六、AFL結(jié)果分析
一、AFL簡介
????????模糊測試(Fuzzing)技術(shù)作為漏洞挖掘最有效的手段之一,近年來一直是眾多安全研究人員發(fā)現(xiàn)漏洞的首選技術(shù)。AFL、LibFuzzer、honggfuzz等操作簡單友好的工具相繼出現(xiàn),也極大地降低了模糊測試的門檻。
????????AFL(American Fuzzy Lop)是由安全研究員Micha? Zalewski(@lcamtuf)開發(fā)的一款基于覆蓋引導(dǎo)(Coverage-guided)的模糊測試工具,它通過記錄輸入樣本的代碼覆蓋率,從而調(diào)整輸入樣本以提高覆蓋率,增加發(fā)現(xiàn)漏洞的概率。其工作流程大致如下:
①從源碼編譯程序時進(jìn)行插樁,以記錄代碼覆蓋率(Code Coverage);
②選擇一些輸入文件,作為初始測試集加入輸入隊列(queue);
③將隊列中的文件按一定的策略進(jìn)行“突變”;
④如果經(jīng)過變異文件更新了覆蓋范圍,則將其保留添加到隊列中;
⑤上述過程會一直循環(huán)進(jìn)行,期間觸發(fā)了crash的文件會被記錄下來。
二、AFL的安裝
????????下載AFL源碼(https://github.com/google/AFL/),解壓后,編譯安裝。
????????make
????????sudo make install
安裝成功
安裝目錄
三、代碼示例及種子語料庫
????????首先創(chuàng)建一個簡單的vulnerable.c
源文件,其功能無外乎接受一行命令行輸入(一個整數(shù)、一個字符、再一個整數(shù)),然后根據(jù)中間這個字符當(dāng)作運(yùn)算符,輸出四則運(yùn)算結(jié)果??梢钥匆?#xff0c;這個被測程序的內(nèi)容和普通的用戶交互程序一模一樣,看不出來任何不同,就是以stdin/stdout
作為交互的輸入輸出,以main
函數(shù)作為執(zhí)行入口。
????????作為模糊測試,AFL需要提供初始的種子輸入。
????????但實際上,你完全可以提供任何無意義的輸入作為種子,模糊測試也一般能達(dá)到效果,只不過效率會低一些而已,是否提供有意義種子?提供多少?無外乎在種子獲取難度和測試的效率要求之間進(jìn)行權(quán)衡而已。
四、AFL插樁編譯
????????編譯過程和普通gcc
編譯也是一樣,除了使用的命令需要帶上afl-
前綴,因此
afl-gcc -g -o vulnerable vulnerable.c
五、AFL運(yùn)行及測試
執(zhí)行命令,
afl-fuzz -i testcases/ -o outputs -- ./vulnerable |
但是不出意外命令會報錯,
[-] Hmm, your system is configured to send core dump notifications to anexternal utility. This will cause issues: there will be an extended delaybetween stumbling upon a crash and having this information relayed to thefuzzer via the standard waitpid() API.To avoid having crashes misinterpreted as timeouts, please log in as rootand temporarily modify /proc/sys/kernel/core_pattern, like so:echo core >/proc/sys/kernel/core_pattern[-] PROGRAM ABORT : Pipe at the beginning of 'core_pattern'Location : check_crash_handling(), afl-fuzz.c:7275
以及
[-] Whoops, your system uses on-demand CPU frequency scaling, adjustedbetween 781 and 4003 MHz. Unfortunately, the scaling algorithm in thekernel is imperfect and can miss the short-lived processes spawned byafl-fuzz. To keep things moving, run these commands as root:cd /sys/devices/system/cpuecho performance | tee cpu*/cpufreq/scaling_governorYou can later go back to the original state by replacing 'performance' with'ondemand'. If you don't want to change the settings, set AFL_SKIP_CPUFREQto make afl-fuzz skip this check - but expect some performance drop.[-] PROGRAM ABORT : Suboptimal CPU scaling governorLocation : check_cpu_governor(), afl-fuzz.c:7337
具體原因上述信息已經(jīng)提到了,大致就是AFL測試時用到功能需要還沒有開啟,因此,切換到root用戶執(zhí)行上面報錯中給出的命令即可。不過因為上述命令中修改的都是/proc
和/sys
目錄下的文件,二者Linux內(nèi)核映射出來的邏輯文件,并非實際的磁盤文件,重啟之后所有修改都會丟失,避免麻煩還是將這幾個語句保存成為腳本有利于重復(fù)執(zhí)行。
root用戶切換
sudo su
echo core >/proc/sys/kernel/core_pattern
cd /sys/devices/system/cpu
echo performance | tee cpu*/cpufreq/scaling_governor
再次執(zhí)行命令,
afl-gcc -g -o vulnerable vulnerable.c
可以正常運(yùn)行,輸出一段信息后呈現(xiàn)如下界面,表示fuzz已經(jīng)開始了,可以在該界面中查看運(yùn)行時間、崩潰數(shù)量等信息。
ctrl-C結(jié)束fuzz,可以看到當(dāng)前目錄下已經(jīng)多出了outputs
目錄,這是本次模糊測試的結(jié)果。
六、AFL結(jié)果分析
????????引起崩潰的測試樣例會位于outputs/crashes
文件夾下,文件名大致形如id:000000,sig:08,src:000002,op:flip1,pos:3
,本次測試中,獲得的崩潰樣例的內(nèi)容為:
其中包含10/0三個可打印字符和一個換行符。并未出乎意料,就是這種輸入會導(dǎo)致程序中發(fā)生除零意外。
crashes:導(dǎo)致目標(biāo)接收致命signal而崩潰的獨(dú)特測試用例queue:存放所有具有獨(dú)特執(zhí)行路徑的測試用例。AFL輸出文件:
crashes/README.txt:保存了目標(biāo)執(zhí)行這些crashes文件的命令行參數(shù)。
hangs:導(dǎo)致目標(biāo)超時的獨(dú)特測試用例。
fuzzer_stats:afl-fuzz的運(yùn)行狀態(tài)。
plot_data:用于afl-plot繪圖。
afl-plot outputs plots
參考:GitHub - google/AFL: american fuzzy lop - a security-oriented fuzzer