張晛譞 范明鈺
電子科技大學計算機學院 四川 610054
軟件的漏洞檢測主要分為動態檢測和靜態檢測兩大類。其中動態檢測指通過運行被測程序,檢查運行結果與預期結果的差異,并分析運行效率和健壯性等性能,一般多用黑盒測試的方法。而靜態檢測是指不運行被測程序本身,通過分析或檢查源程序的語法、結構、過程、接口等來檢查程序的正確性。本文主要研究一種對于軟件源代碼的新型自動靜態檢測技術模型,事實上,對于某些專業人員來說,通過可執行代碼得到的匯編代碼也可以看作有了軟件的源代碼。
根據軟件安全漏洞的分類,漏洞產生主要有四大方面的原因:軟件設計缺陷、軟件代碼編寫缺陷、執行環境差異和補丁文件對整個系統的影響。實際上,各種原因在本質上都是因為軟件流程上存在一些“危險路徑”,使得軟件可能會陷入于開發者設想中不符的流程。而造成這樣“危險路徑”的原因絕大多數是由于函數的調用引起的,其中包括危險函數的調用和不恰當的函數調用順序等。
根據軟件安全漏洞的產生原因,對漏洞的檢測就是要找到這些可能存在安全隱患的軟件執行流程“路徑”。而大部分的漏洞檢測方法基本上都是一種可以稱之為“點檢測”的檢測方法,它們針對某一小段單一功能的具體代碼或者某一個函數,采用特征碼匹配和分析的方法進行安全漏洞的檢測。這樣的檢測方法會產生大量的“漏報”和“誤報”,因為軟件流程具有一個整體性,對待數據流的某一部分可能對整個功能做出錯誤的估計。
文獻提出了針對緩沖區溢出和循環拷貝出錯漏洞的有限狀態自動機模型,本文在此基礎上提出基于模糊度量的軟件安全漏洞檢測方法。其核心理論為模糊有限狀態自動機。
自動機可抽象地用一個五元組表示,即:A=(X,S,Y,∏,g),式中 X、S 和 Y 分別是輸入集、狀態集和輸出集,∏和 g分別是狀態轉移函數和輸出函數。在確定的自動機中,狀態轉移函數∏和輸出函數g都是確定的,可以用嚴格的數學函數來描述。如果把狀態轉移函數∏和輸出函數g模糊化,或者∏和g只能用模糊函數來描述,則自動機A即為模糊有限狀態自動機。
模糊有限狀態自動機與模糊文法相對應,可以作為軟件源程序模糊識別的標準,只要建立合適狀態轉移函數和輸出函數,就可以讓整個檢測模型具有模糊識別能力。模糊自動機在復雜系統的行為分析、模式識別、學習系統和控制等方面具有顯著的優勢,這些模糊自動機的特點對識別未知漏洞具有相當重要的作用。因為軟件系統本身就是一個復雜的系統,分析軟件系統的行為模式就是發現軟件安全漏洞的主要方式。針對于未知漏洞,就需要分析技術具有識別和學習的能力。
在綜合模型檢驗技術以及上文所提及的軟件系統行為分析、模式識別和自學習的功能,本文提出基于模糊度量的軟件安全漏洞檢測技術,如圖1所示。

圖1 基于模糊度量的軟件安全漏洞檢測技術
本漏洞檢測技術主要分為輸入、挖掘過程和輸出三個主要模塊。檢測過程首先由輸入模塊開始,軟件源代碼和漏洞屬性庫作為前期輸入進入挖掘過程,然后經過挖掘過程的內部處理后將一部分結果反饋給漏洞屬性庫,完成自學習過程,最后輸出分析結果。其中核心模塊為輸入中的漏洞屬性庫、挖掘過程中執行路徑模型生成器、漏洞屬性關聯生成器和模糊狀態自動機模型檢測器。接下來對各個核心模塊做出具體說明。
漏洞屬性庫:這是一個存儲軟件安全漏洞屬性的數據庫。它將漏洞系統分解,將能夠對安全隱患產生影響的單一屬性存儲于一個獨立數據庫中。整個系統前期需要創建一個已知安全漏洞屬性數據庫,數據庫中存在某些已知安全漏洞的相關屬性。例如緩沖區溢出安全漏洞的堆或棧空間分配長度和內容填充、循環錯誤安全漏洞的循環塊存在位置、循環內部內存讀寫邊界設定和內存讀寫內容填充,整數溢出漏洞的類型設定、值傳遞和類型轉化,格式化字符串的函數檢查和類型匹配,還有數據來源等關鍵安全屬性。這個漏洞屬性庫可以手工添加記錄,也可以通過系統的自學習機制反饋未知安全漏洞存在的屬性。它的作用是支持漏洞屬性關聯生成器。
漏洞屬性關聯生成器:這個生成器主要作用是減少冗余工作量,增加系統效率。它將漏洞屬性庫中的屬性根據邏輯關聯情況生成漏洞狀態關聯圖,用于檢測器分析。排除掉一些無用組合,避免系統盲目搜索數據庫,增加冗余工作量。尤其是在數據庫比較龐大的,這個策略所帶來的意義是非常重大的。
執行路徑模型生成器:這是一個根據軟件源碼構建虛擬軟件執行路徑模型的生成器。它綜合了靜態分析覆蓋范圍大以及動態分析中軟件流程分析的優點,將抽象的軟件源碼組建成為具有層次結構和清晰流程的模型。
模糊狀態自動機模型檢測器:這是本檢測方法的核心部分。定義系統存在缺陷的程度為[0,1],1代表系統存在確定性漏洞,0代表系統安全,0到1之間表示系統存在不同程度的安全缺陷,數值越靠近1安全缺陷危險程度越高。
這個檢測器利用模糊有限狀態自動機的理論進行組建:輸入集X為執行路徑模型生成器的輸出模型;狀態集S為漏洞屬性關聯生成器的輸出模型;輸出集Y為{qs,qf,qv},qs表示系統狀態安全,qv表示系統存在確定性安全漏洞,qf表示系統存在不同程度的安全缺陷。輸出函數g分為兩個部分:第一部分將輸出集Y中所反應的安全缺陷危險程度和在軟件執行流程模型中的路徑顯示給分析人員,第二部分將分析中出現的安全缺陷的各個安全屬性反饋給漏洞屬性庫,添加未記錄的漏洞屬性;狀態轉移函數∏依托漏洞屬性狀態轉移模型建立。

模糊有限狀態自動機狀態轉移示意圖如圖2所示。

圖2 模糊有限狀態自動機狀態轉移示意圖
q0為初始狀態,根據狀態轉移函數,如果軟件執行流程中未出現漏洞屬性關聯生成器中生成模型的屬性,那么狀態不發生變化,返回q0;如果出現漏洞相關屬性,則根據漏洞屬性進行狀態轉移并計算安全缺陷危險度。然后繼續上述思路,如果期間出現某確定性軟件漏洞,則直接輸出qv狀態,返回危險度最大值 1,并計算該漏洞的危急程度;若直至軟件執行流程模型某條路徑結束都未出現確定性安全漏洞,則根據綜合計算的安全缺陷危險程度輸出,若危險程度為 0,則輸出qs狀態,否則輸出,qf和安全缺陷危險度。
本文在Windows XP SP2系統下實現了該檢測方法的仿真程序,漏洞特征數據庫添加基本數據和相關測試基本安全度(此安全度可以根據實際情況進行設置,此處僅設置為測試用基本安全度)。然后對多款第三方軟件進行實驗,并將實驗結果與官方發布的漏洞進行比對。結果如表1。

表1 仿真實驗結果
該實驗結果表明與傳統檢測方法相比,基于模糊度量的軟件漏洞檢測技術可以更好的進行軟件安全漏洞檢測,尤其對未知軟件安全漏洞進行檢測,并且能給出漏洞的危急程度。
本文所提出的基于模糊度量的軟件安全漏洞自動檢測技術結合了有限狀態自動機和模型檢測的思想,將通常的漏洞整體檢測,分解為對漏洞中單一屬性集合的檢測,使漏洞檢測化整為零,并具有自學習的機制。另一方面,引進模糊狀態轉移函數可更好檢測軟件安全漏洞的危急程度,指導相關人員根據危急程度進行修正。
但是該檢測技術仍具有不少值得改進之處。其難點之一是漏洞屬性庫的設計。漏洞屬性庫和漏洞屬性關聯生成器這個設計其中很重要的一點就是提高系統檢測效率,如果漏洞屬性數據庫能更完善表明各漏洞屬性之間的依賴情況,就能有助于提高漏洞屬性關聯生成器工作時的效率。另一個難點就是模糊狀態轉移函數在設計上如果能結合漏洞屬性關聯生成器所生成的模型做出動態改變,將可以更好的檢測軟件系統的安全漏洞。因此,在今后的研究工作中,主要針對“漏洞屬性依賴關系”和“軟件執行流程的安全度量”進行進一步的研究。
[1] S.Weber,P.Karger and A.Paradkar.A Sofiware Flaw Taxonomy:Aiming Tools at Security[C].Software Engineering for Secure Systems-Building Trustworthy Applications(SESS)Proceedings.2005.
[2] V.Benjamin Livshits and Monica S.Lam.Tracking Pointers with Path and Context Sensitivity for Bug Detection in C Programs[C].ACM 2003.
[3] Cynthia Phillip s,Laura Painton Swiler.A graph based system for network vulnerability analysis[C].ACM 1999.
[4] Paul Ammann,Duminda Wijesekera,and Saket Kaushik.Analysis and verification Scalable,graph2based network vulnerability analysis[C].ACM 2002.