20199116 2019-2020-2 《網絡攻防實踐》期末綜合大作業


20199116 2019-2020-2 《網絡攻防實踐》期末綜合大作業

我選擇的論文是AntiFuzz: Impeding Fuzzing Audits of Binary Executables

我將從論文綜述、設計細節、論文復現、思考與感悟四個部分來介紹。

一 論文綜述

1、文章簡介

本文作者是authors:Emre Güler, Cornelius Aschermann, Ali Abbasi, and Thorsten Holz,
Ruhr-Universität Bochum。本文發表於USENIX’19, August 14–16, 2019 • Santa Clara, CA, USA

2、摘要

計算機安全的一般防御策略是在計算資源和人員時間上增加成功攻擊的成本。在二進制安全領域,這通常是通過使用混淆方法來阻礙逆向工程和尋找軟件漏洞來實現的。然而,最近自動發現錯誤的趨勢改變了工作方式。現在通過各種模糊工具發現bug是很常見的。由於自動化程度的不斷提高和對更好的模糊策略的研究,數百個目標的大規模、拖網式模糊變得可行。正如我們所展示的那樣,當前的混淆技術旨在提高人類理解的成本,並且對減慢模糊性的作用很小。

在本文中,我們介紹了幾種技術來保護二進制可執行文件免受基於模糊測試、符號/共謀執行和污點輔助模糊測試(通常稱為混合模糊測試)的自動錯誤查找方法的分析。更具體地說,我們對錯誤發現工具的基本假設進行了系統的分析,並為每個假設開發了通用的對策。請注意,這些技術並不是針對fuzzing工具的特定實現而設計的,而是針對bug查找工具所必須依賴的一般假設。我們的評估表明,這些技術有效地阻止了模糊審計,同時引入了微不足道的性能開銷。正如模糊化技術增加了尋找漏洞所需的人力,我們的技術也使得基於模糊化的自動化方法變得無用。

3、論文核心

本文的目標就是AntiFuzz(反模糊),阻止二進制可執行文件的模糊檢查。作者首先系統分析了當前19種漏洞查找工具(或稱為模糊器)的所依賴的基本假設,並將它們分為4類,分別為:(i)覆蓋范圍會產生相關的反饋,(ii)可以檢測到崩潰,(iii)每秒可以執行許多次執行,並且(iv)使用符號執行可以解決約束。然后基於這4類假設,我們開發了模糊對策,並以可配置的,自動生成的單個C頭文件的形式實施了輕量級保護方案,開發人員可以將其添加到應用程序中以阻止模糊器。此外,我們發現這種反模糊技術在SPEC基准套件中沒有引入可觀察到的、統計上顯著的性能開銷。

二、設計細節

1、模糊器(或漏洞查找工具)的基本假設分析分為:

(1)覆蓋范圍會產生相關反饋:覆蓋引導的模糊器通常假設新的代碼覆蓋也與新的行為密切相關。因此,每次現代覆蓋引導的模糊器生成一個遍歷新代碼區域的輸入時,都假定程序的行為與以前的輸入所導致的行為不同。(反饋機制有助於確定哪些輸入將導致新的代碼覆蓋。)
(2)可以檢測到崩潰:大多數漏洞查找工具都能夠以有效且可擴展的方式區分崩潰輸入和非崩潰輸入。所以,它們需要一些技術來檢測應用程序是否崩潰。
(3)每秒執行很多次:為了有效地生成覆蓋范圍廣的輸入文件,每秒執行的次數必須盡可能多。通常模糊器每秒執行幾百次到數千次執行。
(4)約束可以用符號執行來解決:基於符號執行的混合模糊器或工具能夠以符號形式表示程序的行為並求解結果公式。

2、AntiFuzz(反模糊)技術

本文提出了以下技術進行AntiFuzz(反模糊):
(1)攻擊覆蓋率指導
覆蓋率指導的模糊器的核心假設是:新的覆蓋率指示程序中的新行為。
通過添加不相關的代碼區域(我們稱為偽代碼),這樣它的覆蓋信息掩蓋了實際信號,干擾了模糊器中的代碼覆蓋跟蹤機制,削弱了模糊器以任何有用的方式使用反饋機制的能力,從而消除了它們相對於盲式模糊器的優勢。
在覆蓋信息中引入噪聲,使用了兩種技術:
a)旨在為所有為幾乎所有輸入生成不同的“有趣的”覆蓋。根據覆蓋指導的假設,任何新的覆蓋都以為模糊器找到了導致新行為的輸入,因此,如果由於假代碼程序總是顯示新的覆蓋率,模糊器就無法區分合法的新覆蓋率和無效的假覆蓋率。
b)旨在添加看起來像是屬於原始應用程序的合法輸入處理代碼的偽造代碼。同時,此代碼應包含大量的簡單約束以及一些十分復雜困難的約束。然而簡單的約束就可以使我們向真實的覆蓋范圍信息中添加噪音
打破了假設:反饋機制有助於確定哪些輸入將導致新的代碼覆蓋。

(2)防止崩潰檢測
模糊器有以下三種常見方式檢測是否發生崩潰:
(i)觀察退出狀態;(ii)通過覆蓋信號處理程序來捕獲崩潰的信號;以及(iii)使用操作系統(OS)級別的調試接口(例如ptrace監控進程)
技術:
為加強受保護的程序對模糊器的抵抗,通過常見的反調試措施以及優雅地退出應用程序的自定義信號處理程序來阻止上述方法。
也就是,在所有崩潰被報告給外部實體前,終止應用程序,阻止捕捉崩潰。這打破了崩潰輸入可以檢測到的假設。

(3)推遲執行
模糊化工具需要每秒多次執行才能有效地運行。
技術:
我們檢查輸入是否為格式良好的輸入;當且僅當我們檢測到一個不正確的輸入時,我們強制應用程序人工減速。但這種減速對於用戶來說,250ms幾乎注意不到;這種延遲會影響模糊器。即,只有模糊器會受到此技術的影響。導致延遲的最簡單方法:使用sleep()函數
但是,為了增強推遲執行這種技術對自動代碼分析和修補工具的抵抗力可以向受保護的程序添加一個計算量很大的任務(例如,加密、哈希計算,甚至加密貨幣挖掘),從而使延遲執行能夠繼續執行。
這打破了應用程序每秒可以執行數百或數千次的假設,從而嚴重限制了有效查找新代碼覆蓋率的機會。

(4)使符號執行引擎超載
為防止程序分析技術提取信息來解決約束並覆蓋更多代碼,提出兩種技術,它們都基於這樣的想法:簡單的任務可以用某種方式來重寫,這使得人們很難對它們的行為進行推理。兩種技術:
a)使用哈希比較,將所有輸入數據與常量(例如,magic bytes)的比較替換為強加密散列值的比較。可使計算結果要復雜得多。結果得到的符號表達式顯著增長,求解器無法為這些方程式找到令人滿意的分配。於是無法找到正確的輸入。
b)使用分組密碼對輸入進行加密然后解密
這打破了應用程序中的約束是可解(即約束課用符號執行解決)的假設。

三、論文復現

1、實驗環境

Ubuntu

2、實驗安裝

(1)安裝AFL

首先從github上下下載afl

依次運行makemake install安裝AFL

進行fuzzing

在安裝好afl之后,我們就可以來fuzzing程序了,但是在fuzzing程序之前,我們需要對程序進行插樁。
運行./configure CC="afl-gcc" CXX="afl-g++"

就可以完成對程序進行插樁。

以sam2p為例,我們可以運行下面的命令對程序進行插樁。

然后我們就可以fuzzing程序了,其中

-i 選項是fuzzer的初始輸入。

-o 之后跟的是程序的輸出結果。

@@在運行中會被輸入所替換。

下圖所示是fuzzing的面板。

(1)安裝honggfuzz

和AFL類似,我們首先從github上下載honggfuzz。

運行make make install來安裝honggfuzz

進行fuzzing

在安裝好honggfuzz之后,我們就可以來fuzzing程序了,但是在fuzzing程序之前,我們需要對程序進行插樁。
運行./configure CC="hfuzz-gcc" CXX="hfuzz-g++"

就可以完成對程序進行插樁。

以tiff軟件為例,我們可以運行下面的命令對程序進行插樁,然后運行make;make install命令安裝tiff軟件。

然后我們就可以fuzzing程序了。
其中 -f 選項是fuzzer的初始輸入,tiff_seed文件夾中包含了很多tiff格式的文件。下圖是fuzzing代碼

其中 -f 選項后面指向程序的輸入文件夾。
-w 之后跟的是程序的輸出結果。

-t 選項設定timeout

–run-time 選項制定fuzzer運行的時間

-z 表示采用插樁模式,對源碼進插樁
__FILE __: 相當於AFL中的@@, 在運行時被程序的輸入文件替換。

下圖所示是執行完上圖腳本后的fuzzing的面板。

2、實驗結果

論文的評估旨在回答以下五個問題

問題1:當前的混淆技術對於通過模糊進行自動漏洞查找是否有效?(無效)

軟件混淆的目標之一是防止依賴傳統的手動逆向工程技術的安全研究人員發現錯誤。
使用TIGRESS 2.2 (C語言的混淆器)混淆了一個虛擬應用程序(見下方清單2),並讓不同的模糊器找到正確的崩潰輸入。

在本實驗中,我們使用了AFL、HONGGFUZZ、KLEE和ZZUF,它們代表了所有三種模糊器的類別。
本文用盡可能多的模糊化特性來配置TIGRESS,實驗表明,盡管采用了各種模糊技術,但所有的模糊器都能找到崩潰輸入。所以,當前的混淆技術對於自動的錯誤發現技術是無效的。

問題2:我們設計的技術在破壞目標模糊假設方面是否有效?(有效)

使用與上個實驗一樣的應用程序,並且一次使用一種抗模糊技術。在沒有反模糊功能的情況下,8個模糊器只需要幾秒鍾到幾分鍾就可以找到崩潰的輸入。
我們的反覆蓋功能阻礙了所有覆蓋率指導的模糊器。使用我們的防崩潰檢測技術時,所有的模糊測試者都找不到崩潰。

表2:對虛擬應用程序進行評估。√ 意味着ANTIFUZZ成功地阻止了錯誤發現(沒有發現崩潰),× 意味着至少發現了一個崩潰輸入。”None”意味着ANTIFUZZ被禁用,”All”意味着所有對抗模糊器的技術(覆蓋,崩潰,速度和符號執行)被打開。

Klee至少運行了24小時,然后由於內存限制而崩潰。

問題3:這些技術在防止模糊器發現漏洞方面是否有效?(有效)

使用LAVA-M數據集評估ANTIFUZZ,在LAVA-M的4個應用程序base64,uniq,who,md5sum中查找崩潰。
這些結果表明我們的反模糊功能適用於實際的二進制文件,以防止發現漏洞。

表:√表示ANTIFUZZ成功阻止了錯誤發現(未發現崩潰),×表示至少發現了一個崩潰輸入,#號表示找到的唯一崩潰數。 None表示已禁用ANTIFUZZ,All表示已啟用所有針對模糊器的技術(覆蓋率,崩潰,速度和符號執行)。

問題4:這些技術是否有效減少了正在測試的代碼量?(有效)

我們針對binutils集合中的八個實際二進制文件(即addr2line,ar,size,strings,objdump,readelf,nm-new,strip-new)對AFL,HONGG-FUZZ,VUZZER和QSYM進行了評估。
在“無”設置(禁用了ANTIFUZZ)中,每個模糊器和每個應用程序都在24小時內執行了3次,然后在“所有”設置(啟用了所有ANTIFUZZ功能)中又執行了一次。

問題5:我們的技術是否會帶來任何顯著的性能開銷?(不會)

使用SPEC CPU2006版本1.1 INT基准,度量在復雜程序上使用反模糊所導致的性能開銷。
該實驗包含所有采用輸入文件的基准測試,基准測試分別進行了3次迭代,並用幾何平均值對10次運行進行了平均。
實驗結果表明:ANTIFUZZ對每個基准的影響微不足道,幾乎無法承受甚至沒有可觀察到的開銷

四、思考與感悟

對於《網絡攻防實踐》這門課程,最大的問題就是基礎知識薄弱,學習這門課的過程中有點吃力。平時寫作業總是需要請教同學或者百度。雖然第一次接觸虛擬機,但確實通過這門課學到了一些東西。

這次的綜合實踐中,我選的這篇論文有點難理解,看了好多遍,想要把論文里的細節搞懂。關於論文的復現,覺得自己動手能力、學習能力有待提高,特別是在代碼、程序方面需加強,所以想要在假期好好學習一下。

參考文獻

以下是在學習過程中部分參考文獻


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM