本站小編為你精心準備了控制流污點信息導向的符號執行參考范文,愿這些范文能點燃您思維的火花,激發您的寫作靈感。歡迎深入閱讀并收藏。
《中國科學技術大學學報》2016年第一期
摘要:
以快速生成能夠覆蓋可能存在缺陷程序點的測試用例為目標,結合基于生成的Fuzzing技術、靜態程序控制流分析、靜態污點分析等手段,提出一種導向式動態符號計算方法.通過Fuzzing生成能夠到達包含缺陷程序點的函數的測試用例,作為種子輸入驅動符號執行快速到達缺陷函數;在缺陷函數內利用靜態控制流分析、靜態污點分析計算出控制流污點可達程序切片,基于該切片進行朝向缺陷點的多路徑動態符號執行.實驗驗證了方法能夠有效減輕符號執行應用中廣泛存在的路徑爆炸問題,并且能生成觸發目標缺陷的測試用例.
關鍵詞:
控制流分析;污點分析;導向式符號執行
隨著機器計算能力和約束求解能力的不斷提升,近年來動態符號執行技術發展迅速.在整數、位向量理論的表達范圍內描述程序的操作語義,以關于輸入變元約束等價類的形式刻畫程序的路徑空間,符號執行技術能夠實現對目標程序的精確分析、路徑空間的高效覆蓋,已成為面向大規模預的二進制軟件缺陷發掘的最佳選擇之一[1-3].符號執行往往關注于目標程序的全部路徑空間,然而該空間并不總能被完全覆蓋[4].適度的搜索空間約減是使該技術實際可行的關鍵.盡管當前相關的研究(包括限制循環次數[5-6]、選擇式符號執行[7]、符號執行并行化[8]等)在某些場景中被證明為有效,基于符號執行的缺陷發現技術依然不足以在實際應用中為大型程序的安全性分析提供支撐.缺陷挖掘過程中常常關注于這樣的應用場景:給定缺陷程序點θ,求解能到達θ并觸發目標缺陷的輸入實例.在這一情況下,分析引擎可以不關注于完整的路徑空間,僅僅針對那些能夠到達θ的路徑集合進行安全分析.由此,本文提出一種結合基于生成的Fuzzing測試[9]、靜態控制流分析、靜態污點分析、動態符號執行等技術的程序分析方法,通過有導向性的路徑分析確定出目標程序點的污點控制流依賴關系,自動生成能夠到達目標程序點并觸發對應缺陷的輸入實例.
1系統框架
系統框架如圖1所示,包括6個部件:良構輸入生成器、執行監視器、靜態控制流分析引擎、靜態污點分析引擎、動態符號執行引擎和缺陷驗證器.在給定目標程序P和P中已知的缺陷程序點θ、程序良構輸入對應的協議規約τ的情況下,良構輸入生成器應用基于生成的Fuzzing技術生成滿足τ的良構種子輸入,交由執行監視器監視其在P中的執行軌跡,從中篩選出能夠到達θ點所在函數f的良構輸入集合Inputs;靜態控制流分析引擎計算出函數f到程序點θ的所有靜態可達的控制流路徑集合CFGslc.靜態污點分析引擎基于CFGslc,結合動態污點分析得到的函數f入口點的污點狀態,應用流敏感的控制流污點分析,篩選出能將污點輸傳播到θ程序點處敏感操作數的路徑集合CFGt-slc.動態符號執行引擎綜合Inputs執行軌跡和CFGt-slc蘊含的路徑信息,引導符號執行進行朝向θ的安全分析.缺陷驗證器最終對獲取的輸入實例進行測試,確認是否能觸發θ點處的目標缺陷.
2控制流污點信息計算
靜態控制流污點信息計算包括兩個部分:控制流信息計算和污點信息計算.這部分工作實現基于Binnavi二進制分析平臺[10].
2.1靜態控制流分析給定目標程序P和脆弱程序點θ,本文的靜態控制流分析首先確定出包含θ的函數f.對包含θ的模塊M,構造過程調用圖CG和由每個函數funci的過程內控制流圖cfgi構成的集合CFG.其間對于M中存在的間接跳轉、間接調用等情況,本文采用跳轉表識別、具體輸入執行記錄分析等手段補足控制流信息。
2.2污點信息計算上節的算法能夠計算出目標函數f入口點到目標程序點θ的靜態控制流可達切片CFGslc.然而,并非沿著該切片執行的所有路徑都能夠將外部輸入相關信息(污點信息)傳播到θ處的敏感操作數λ.需要計算出能夠將污點傳播到λ的基本塊序列.靜態污點分析[11]一般以外部輸入的讀取位置(諸如Linux系統下的read函數調用點)作為污點引入點,將相關的讀取緩沖區內容標記為污點操作數,沿著程序控制流圖(一般就單個可執行程序模塊而言)計算污點數據流信息,考察關鍵程序點(sink)處敏感操作數的污點狀態.然而在二進制分析背景下,污點數據的讀取位置可能不在包含目標函數f的模塊內,導致無法在對該模塊的數據流分析中引入污點信息.本文采用了一種動態污點分析和靜態污點分析結合的方法.首先由動態污點分析,以基于生成的Fuzzing篩選出的能夠到達函數f的良構輸入集合Inputs為種子輸入,計算出在函數f入口點處的污點程序狀態(包括寄存器、內存等)Statef,靜態污點分析引擎隨之將2.1節中計算出的目標函數f入口點到目標程序點θ的控制流可達切片CFGslc標準化(確保CFGslc中入口點entry只有一個入口邊,出口點exit只有一個出口邊),提升所有二進制指令為vine中間語言,并轉換為靜態單賦值形式,在圖4所示的控制流污點格上進行流敏感的正向數據流分析.
大型程序路徑狀態空間龐大,能到達目標程序點的路徑數量則相對較?。谙薅ㄓ嬎阗Y源的情況下分析引擎對這部分路徑的覆蓋概率較低.導向式符號執行首先基于目標程序的控制流圖計算出目標程序點控制流可達路徑,僅僅對這部分路徑進行分析.由此確保了在資源限定的情況下,可以生成能夠到達目標程序點的輸入實例.然而,在二進制程序分析背景下,當前導向式符號執行存在如下問題:(Ⅰ)二進制程序運行時包含多個可執行模塊,計算程序路徑所需要的完整的控制流圖往往并不可得,一般只能關注于可執行程序自身模塊的控制流計算.對于目標程序點在其它動態可加載模塊的情況并適用;(Ⅱ)程序的執行路徑不僅與程序的控制流相關,同時也與其數據流相關.為便于計算可達路徑,當前控制流分析一般將控制流圖中循環結構的回邊、調用圖中遞歸結構的回邊略去.由此導致那些能夠到達目標程序點同時觸發缺陷的程序路徑,由于在對循環等關鍵程序結構的遍歷中并不遵從分析假定的簡單模式而被丟棄.圖5導向式符號執行Figure5Directedsymbolicexecution針對上述問題,結合“缺陷程序點所在函數往往包含在良構輸入的處理路徑中”這一啟發式原則[13],本文提出一種單路徑具體-符號混合分析和多路徑符號分析相結合的方法.如圖5所示(圖5中實線表征符號執行實際分析的程序路徑,虛線表示控制流可達而符號執行并未進行分析的程序路徑),以包含目標程序點θ的函數f為界,在程序入口點到函數f入口點之間,利用基于生成的Fuzzing技術構造的能夠到達函數f的良構種子輸入I驅動符號執行引擎進行“嚴格遵循I執行軌跡”單路徑符號執行,記錄f入口點的程序機器狀態(包含具體機器狀態和符號機器狀態)SCStatef;在函數f入口點到目標程序點θ之間,則以SCStatef為初始狀態,基于第3節中計算出的控制流污點可達切片進行“忽略不相關路徑”的導向式多路徑符號執行.
4實驗分析
基于Fuzzing平臺Peach[14]、二進制靜態分析平臺BinNavi和全系統動態符號執行平臺S2E[15],本文構建了面向缺陷程序點的導向式二進制程序符號執行原型系統,以WindowsXPProfessional版本2002ServicePack3操作系統平臺下實際公開的程序缺陷為數據源對方法有效性進行了驗證實驗,其中缺陷程序點通過人工分析缺陷成因確定.缺陷的主要信息如下:對上述給定缺陷,利用基于生成的Fuzzing技術構造出能夠到達bug函數的種子輸入,驅動符號執行沿單路徑快速到達bug函數,進而在bug函數內朝向bug程序點進行導向式路徑分析,成功生成能夠到達缺陷程序點的測試用例.本文從基本塊約減、路徑約減兩方面對提出的“忽略不相關路徑”的導向式多路徑符號執行的計算性能進行分析.表2給出了目標函數內基本塊約減情況.其中PreBlocks表征約減分析前目標函數內聯基本塊的數目,PostBlocks表征約減分析后目標函數內聯基本塊的數目.
5結論
本文對面向給定程序點的測試用例快速生成技術進行了研究,提出了一種導向式動態符號執行方法.主要工作包括:應用基于生成的Fuzzing技術生成種子輸入,導向單路徑符號執行快速到達脆弱函數;結合靜態控制流分析和靜態污點分析計算出脆弱函數到脆弱程序點的靜態可達路徑集合,導引多路徑動態符號執行引擎僅僅關注于這些路徑的符號分析.實驗驗證了方法作為路徑爆炸問題減輕手段的有效性.下一步的工作包括:多線程計算環境下程序缺陷的分析建模;將該方法與靜態程序分析工具相結合,進而降低靜態分析中廣泛存在的誤報率較高問題等.
作者:黃暉 陸余良 劉林濤 趙軍 單位:合肥電子工程學院網絡系