作者:此彼
公眾號:螞蟻安全實驗室
近日,螞蟻安全天穹實驗室安全專家吳濰浠在國際安全會議Hack In The Box Singapore上分享了議題《探索先進自動化漏洞挖掘技術中的不足》。
議題通過幾個具有特殊邏輯的演示代碼,揭示出AFL、libFuzzer、KLEE、QSYM等幾款傳統自動化漏洞挖掘工具,在某些特定程序邏輯下存在的無法高效覆蓋的問題。
議題同時提出“約束反向傳播”的新思路,并用demo證明在某些特定程序邏輯的漏洞挖掘工作中,新方法能夠大大提升Fuzz的效率和覆蓋度;最后,結合傳統Fuzzer的技術,提出了實現模仿人工代碼審查的混合fuzz新思路。
一、動機
希望實現一個自動化漏洞挖掘工具,其ROI能夠達到或超過一般人工代碼審查的能力。
二、目前現實
在使用現有的fuzz工具之前我們通常需要做很多準備工作,一般準備工作有:
-
將代碼中的魔數和關鍵詞制作成字典提供給工具。
-
移除數據完整性驗證代碼,如libPNG中的checksum函數。
-
提供涉及代碼不同功能的種子文件,如使用不同壓縮算法的mp4文件。
-
編寫代碼,將fuzz工具提供的數據解釋成API調用來測試目標代碼。
編寫代碼,將fuzz工具提供的數據改寫成目標代碼可接收處理的格式。
這些工作基本都是為了彌補現有工具能力的不足而做的。
三、不足原因
假設代碼((volatile uint8_t )0) = 0是我們想要找到并觸發其運行的bug。
1、無法求解無法逼近的約束
AFL無法在以下代碼中找到bug

AFL采用的是反饋驅動的遺傳算法。其反饋信息中不包含任何條件信息,無法構造滿足特定條件的數據,完全靠碰撞。當遇到32位整型條件時,碰撞概率為2的32次方分之一,幾乎不可能碰撞成功。
AFL和libFuzzer無法在以下代碼中找到bug

雖然libFuzzer已經在反饋中添加了對條件判斷語句的反饋,但只使用漢明距離和絕對值距離計算條件語句中左值和右值的距離。這兩種算法的逼近作用是有限的,很多條件是逼近不了的。
下圖是libFuzzer計算距離的部分代碼:

變量HammingDistance和AbsoluteDistance就是計算出的漢明距離和絕對值距離。
2、存在巨量不存在漏洞的代碼路徑
AFL、libFuzzer、KLEE和QSYM都無法在以下代碼中找到bug


當形成漏洞的路徑藏在2的大幾十甚至幾百次方數量級的可執行路徑中,正向遍歷或者隨機選擇都毫無意義。
四、解決方法
漏洞的形成都是有充要條件的,利用這些充要條件,去選擇可形成漏洞的路徑。
我們可以假設漏洞是存在的,再去證明其不存在。
變量約束反向傳播
步驟:
1. 獲得形成漏洞的充分必要約束
如代碼:
if (flags == 0xff)
*((volatile uint8_t *)0) = 0;
的充要約束為:
flags == 0xff
如代碼:
memcpy(dst, src, size);
的充要約束為:
size > allocated_size(dst) || size > allocated_size(src)
2.沿著變量賦值的反方向,將約束傳播給新變量
下圖展示了約束表達式在每次傳播后的變化

3.當所有的約束都只作用于輸入變量且可解時,求解約束,就能得到一個能觸發漏洞的輸入數據
demo實現
以下demo是在LLVM的bitcode中間碼上實現了簡單的變量約束反向傳播,下圖是示意圖。

下圖是一段“按位與”運算反向傳播的代碼實現。

代碼將舊的變量會從需要反向傳播的變量列表中刪除,將新的需要反向傳播的變量加入,并構造約束。
demo效果
一定程度上解決了上面AFL、libFuzzer、KLEE、QSYM等常見Fuzzer在特定邏輯下難以覆蓋到某些漏洞的問題。
最終可能的實現的是Constraint-guided Fuzz
在實際的工程領域,想要通過變量約束反向傳播解決實際問題還有大量的工作要做:
-
借助assert和address sanitizer做漏洞假設,形成充要約束。
-
利用libFuzzer或AFL快速找到多個涉及不同代碼塊的具體路徑。
-
在一定距離上做反向傳播。因為有大量的函數指針、外部函數等間接調用使得反向傳播路徑不一定能找到。
-
在反向傳播中斷時,可以利用像libFuzzer中的逼近算法去滿足變量的約束。
五、給研究者建議
如果你的目標僅僅是挖掘漏洞并實現利用,現有的Fuzz工具效率最高;如果對特定的邏輯下Fuzz的有效性更加感興趣,可以用本文的思路去開發新的Fuzz工具。
只不過由于本文主要目的在于拋出一個利用反向傳播技術實現的新的Fuzz思路,想要依據這個思路開發成熟的Fuzz工具還需要投入大量的時間。漏洞挖掘手段的革新往往會帶來成倍的收益,但是其投入也不是一般的漏洞挖掘所能比擬的。
關于作者

吳濰浠:螞蟻安全天穹實驗室支付安全專家,國內第一個谷歌安卓漏洞賞金獲得者,某國內知名PWN新基建特別獎獲得者,研究領域覆蓋漏洞。
掃碼關注螞蟻安全實驗室微信公眾號,干貨不斷!
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1404/
暫無評論