一種二進制程序漏洞挖掘方法和系統的制作方法
【技術領域】
[0001] 本發明涉及計算機應用技術領域,特別涉及一種二進制程序漏洞挖掘方法和系 統。
【背景技術】
[0002] 從漏洞挖掘對象來分,軟件漏洞挖掘可以分為兩類:一類是針對源代碼的漏洞挖 掘;另一類是針對二進制程序的漏洞挖掘。源代碼漏洞挖掘的最大特點是:有豐富、完備的 語義信息。所以,針對源代碼的漏洞挖掘相對比較容易。一般采用靜態分析的方法就可以檢 測出漏洞,且在靜態分析時,由于有明確的程序執行路徑,所以其通常有較高的代碼覆蓋 率。
[0003] 然而源代碼畢竟不是二進制程序,源代碼層次的安全并不代表二進制程序的安 全,兩者之間的對應性無從驗證,比如,源代碼中不存在編譯、鏈接過程中引入的漏洞。 Linux系統下的符號鏈接漏洞就是在鏈接過程中引入的漏洞,該類漏洞在源代碼中并不存 在,卻真實地存在于二進制程序中。另一方面,由于商業利益和軟件產權保護等問題,很多 時候安全工作者并不能拿到軟件源代碼,而只能針對二進制程序進行漏洞挖掘。所以,研究 二進制程序的漏洞挖掘具有十分重要的意義。
[0004] 從語義信息上來說,二進制漏洞挖掘要比源代碼困難許多,因為它面對的不是具 有完整語義的高級語言,而是貼近系統底層的機器碼。也正因為此,對二進制程序進行漏洞 挖掘,會比在源碼上更加實用與準確。
[0005] 對于二進制程序的漏洞挖掘,按照其是否真實執行可分為三類:1)靜態分析法進 行漏洞挖掘;2)動態執行法進行漏洞挖掘;3)動靜結合進行漏洞挖掘。
[0006] 靜態分析指在不執行程序的情況下,對程序進行語義、流程分析的技術。靜態分析 中,目前研究較多的是靜態污點分析(Static taint analysis)和符號執行(Symbolic execution)。靜態污點分析是在程序數據流和控制流分析的基礎上,將輸入數據標記為"污 染數據"(不可信數據),然后檢查被污染數據是否影響程序中某些關鍵節點,比如:jmp、 call指令。如果影響,則認為存在漏洞。而符號執行指在不真實執行程序的情況下,用符號 值表示程序變量的值,然后模擬程序執行來進行相關分析。
[0007] 動態執行指通過真實執行二進制程來進行漏洞挖掘。該技術目前采用較多是動態 污點分析(Dynamic taint analysis)和模糊測試(Fuzzing)。動態污點分析和靜態污點分 析的原理基本相同。區別在于,靜態污點分析在檢測時并不真正運行程序,而是通過模擬程 序的執行來傳播污點標記;而動態污點分析技術需要運行程序,同時實時傳播并檢測污點 標記。模糊測試(Fuzzing)在一種基于動態執行的漏洞挖掘方法,在整個軟件漏洞挖掘領域 中占有重要地位,也是目前二進制程序漏洞的主要挖掘方式。該技術通過構造不同樣本數 據來測試二進制程序的執行狀況,從而確定目標程序是否存在漏洞。
[0008] 靜態分析與動態執行技術都有其各自的優缺點,比如:靜態分析的優勢在于分析 全面,但準確性差強人意。動態執行在準確性上表現良好,但代碼覆蓋率很低。僅僅依靠靜 態或者動態的方式對二進制程序進行漏洞挖掘顯然存在一定的弊端,如何采用動靜結合的 方式進行有效的漏洞挖掘是該領域技術人員需要解決的技術問題。
【發明內容】
[0009] 本發明提供一種二進制程序漏洞挖掘方法和系統,以解決上述技術問題。
[0010] 本發明提供的一種二進制程序漏洞挖掘方法,包括步驟:
[0011] 步驟A,采用反編譯器IDA將二進制程序轉化為匯編語言,并基于IDA進行匯編語言 層次的靜態分析得到函數流圖;
[0012] 步驟B,通過中間語言平臺BAP將所述匯編語言轉化為BIL語言,并結合靜態分析的 分析結果對所述BIL語言進行Promela模型建模;
[0013] 步驟C,構建漏洞模型,并插入到所述Promela模型中;
[0014]步驟D,引入外部C代碼修補SPIN,并基于修補后的SPIN模擬執行所述Promela模 型,檢測漏洞;
[0015]步驟E,輸出檢測結果和漏洞信息。
[0016]其中,所述步驟B中結合靜態分析的分析結果對所述BIL語言進行Promela模型建 模包括步驟:
[0017] B1,依據靜態分析得出的函數流圖,對BIL代碼進行程序切片切分成BIL語句;
[0018] B2,進行從切分后得到的BIL語句到Promela語句的細粒度代碼轉化;
[0019] B3,將經過細粒度代碼轉化后的Promela語句構建、組裝成Promela模型。
[0020] 其中,步驟B1包括步驟:
[0021] 依據靜態分析的函數流圖,以sub函數為單位,將BIL代碼切分成不同函數片斷;
[0022] 對BIL代碼中的匯編指令進行多維度匹配,將所述函數片斷切分成指令集;
[0023]對BIL語句的完備性進行檢驗,以將BIL指令集切分成BIL語句。
[0024] 其中,步驟B2包括步驟:
[0025] 預先對BIL語句的各種特征進行總結,并構建BIL語句的特征池將其置于特征池 中;
[0026] 將待轉化的BIL語句與所述特征池中的特征進行匹配;
[0027] 將匹配后的BIL語句轉化為符合Promela中嵌C語法的Promela語句。
[0028] 其中,步驟C包括:
[0029]對已知的軟件漏洞樣本進行分析總結,抽象出漏洞特征,用Promela語言描述漏洞 特征,建立漏洞模型;
[0030]采用代碼插粧技術,將所述漏洞模型插入到所述Promela模型中。
[0031]其中,步驟D中引入外部C代碼修補SPIN包括步驟:
[0032]預先設置外部C代碼,來構建執行所述Promela模型必要的系統資源、維護臨時狀 態、處理SPIN無法處理的BIL中的表達式和關鍵字以及處理BAP無法解析的匯編指令;
[0033]步驟D中基于修補后的SPIN模擬執行所述Promela模型,檢測漏洞包括步驟:
[0034] 將Promela模型轉化為C代碼程序;
[0035]使用編譯器將轉化后的C代碼和外部C代碼聯合編譯成一個可執行程序;
[0036]執行編譯好的可執行程序進行模型檢測。
[0037]本發明還提供一種二進制程序漏洞挖掘系統,包括預處理模塊、代碼轉化模塊和 模型檢測模塊;
[0038]預處理模塊,用于采用反編譯器IDA將二進制程序轉化為匯編語言,并基于IDA進 行匯編語言層次的靜態分析得到函數流圖;
[0039] 代碼轉化模塊,用于通過中間語言平臺BAP將匯編語言轉化為BIL語言,并結合靜 態分析的分析結果對BIL語言進行Promela模型建模;構建漏洞模型插入到Promela模型中;
[0040] 模型檢測模塊,用于引入外部C代碼修補SPIN,并基于修補后的SPIN模擬執行所述 Promela模型,檢測漏洞;輸出檢測結果和漏洞信息。
[0041] 其中,代碼轉化模塊,用于:
[0042] 依據靜態分析得出的函數流圖,對BIL代碼進行程序切片切分成BIL語句;進行從 切分后得到的BIL語句到Promela語句的細粒度代碼轉化;將經過細粒度代碼轉化后的 Prome 1 a語句構建、組裝成Prome 1 a模型;對已知的軟件漏洞樣本進行分析總結,抽象出漏洞 特征,用Promela語言描述漏洞特征,建立漏洞模型;采用代碼插粧技術,將所述漏洞模型插 入到所述Promela模型中。
[0043]其中,代碼轉化模塊,用于:
[0044] 依據靜態分析的函數流圖,以sub函數為單位,將BIL代碼切分成不同函數片斷;對 BIL代碼中的匯編指令進行多維度匹配,將所述函數片斷切分成指令集;對BIL語句的完備 性進行檢驗,以將BIL指令集切分成BIL語句;
[0045] 預先對BIL語句的各種特征進行總結,并構建BIL語句的特征池將其置于特征池 中;將待轉化的BIL語句與所述特征池中的特征進行匹配;將匹配后的BIL語句轉化為符合 Prome la中嵌C語法的Prome la語句。
[0046] 其中,模型檢測模塊,用于:
[0047]預先設置外部C代碼,來構建執行所述Promela模型必要的系統資源、維護臨時狀 態、處理SPIN無法處理的BIL中的表達式和關鍵字以及處理BAP無法解析的匯編指令;將 Promela模型轉化為C代碼程序;使用編譯器將轉化后的C代碼和外部C代碼聯合編譯成一個 可執行程序;執行編譯好的可執行程序進行模型檢測。
[0048] 本發明實施例提供了一種二進制程序漏洞挖掘方法和系統,將待挖掘的目標二進 制程序轉化為匯編語言,并進行匯編語言層次漏洞的靜態分析,結合靜態分析的分析結果 對中間語言BIL進行Promela模型建模,利用中間語言作為橋梁實現二進制程序的自動化建 模,進而利用SPIN的嵌C功能進行模擬執行,并引入外部C代碼來彌補模型檢測的不足,實現 漏洞的模型檢測。如此,用靜態分析結果優化模型檢測的模擬執行,提出了一種新的采用動 靜結合并基于模型檢測進行漏洞挖掘的機制,實現了靜態分析與動態執行的結合;使用該 方法和系統進行漏洞挖掘測試,結果表明,該漏洞挖掘方法和系統能夠準確地挖掘出已知 的軟件漏洞,且能得到精確的漏洞類型與位置信息,實現了基于動靜結合構思進行有效的 漏洞挖掘。
[0049] 外部C代碼的引入使得該漏洞挖掘系統的實現成為可能的同時,也擴展、改進了 SPIN的模型執行性能。
【附圖說明】
[0050] 圖1為本發明二進制程序漏洞挖掘方法一個實施例的流程示意圖;
[0051] 圖2位本發明二進制程序漏洞挖掘系統的一個實施例的結構框架示意圖;
[0052] 圖3本發明實施例中模型檢測漏洞挖掘流程圖;
[0053] 圖4本發明實施例中自動化建模過程;
[0054]圖5本發明實施例中SPIN驗證過程;
[0055]圖6本發明實施例中外部C代碼引入SPIN的原理圖;
[0056]圖7本發明實施例中漏洞挖掘系統設計框