安全圈 | 专注于最新网络信息安全讯息新闻

首页

savior:漏洞導向的混合模糊測試技術

作者 strmiska 时间 2020-02-27
all

S&P2020-Savior:漏洞導向的混合模糊測試技術

報告人:尹啟迪

簡介

    當前已有的混合模糊測試雖然對覆蓋率有很高的提升,但是仍然存在以下兩點問題: 1、對AFL提供的種子無挑選進行符號化執行操作;2、很多漏洞會覆蓋其所在分支但是沒有觸發。

   SAVIOR針對以上兩點問題,首先利用了LLVM的UBSan工具對二進位潜在漏洞點進行標記,構建CFG進行分析,在運行中計算未發現邊的漏洞數量進而打分實現對AFL種子的選擇排序;其次,把標記過UBSan標簽的LLVM中間程式碼給符號化執行組件,在符號化執行過程中約束求解來驗證漏洞是否存在。

    在24h的實驗中,SAVIOR發現漏洞的速率比DRILLER和QSYM分別快43.4%和44.3%,比DRILLER、QSYM分別多發現88和76個漏洞。

(一)漏洞導向的種子排序

   SAVIOR會優先選擇能導向更多漏洞可能的種子。要實現這個機制要有兩個要求,R1是能够知道一個種子在一次符號化執行後有可能執行哪些邊(當前unexplored)。R2是統計那些邊能够導向的漏洞數量。

    為了滿足R1,SAVIOR利用LLVM生成了程式的控制流圖CFG,記錄每個基本塊的id、其後繼id以及對應的邊資訊。在動態運行的時候,列印基本塊的id來獲取執行順序,從而知道有哪些邊是沒有被發現但是通過符號化執行是可以被發現的。

    為了滿足R2,SAVIOR先引入了Clang的標記工具Clang’s Undefined Behavior Sanitizer(UBSan),可以對一些記憶體操作進行標記並在LLVM中間程式碼中加入相應的驗證操作。下圖是SAVIOR選擇的四類記憶體操作,其餘的UBSan標籤會被去除。

    在CFG中可以得到一個邊能指向的UBSan數量,從而實現對邊的漏洞可能性排序。

然後打分方法如下:

    一個種子有n條沒有發現的邊{e1,e2,. . .,en}

    每條邊可以到達的UBSan標籤數量{L1,L2,. . .,Ln}

    每條邊在符號化執行中的求解難度{S1,S2,. . .,Sn}

  這樣一來對AFL種子隊列中的種子進行打分就可以實現種子排序。

(二)漏洞驗證機制

    之前提到了LLVM可以在中間程式碼中插入求解約束,在符號化執行階段就會進行約束求解,如果產生能觸發漏洞的新種子,則說明該標籤漏洞可以被觸發。

        SAVIOR分為三個部分,分別是以AFL-2.5b為主體的模糊測試部分、python編寫的用於種子排序挑選的中介軟體以及用於驗證漏洞、尋找邊界種子的符號化執行部件。

1、預處理。

        分析。對源碼進行UBSan標籤、修建標籤、構建CFG圖、記錄基本塊和邊的資訊。

插樁。SAVIOR插樁了三份程式,分別是用afl-gcc插樁用於AFL進行模糊測試的二進位,可以列印執行的基本塊id的中介軟體二進位程式以及插入了LLVM標籤約束的用於符號化執行的bitcode。

2、模糊測試

        由AFL獨立運行。

3、中介軟體

        中介軟體既要從AFL種子隊列中挑選種子給concolic testing做符號化執行,又要把符號化執行中有用的結果挑選出來加入AFL的種子隊列。

        挑選種子階段把AFL種子隊列中的新種子在本地運行一邊,因為會列印執行過的基本塊id得到基本塊的執行序列,就得到了沒有發現的邊集合,就可以對種子進行打分了。

        符號化執行完把新的種子跑一遍,只留下帶來新的覆蓋率或者觸發新的標籤的種子留下來,並把這些種子加入AFL的隊列。同時,對於符號化執行後沒有被求解的邊,對應的求解難度加一。

4、符號化執行部件

        首先對KLEE進行修改使其能够進行concolic testing。然後再本地建立一個bitmap來解决路徑爆炸問題。同時為了减少符號化執行初始化的時間,採用了ForkServer模式加快了符號化執行速度。

        這裡的數据集是LAVA-M和8個現實生活中的程式。

對比的工具既有混合模糊測試工具(DRILLER、QSYM),也有AFL作為基準比較,還有導向fuzz(AFLGO,TFUZZ等)

從發現漏洞的效率(數量、速度)以及發現漏洞的徹底性進行比較。

這裡舉tcpdump的測試結果作為例子。

可以看到,SAVIOR不是覆蓋率最高的,但是觸發的漏洞最多,原因在於UBSan的引入减慢了運行過程、同時符號化執行採用KLEE,速度也不高。但是由於漏洞驗證機制,他能發現更多的漏洞。

為了突出漏洞驗證機制的優越性,SAVIOR把所有fuzzer再24h運行後的種子放入SAVIOR的符號化執行部件,由於UBSan插入的LLVM IR,符號化執行部件能在種子輸入中對漏洞標籤處約束求解,得到能够觸發漏洞的新種子。

(圖中+X/Y%,意為新增了X個漏洞,較自己發現漏洞數提升的Y%)

       SAVIOR較之前的模糊測試加入了種子選取以及漏洞驗證機制,能够更有效地發現漏洞。其中,UBSan標籤帶來的漏洞驗證機制可以引入到我們的工作中去幫助挖掘漏洞;同時,實驗的對比方法也值得借鑒。

報告人:尹啟迪

組織:國防科技大學軟件安全智慧並行分析實驗室

地點:銀河樓後樓5樓會議室