使用Afl-fuzz (American Fuzzy Lop) 進行fuzzing測試(四)——直接對二進制進行fuzzing

本文不完全譯自:afl-2.49b/qemu_mode/README.qemu
轉載請註明出處。

1. 引言

本目錄下的代碼可以利用QEMU 的“user emulation”模式幫助建立獨立特徵,並允許調用者獲得黑盒、閉源的二進制程序的插樁輸出。這一機制能支持afl-fuzz用於無法使用afl-gcc編譯的目標程序的壓力測試(stress-test)。

通常情況下,使用這種方式對程序性能開銷會有2-5x的性能下降,即使是這樣,仍然比DynamoRIO和PIN等工具要好。

思路和大部分代碼實現都來源於Andres Griffiths。

2.如何使用

這一特性是在實現QEMU 2.3.0上實現的一個相當簡單的path的基礎上完成的。最簡單的方式是運行./build_qumu_support.sh腳本建造(build)環境。這一腳本會自動下載、配置(configure)以及編譯好QEMU二進制。

QEMU是一個非常大的項目,所以這一個過程會比較耗費時間,另外可能還需要解決依賴項問題,典型的如lib和glib2-devel等。

一旦二進制編譯完成,就可以通過在命令行中添加-Q參數的方式調用afl-fuzz和所有相關工具使用QEMU工具。

需要注意的是,QEMU需要設置充足的內存限制(memory limit)才能運行;200MB是個比較好的初始設置,但對複雜程序,需要把這一值設置成更大才行。當指定-Q參數時,默認-m限制將會自動增加到200 MB。

原則上來說,如果在調用./build_qemu_support.sh之前設置CPU_TARGET,則應該建立運行非本地二進制(可以嘗試 CPU_TARGET=arm)的環境。如果想要對在64bit系統下運行32bit二進制,這同樣是必須的設置。

如果想要爲系統中所有的用戶安裝QEMU helper,則需要在上一級目錄(parent directory)上make install之前build。

3.鏈接注意事項(notes on linking)

特性只適用於Linux。要支持BSD,可能相當於移植改變到linux-user/elfload.c,應用到bsd-user/elfload.c。

只在鏈接階段插樁ELF二進制,.text節區,並不跟蹤(trace)共享Lib。實際上:

  • 任意想要分析的程序,對其lib文件必須是靜態鏈接到可執行的ELF文件中。
  • 對標準的C lib庫和其他標準庫,一般情況下不需要對其進行插樁,所以應該動態鏈接,否則AFL不會自動規避對其插樁分析,這會帶來不必要的開銷。

4.測試集(benchmarking)

如果想要對比對相同目標代碼的QEMU插樁和afl-gcc編譯時插樁的性能,我們需要使用相同的編譯優化參數build非插樁二進制程序。並確保相關鏈接庫被靜態鏈接到二進制中。通常的命令如下:

$ CFLAGS="-O3 -funroll-loops" ./configure --disable-shared
$ make clean all

如果優化層面或者插樁範圍(視野)不一樣的話,對執行速度或插樁覆蓋率方面的比較衡量會顯得沒有意義。

5.Gotchas,feedback,bugs

如果需要對被變異後的測試用例進行fix up校驗和或者其他cleanup,查看experimental/post_library/目錄,裏面有可行的解決方案。

主要不要把QEMU模式和ASAN、MSAN等混淆。QEMU並沒有得益於sanitizers使用的“shadow VM” 技巧,並很可能會把內存用完。

和fully-fledged 虛擬化相比,用戶模擬模式並不是一個安全範圍內。二進制能自由與主機(host OS)進行交互。如果確實需要對不可信的二進制進行fuzz,可以先把二進制和AFL同時放到沙盒中。

QEMU並不需要支持目標程序可能使用的所有的CPU或硬件特性。特別地,並沒有完全支持AVX2 / FMA3。所以在舊的CPU下使用二進制,或者使用-march=core2參數重新編譯將會有所幫助。

6.替代方案:靜態重寫(static rewriting)

對二進制進行一次靜態重寫,而不是嘗試在運行時進行翻譯,能後獲得比後者更快的速度。但靜態重寫是充滿危險的(fraught with peril),因爲依賴於能否在沒有實際執行程序的情況下對程序控制流進行正確和完全的模擬。

如果想要使用這種模式,Aleksandar Nikolich已經給出相應的模塊:
https://github.com/vrtadmin/moflow/tree/master/afl-dyninst
https://groups.google.com/forum/#!topic/afl-users/HlSQdbOTlpg

在這一點上,作者報告了對未插樁二進制直接使用靜態重寫的方法的可能性。如果能把這一模式做的更加可靠,將比QEMU插樁帶來更好地性能。

譯者注:靜態重寫又稱爲靜態重彙編,目前這一技術並不成熟,可能會對目標二進制程序造成不用程度的損壞。Ruoyu Wang 在NDSS 2017上發表了一篇重彙編相關的論文,已經能取得非常好的效果,但現在還沒有開源。具體請參考論文:
Wang R, Yan S, Bianchi A, et al. Ramblr: Making Reassembly Great Again[C]. Network and Distributed System Security Symposium. 2017.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章