PTFuzzer:一個基於硬體加速的二進位程序Fuzz工具

2022-01-26 FreeBuf
簡介

PTFuzzer是基於AFL框架實現的一款開源fuzz工具,它採用了Intel Processor Trace硬體部件來收集程序執行的路徑信息,改進了原來AFL通過編譯插樁方式獲取程序執行路徑信息的方法。和AFL相比,硬體收集的路徑信息更加豐富,同時可以直接對目標程序進行fuzz,無需源碼支持。

技術背景1.1 AFL

Fuzz(也叫模糊測試)是自動化挖掘軟體漏洞的一種有效方法。基於反饋的fuzz技術是目前學術界和工業界的研究熱點,而其中的代表就是AFL。但是AFL存在一個問題,即需要對被測試的程序進行編譯插樁後才能fuzz。這也意味著必須要有目標程序的原始碼,而且必須是C代碼才行。AFL的Qemu模式採用動態二進位翻譯的手段獲取反饋信息,但是這種基於模擬仿真的方法開銷太大(5倍以上的開銷很常見),基本上不實用。

1.2 Intel Processor Trace

Intel Processor Trace(PT)是Intel在其第五代CPU之後引入的一個硬體部件。該硬體部件的作用是記錄程序執行中的分支信息,從而幫助構建程序運行過程中的控制流圖。在默認情況下CPU的PT部件是處於關閉狀態,這意味著CPU不會記錄程序的分支信息,因此也不會產生任何開銷。通過寫MSR寄存器可以打開PT開關。在打開PT開關後,CPU開始記錄分支指令信息,所記錄的信息以壓縮數據包的形式存儲在內存中。由於分支信息記錄完全由硬體完成,因此開銷非常小,一般在5%以下,這個開銷對於大多數應用來講基本上可以忽略不計。PT部件最初被設計用來重構程序的控制流圖,目的是為了幫助調試和分析。最早利用PT做fuzz的工具是kAFL,其結果發表在安全領域的四大頂級學術會議之一的USENIX Security上。但是kAFL是一個針對內核的fuzz工具,而PTFuzzer是針對應用程式的fuzz工具,這兩者的設計會有很多不同。

特點和限制2.1特點

PTFuzzer最大的特點是不需要目標程序有源碼,這在很多方法是非常有用的。首先,對於很多閉源程序的測試很有優勢。例如,某公司對外公布了一個二進位程序的發行版。這時拿不到程序的原始碼用AFL就無法測試,而用PTFuzzer就可以。另外,即便是對於一些有源碼的程序,可能由於其編譯環境極為複雜,用AFL來進行編譯插樁變得非常繁瑣和耗時,有時也會出現不成功的情況。還有一種情況是對於那些非C語言編寫的二進位程序,AFL就無能為力了。例如自己在測試pandoc程序時,發現pandoc是用Haskell語言編寫的。這時用AFL就無法進行編譯插樁,而使用PTFuzzer進行測試,只需要簡單通過apt-get安裝一個pandoc可執行程序就OK了。

2.2 限制

目前PTFuzzer只支持Linux作業系統,並且要求Linux內核的版本至少是4.13.0. 我們測試過Ubuntu16.04.4和Ubuntu17.10,都是沒有問題的。另外,因為使用了PT硬體部件,PTFuzzer要求5代以上的CPU。

使用方法3.1 從github上下載源碼

git clone https://github.com/hunter-ht-2018/ptfuzzer.git

3.2 編譯安裝

編譯之前先安裝依賴項,ptfuzzer依賴的程序和庫包括python,capstone,cle以及msr-tools。在源碼目錄下有個check_dep.sh腳本,可以直接運行安裝這些依賴項。Ptfuzzer採用CMake編譯:

cd ptfuzzer/mkdir buildcd buildcmake ../ -DPREFIX=.makemake install

以上命令會在build目錄下生成bin目錄,其中包括了運行ptfuzzer所需的所有程序。afl-ptfuzz:核心fuzz二進位程序ptfuzzer.py:對alf-ptfuzz的python封裝,主要用來處理參數,解析目標二進位程序。

3.3 運行

在運行之前需要打開一些開關,這個和AFL是相同的,可以通過運行config-run.sh來實現。以測試pandoc程序為例,首先安裝

pandoc:apt install pandoc

然後準備一個docx的種子放入in_dir中,最後運行ptfuzzer開始測試:

sudo python ./bin/ptfuzzer.py "-i ./in_dir -o ./out_dir" "/usr/bin/pandoc -f docx -t html"

運行狀態如圖所示:

注意:運行ptfuzzer需要root權限。

3.4 參數配置

ptfuzzer有一些運行時參數可以配置,這些參數包括:BRANCH_MODE,MEM_LIMIT,PERF_AUX_BUFFER_SIZE

其中BRANCH_MODE是指分支收集模式,其值可以是TIP_MODE或者TNT_MODE。如果採用TIP_MODE,那麼ptfuzzer只解析PT收集到的TIP包(一般為非條件跳轉),如果採用TNT_MODE,則不但解析TIP包,而且解析TNT包(條件跳轉)。TNT_MODE更加精確,開銷也較大一些。默認情況下ptfuzzer採用TNT_MODE。

MEM_LIMIT是只目標測試程序的最大內存限制,單位為MB。這個相當於AFL的-m參數。如果目標程序由於使用了太大的內存而不能運行,需要考慮增大MEM_LIMIT的設置。

PERF_AUX_BUFFER_SIZE是指存儲PT數據包的緩存大小,單位為MB。如果目標程序一次運行時間太長,可能會產生特別多的分支跳轉信息,導致緩存不夠,這時可以考慮增大PERF_AUX_BUFFER_SIZE的設置。在當前運行目錄

下編輯一個ptfuzzer.conf的文件可以配置這些參數,參考形式為:

#BRANCH_MODE=TNT_MODEBRANCH_MODE=TIP_MODEMEM_LIMIT=100            # afl -m argumentPERF_AUX_BUFFER_SIZE=32  # the size of buffer used to store PT packets.

總結

PTFuzzer採用Intel CPU最新的PT部件來收集分支信息,解決了AFL需要源碼支持的問題,能夠方面的挖掘Linux中的二進位程序漏洞。

*本文作者:hunterx,轉載請註明來自FreeBuf.COM

相關焦點

  • 漏洞挖掘|開源Fuzzer和Fuzzing學習資源整理
    通過動態二進位插樁獲取信息通過虛擬機獲取信息通過調試接口或者調試器獲取信息模糊測試框架模糊測試框架是一個通用的模糊器,可以對不同類型的目標進行模糊測試,它將一些單調的工作抽象化https://github.com/CIFASIS/QuickFuzzgramfuzz一種基於語法的模糊器,可以讓您定義複雜的語法來為文本和二進位數據格式建模
  • fuzz實戰之libfuzzer
    target (被 fuzz 的目標)基本上所有的程序的主要功能都是對一些 字節序列 進行操作,libfuzzer 就是基於這一個事實(libfuzzer 生成 隨機的 字節序列 ,扔給 待fuzz 的程序,然後檢測是否有異常出現) 所以在 libfuzzer 看來,fuzz 的目標 其實就是一個 以
  • websocket-fuzzer : WebSocket Fuzz 測試工具;Bash讀取/etc/passwd技巧
    v=242Tn0IL2jE3.Linux上的ELF 二進位文件格式理解與分析文章詳細介紹了ELF二進位文件格式的結構,使用readelf命令,我們可以查看文件的結構,如下圖所示。ELF/PE分析,惡意軟體分析,動態二進位分析,堆棧和整數溢出,尋找漏洞,漏洞利用exp編寫。
  • 利器|谷歌開源模糊測試工具 ClusterFuzz 應用嘗鮮從 0 到 1
    )》,原文連結:https://testerhome.com/topics/18171背景模糊測試,是指用隨機壞數據(也稱做 fuzz)攻擊一個程序,然後等著觀察哪裡遭到了破壞。嘗試二:修改運行環境,改為在網絡本身就沒問題的地方運行嗯,哪裡有這樣的環境呢?一個是自己買雲主機,另一個就是考慮用 docker hub 提供的構建環境了。看了下後面的使用步驟,也沒有需要在源碼目錄做操作的部分,就選擇 docker 吧。
  • Fuzz技術綜述與文件Fuzz
    異常檢測模塊負責監控程序在處理測試用例時是否發生異常,如果發生了異常就保存異常信息。Fuzz工具按照生成測試數據的方式可以分為基於生成的Fuzz工具(Generation Based Fuzzer)和基於變異的Fuzz工具(Mutation Based Fuzzer)。
  • honggfuzz漏洞挖掘技術深究系列(5)—— Intel Processor Trace
    對於閉源程序的反饋驅動Fuzzing,通常有3種方式:二進位插樁:使用Pin或DynamoRIO動態插樁監控代碼覆蓋率,比如winafl
  • MikroTik-SMB 測試之 Mutiny-Fuzzer
    Mutiny是由思科研究人員開發的一款基於變異的網絡fuzz框架,其主要原理是通過從數據包(如pcap文件)中解析協議請求並生成一個.fuzzer
  • 協議Fuzz技術
    了解~~溫馨提示:建議投稿的朋友儘量用markdown格式,特別是包含大量代碼的文章本節以Bacnet server為例,介紹如何進行協議Fuzz, 涉及工具 boofuzz 和 mutiny-fuzzer.
  • 從AFL開始FUZZ之旅
    我想介紹一些不一樣的東西-fuzz,也就是大家常說的模糊測試。Fuzz是近幾年來安全頂會的熱門,投稿難度也越來越大。一次成功的fuzz甚至能挖掘出幾十個CVE。我準備在該文章中先介紹fuzz相關的知識,然後以AFL為例演示一個fuzz例子;不足之處還請各位讀者斧正。
  • LibFuzzer workshop學習之路
    簡單來說就是通過與要進行fuzz的庫連接,並將libfuzzer生成的輸入通過模糊測試進入點(fuzz target)餵給要fuzz的庫進行fuzz testing。同時fuzzer會跟蹤哪些區域的代碼已經被測試過的,並且根據種料庫的輸入進行變異來使得代碼覆蓋率最大化。
  • Fuzz 私有協議的經驗分享
    簡單來說就是協議的複雜程度會有所不同,有些比其他的更複雜:例如,通常情況下給定的協議可能非常簡單 ,他們基於ASCII字符,易於理解,並且可以容易地與其他元素相關的其他欄位的消息。但也可能存在更複雜的協議。他們可能涉及不明顯的不同數據表示,二進位或序列化數據,校驗和和值欄位等。
  • fuzz實戰之afl
    前言像 libFuzzer, afl 這類 fuzz 對於 從文件 或者 標準輸入 獲取輸入的程序都能進行很好的 fuzz, 但是對於基於網絡的程序來說就不是那麼方便了。這篇文章介紹用 afl 來 fuzz 網絡應用程式。介紹afl 是一個非常厲害的 fuzz,最近幾年炒的火熱。
  • cpython歷史漏洞分析及其fuzzer編寫
    在編寫前,我們來看看cpython自己有沒有fuzz測試模塊,簡單搜索一下,發現在Modules/_xxtestfuzz/目錄下存在fuzz代碼,這就好辦了,我們直接在此基礎上添加我們想要測試的模塊的fuzz代碼就行首先閱讀一下fuzz.c大概的代碼邏輯就會發現,如果想要添加模塊的fuzz代碼,還是很簡單的主要需要修改的就兩個部分,拿struck.unpack來舉例子
  • IoT 設備固件分析之網絡協議 fuzz
    本文作者:cq674350529(信安之路新晉作者)通常,在對IoT設備的固件進行分析時,固件中與提供服務如HTTP、Telnet、RTSP、UPnP等相關的二進位程序是重點分析的對象對固件二進位程序進行分析,常見的分析方法包括模糊測試、補丁比對、工具靜態掃描和
  • AFL FUZZ使用與源碼閱讀筆記
    2.4 afl-fuzz.c借用一個圖來表明afl-fuzz.c的文件結構:run_target是通過共享內存來和fuzzer 進行交互,fork server 一直fork 進行父子程序的交互。寫)*/ fsrv_st_fd; /* Fork server status pipe (read) 數據狀態管道(fuzzer讀,forkserver寫)*///一個queue經過run之後,會生成新的trace_bits來記錄這個queue的trace情況,//也就是這個queue訪問了那些edge。
  • 未知的未知:九大模糊測試工具
    優秀的模糊測試工具能在程序面向公眾發布或部署前,就發現那些難以察覺的漏洞「大坑」。別被「模糊」這詞兒給迷惑了。模糊測試是一個很重要的流程,有助於發現影響當今複雜應用程式的未知關鍵錯誤,有時候甚至能暴露出一些讓人「腦洞大開」或者「七竅生煙」的奇葩問題。優秀的模糊測試工具常能夠在程序面向公眾發布或部署前,就發現那些難以察覺的漏洞「大坑」。
  • CRLFuzz:一款基於Go的CRLF漏洞快速掃描工具
    CRLFuzzCRLFuzz是一款功能強大的CRLF漏洞掃描工具,該工具基於Go語言開發,可以幫助廣大研究人員以非常快的速度完成CRLF
  • 程序安全分析平臺初探:IR 與應用
    所以基於 qemu 可以做怎樣的二進位分析工作呢,以下舉幾個例子:Bitblaze 是較早的二進位程序安全分析項目,很有代表性。其中的 temu 是其基於 qemu 的動態分析工具,主打作汙點分析。由於年代較為久遠,這裡不過多敘述,可參考http://bitblaze.cs.berkeley.edu/Unicorn 是相對較新的也更易用、更友好的二進位仿真執行框架。