通過靜態分析自動化模糊目標發現的框架
對軟件進行安全評估的脆弱性研究人員通常會通過AFL ++和LibFuzzer(例如AFL ++和Libfuzzer)來利用覆蓋範圍引導的模糊功能。這很重要,因為它可以自動化漏洞的過程,並揭示目標的可剝削條件。但是,當遇到大型且複雜的代碼庫或封閉源二進製文件時,研究人員必須精心努力地手動審核和反向工程,以確定基於模糊的探索可以有用的功能。
Fuzzable是一個與C/C ++源代碼和二進製文件集成在一起的框架,以幫助脆弱性研究人員識別可行的模糊功能目標。這是通過應用幾種基於靜態分析的啟發式方法來指出軟件中的風險行為以及執行它們的功能來完成的。然後,研究人員可以利用該框架生成基本的線束模板,然後可以用來尋找漏洞,或者作為連續模糊管道的一部分集成,例如Google的OSS-Fuzz Project。
除了作為獨立工具運行外,Fuzzable還集成了二進制忍者拆卸器的插件,並支持開發其他拆卸後端。
在此處查看詳細介紹該工具的原始博客文章,該文章重點介紹了靜態分析啟發式方法的技術規格以及該工具的產生方式。該工具還在美國2022年的Black Hat Arsenal美國介紹。
某些二進制目標可能需要進行一些消毒(即簽名匹配或從內部識別識別功能),因此可能主要使用二進制忍者作為拆卸後端,因為它具有有效解決這些問題的能力。因此,它可以用作獨立工具和插件。
由於二進制忍者並非所有人都可以訪問,並且可能需要用於安全評估並可能在雲中擴大規模,因此也支持ANGR後備後端。我預計還將將其他拆卸器納入道路(優先:Ghidra)。
如果您有二進制忍者廣告,請確保安裝API以進行獨立的無頭使用:
$ python3 /Applications/Binary Ninja.app/Contents/Resources/scripts/install_api.py
使用pip安裝:
$ pip install fuzzable
我們將詩歌用於依賴性管理和建設。要進行手動構建,請使用第三方模塊克隆存儲庫:
$ git clone --recursive https://github.com/ex0dus-0x/fuzzable
手動安裝:
$ cd fuzzable/
# without poetry
$ pip install .
# with poetry
$ poetry install
# with poetry for a development virtualenv
$ poetry shell
現在,您可以使用該工具分析二進製文件和/或源代碼!
# analyzing a single shared object library binary
$ fuzzable analyze examples/binaries/libbasic.so
# analyzing a single C source file
$ fuzzable analyze examples/source/libbasic.c
# analyzing a workspace with multiple C/C++ files and headers
$ fuzzable analyze examples/source/source_bundle/
可以通過Binary Ninja > Manage Plugins和搜索它,可以輕鬆地通過二進制忍者插件市場安裝模糊。這是可模糊插件運行的示例,準確性識別用於模糊的目標和進一步的脆弱性評估:

可模仿的可帶來各種選擇,以幫助更好地調整分析。將來的計劃和任何功能請求都將支持更多。
為了確定模糊性,可模仿的方法利用幾種啟發式方法來確定哪些目標是最可行的動態分析目標。這些啟發式方法都使用Scikit-Criteria庫對這些啟發式方法的加權都不同,該庫利用多標準決策分析來確定最佳候選者。這些指標和重量可以在這裡看到:
| 啟發式 | 描述 | 重量 |
|---|---|---|
| 模糊友好的名字 | 符號名稱意味著行為攝入文件/緩衝區輸入 | 0.3 |
| 冒險的下沉 | 流向風險的電話的爭論(即memcpy) | 0.3 |
| 天然循環 | 用主導邊界檢測到的循環數量 | 0.05 |
| 循環複雜性 | 基於邊緣 +節點的功能目標的複雜性 | 0.05 |
| 覆蓋深度 | 目標遍歷的量數 | 0.3 |
如前所述,請查看技術博客文章,以了解為什麼以及如何使用這些指標。
Vincenzo Iozzo在0-知識模糊中的原始作品的啟發,許多指標的啟發。
您要分析的每個目標都是多種多樣的,而Fuzzable將無法考慮程序目標中的每個邊緣案例行為。因此,在分析過程中,適當調整這些權重以查看不同結果是否對您的用例更有意義,這可能很重要。為了調整CLI中的這些權重,只需指定--score-weights參數:
$ fuzzable analyze <TARGET> --score-weights=0.2,0.2,0.2,0.2,0.2
默認情況下, Fuzzable將根據以下標準濾除功能目標:
static且不會通過標頭暴露的功能。要查看被Fuzzable過濾的呼叫,請設置--list_ignored標誌:
$ fuzzable analyze --list-ignored <TARGET>
在Binary Ninja中,您可以在Settings > Fuzzable > List Ignored Calls中轉動此設置。
如果可模糊地錯誤地濾除了應分析的重要呼叫,建議在運行期間使用--include-*參數將其包括在內:
# include ALL non top-level calls that were filtered out
$ fuzzable analyze --include-nontop <TARGET>
# include specific symbols that were filtered out
$ fuzzable analyze --include-sym <SYM> <TARGET>
在Binary Ninja中,通過Settings > Fuzzable > Include non-top level calls和Symbols to Exclude 。
既然您已經找到了理想的候選人來模糊,那麼Fuzzable也將幫助您生成(幾乎)準備好儀器並與基於文件的Fuzzer(即AFL ++,Honggfuzz)或內存模糊(Libfuzzer)一起使用的模糊安全帶。在CLI中這樣做:
# generate harness from a candidate
$ fuzzable create-harness target --symbol-name=some_unsafe_call
# make minimal and necessary modifications to the harness
$ vim target_some_unsafe_call_harness.cpp
# example compilation for AFL-QEMU, which is specified in the comments of the generated harness
$ clang target_some_unsafe_call_harness.cpp -no-pie -o target_some_unsafe_call_harness -ldl
# create your base seeds, ideally should be more well-formed for input
$ mkdir in/
$ echo "seed" >> in/seed
# start black box fuzzing
$ afl-fuzz -Q -m none -i in/ -o out/ -- ./target_some_unsafe_call_harness
如果此目標是源代碼庫,則將使用通用源模板。
如果目標是二進制的,則將使用通用的黑框模板,理想情況下可以與AFL-QEMU這樣的模糊仿真模式使用。如果未直接導出該符號以使用lief直接dlopen該符號,則二進制的副本也將作為共享對象創建。
目前,此功能是相當基本的,因為它只會創建一個帶有適當參數的獨立C ++線束,並且不會自動產生任何運行時行為所需的代碼(即實例化和釋放結構)。但是,為模糊創建的模板應該使您快速運行。這是我想實現的一些雄心勃勃的功能:
可模糊的支持以各種格式生成報告。當前支持的是JSON,CSV和MARKDOWN。如果您將其用作自動化的一部分,這將很有用,您希望以可序列化格式攝入輸出。
在CLI中,只需通過以適當擴展名的文件名傳遞--export參數:
$ fuzzable analyze --export=report.json <TARGET>
在Binary Ninja中,轉到Plugins > Fuzzable > Export Fuzzability Report > ...並選擇要導出到的格式以及要將其寫入的路徑。
該工具將不斷開發,並感謝外部壁爐架的任何幫助!
可模糊的可根據麻省理工學院許可獲得許可。