張晛譞 范明鈺
電子科技大學(xué)計算機學(xué)院 四川 610054
軟件的漏洞檢測主要分為動態(tài)檢測和靜態(tài)檢測兩大類。其中動態(tài)檢測指通過運行被測程序,檢查運行結(jié)果與預(yù)期結(jié)果的差異,并分析運行效率和健壯性等性能,一般多用黑盒測試的方法。而靜態(tài)檢測是指不運行被測程序本身,通過分析或檢查源程序的語法、結(jié)構(gòu)、過程、接口等來檢查程序的正確性。本文主要研究一種對于軟件源代碼的新型自動靜態(tài)檢測技術(shù)模型,事實上,對于某些專業(yè)人員來說,通過可執(zhí)行代碼得到的匯編代碼也可以看作有了軟件的源代碼。
根據(jù)軟件安全漏洞的分類,漏洞產(chǎn)生主要有四大方面的原因:軟件設(shè)計缺陷、軟件代碼編寫缺陷、執(zhí)行環(huán)境差異和補丁文件對整個系統(tǒng)的影響。實際上,各種原因在本質(zhì)上都是因為軟件流程上存在一些“危險路徑”,使得軟件可能會陷入于開發(fā)者設(shè)想中不符的流程。而造成這樣“危險路徑”的原因絕大多數(shù)是由于函數(shù)的調(diào)用引起的,其中包括危險函數(shù)的調(diào)用和不恰當(dāng)?shù)暮瘮?shù)調(diào)用順序等。
根據(jù)軟件安全漏洞的產(chǎn)生原因,對漏洞的檢測就是要找到這些可能存在安全隱患的軟件執(zhí)行流程“路徑”。而大部分的漏洞檢測方法基本上都是一種可以稱之為“點檢測”的檢測方法,它們針對某一小段單一功能的具體代碼或者某一個函數(shù),采用特征碼匹配和分析的方法進行安全漏洞的檢測。這樣的檢測方法會產(chǎn)生大量的“漏報”和“誤報”,因為軟件流程具有一個整體性,對待數(shù)據(jù)流的某一部分可能對整個功能做出錯誤的估計。
文獻提出了針對緩沖區(qū)溢出和循環(huán)拷貝出錯漏洞的有限狀態(tài)自動機模型,本文在此基礎(chǔ)上提出基于模糊度量的軟件安全漏洞檢測方法。其核心理論為模糊有限狀態(tài)自動機。
自動機可抽象地用一個五元組表示,即:A=(X,S,Y,∏,g),式中 X、S 和 Y 分別是輸入集、狀態(tài)集和輸出集,∏和 g分別是狀態(tài)轉(zhuǎn)移函數(shù)和輸出函數(shù)。在確定的自動機中,狀態(tài)轉(zhuǎn)移函數(shù)∏和輸出函數(shù)g都是確定的,可以用嚴(yán)格的數(shù)學(xué)函數(shù)來描述。如果把狀態(tài)轉(zhuǎn)移函數(shù)∏和輸出函數(shù)g模糊化,或者∏和g只能用模糊函數(shù)來描述,則自動機A即為模糊有限狀態(tài)自動機。
模糊有限狀態(tài)自動機與模糊文法相對應(yīng),可以作為軟件源程序模糊識別的標(biāo)準(zhǔn),只要建立合適狀態(tài)轉(zhuǎn)移函數(shù)和輸出函數(shù),就可以讓整個檢測模型具有模糊識別能力。模糊自動機在復(fù)雜系統(tǒng)的行為分析、模式識別、學(xué)習(xí)系統(tǒng)和控制等方面具有顯著的優(yōu)勢,這些模糊自動機的特點對識別未知漏洞具有相當(dāng)重要的作用。因為軟件系統(tǒng)本身就是一個復(fù)雜的系統(tǒng),分析軟件系統(tǒng)的行為模式就是發(fā)現(xiàn)軟件安全漏洞的主要方式。針對于未知漏洞,就需要分析技術(shù)具有識別和學(xué)習(xí)的能力。
在綜合模型檢驗技術(shù)以及上文所提及的軟件系統(tǒng)行為分析、模式識別和自學(xué)習(xí)的功能,本文提出基于模糊度量的軟件安全漏洞檢測技術(shù),如圖1所示。
圖1 基于模糊度量的軟件安全漏洞檢測技術(shù)
本漏洞檢測技術(shù)主要分為輸入、挖掘過程和輸出三個主要模塊。檢測過程首先由輸入模塊開始,軟件源代碼和漏洞屬性庫作為前期輸入進入挖掘過程,然后經(jīng)過挖掘過程的內(nèi)部處理后將一部分結(jié)果反饋給漏洞屬性庫,完成自學(xué)習(xí)過程,最后輸出分析結(jié)果。其中核心模塊為輸入中的漏洞屬性庫、挖掘過程中執(zhí)行路徑模型生成器、漏洞屬性關(guān)聯(lián)生成器和模糊狀態(tài)自動機模型檢測器。接下來對各個核心模塊做出具體說明。
漏洞屬性庫:這是一個存儲軟件安全漏洞屬性的數(shù)據(jù)庫。它將漏洞系統(tǒng)分解,將能夠?qū)Π踩[患產(chǎn)生影響的單一屬性存儲于一個獨立數(shù)據(jù)庫中。整個系統(tǒng)前期需要創(chuàng)建一個已知安全漏洞屬性數(shù)據(jù)庫,數(shù)據(jù)庫中存在某些已知安全漏洞的相關(guān)屬性。例如緩沖區(qū)溢出安全漏洞的堆或??臻g分配長度和內(nèi)容填充、循環(huán)錯誤安全漏洞的循環(huán)塊存在位置、循環(huán)內(nèi)部內(nèi)存讀寫邊界設(shè)定和內(nèi)存讀寫內(nèi)容填充,整數(shù)溢出漏洞的類型設(shè)定、值傳遞和類型轉(zhuǎn)化,格式化字符串的函數(shù)檢查和類型匹配,還有數(shù)據(jù)來源等關(guān)鍵安全屬性。這個漏洞屬性庫可以手工添加記錄,也可以通過系統(tǒng)的自學(xué)習(xí)機制反饋未知安全漏洞存在的屬性。它的作用是支持漏洞屬性關(guān)聯(lián)生成器。
漏洞屬性關(guān)聯(lián)生成器:這個生成器主要作用是減少冗余工作量,增加系統(tǒng)效率。它將漏洞屬性庫中的屬性根據(jù)邏輯關(guān)聯(lián)情況生成漏洞狀態(tài)關(guān)聯(lián)圖,用于檢測器分析。排除掉一些無用組合,避免系統(tǒng)盲目搜索數(shù)據(jù)庫,增加冗余工作量。尤其是在數(shù)據(jù)庫比較龐大的,這個策略所帶來的意義是非常重大的。
執(zhí)行路徑模型生成器:這是一個根據(jù)軟件源碼構(gòu)建虛擬軟件執(zhí)行路徑模型的生成器。它綜合了靜態(tài)分析覆蓋范圍大以及動態(tài)分析中軟件流程分析的優(yōu)點,將抽象的軟件源碼組建成為具有層次結(jié)構(gòu)和清晰流程的模型。
模糊狀態(tài)自動機模型檢測器:這是本檢測方法的核心部分。定義系統(tǒng)存在缺陷的程度為[0,1],1代表系統(tǒng)存在確定性漏洞,0代表系統(tǒng)安全,0到1之間表示系統(tǒng)存在不同程度的安全缺陷,數(shù)值越靠近1安全缺陷危險程度越高。
這個檢測器利用模糊有限狀態(tài)自動機的理論進行組建:輸入集X為執(zhí)行路徑模型生成器的輸出模型;狀態(tài)集S為漏洞屬性關(guān)聯(lián)生成器的輸出模型;輸出集Y為{qs,qf,qv},qs表示系統(tǒng)狀態(tài)安全,qv表示系統(tǒng)存在確定性安全漏洞,qf表示系統(tǒng)存在不同程度的安全缺陷。輸出函數(shù)g分為兩個部分:第一部分將輸出集Y中所反應(yīng)的安全缺陷危險程度和在軟件執(zhí)行流程模型中的路徑顯示給分析人員,第二部分將分析中出現(xiàn)的安全缺陷的各個安全屬性反饋給漏洞屬性庫,添加未記錄的漏洞屬性;狀態(tài)轉(zhuǎn)移函數(shù)∏依托漏洞屬性狀態(tài)轉(zhuǎn)移模型建立。
模糊有限狀態(tài)自動機狀態(tài)轉(zhuǎn)移示意圖如圖2所示。
圖2 模糊有限狀態(tài)自動機狀態(tài)轉(zhuǎn)移示意圖
q0為初始狀態(tài),根據(jù)狀態(tài)轉(zhuǎn)移函數(shù),如果軟件執(zhí)行流程中未出現(xiàn)漏洞屬性關(guān)聯(lián)生成器中生成模型的屬性,那么狀態(tài)不發(fā)生變化,返回q0;如果出現(xiàn)漏洞相關(guān)屬性,則根據(jù)漏洞屬性進行狀態(tài)轉(zhuǎn)移并計算安全缺陷危險度。然后繼續(xù)上述思路,如果期間出現(xiàn)某確定性軟件漏洞,則直接輸出qv狀態(tài),返回危險度最大值 1,并計算該漏洞的危急程度;若直至軟件執(zhí)行流程模型某條路徑結(jié)束都未出現(xiàn)確定性安全漏洞,則根據(jù)綜合計算的安全缺陷危險程度輸出,若危險程度為 0,則輸出qs狀態(tài),否則輸出,qf和安全缺陷危險度。
本文在Windows XP SP2系統(tǒng)下實現(xiàn)了該檢測方法的仿真程序,漏洞特征數(shù)據(jù)庫添加基本數(shù)據(jù)和相關(guān)測試基本安全度(此安全度可以根據(jù)實際情況進行設(shè)置,此處僅設(shè)置為測試用基本安全度)。然后對多款第三方軟件進行實驗,并將實驗結(jié)果與官方發(fā)布的漏洞進行比對。結(jié)果如表1。
表1 仿真實驗結(jié)果
該實驗結(jié)果表明與傳統(tǒng)檢測方法相比,基于模糊度量的軟件漏洞檢測技術(shù)可以更好的進行軟件安全漏洞檢測,尤其對未知軟件安全漏洞進行檢測,并且能給出漏洞的危急程度。
本文所提出的基于模糊度量的軟件安全漏洞自動檢測技術(shù)結(jié)合了有限狀態(tài)自動機和模型檢測的思想,將通常的漏洞整體檢測,分解為對漏洞中單一屬性集合的檢測,使漏洞檢測化整為零,并具有自學(xué)習(xí)的機制。另一方面,引進模糊狀態(tài)轉(zhuǎn)移函數(shù)可更好檢測軟件安全漏洞的危急程度,指導(dǎo)相關(guān)人員根據(jù)危急程度進行修正。
但是該檢測技術(shù)仍具有不少值得改進之處。其難點之一是漏洞屬性庫的設(shè)計。漏洞屬性庫和漏洞屬性關(guān)聯(lián)生成器這個設(shè)計其中很重要的一點就是提高系統(tǒng)檢測效率,如果漏洞屬性數(shù)據(jù)庫能更完善表明各漏洞屬性之間的依賴情況,就能有助于提高漏洞屬性關(guān)聯(lián)生成器工作時的效率。另一個難點就是模糊狀態(tài)轉(zhuǎn)移函數(shù)在設(shè)計上如果能結(jié)合漏洞屬性關(guān)聯(lián)生成器所生成的模型做出動態(tài)改變,將可以更好的檢測軟件系統(tǒng)的安全漏洞。因此,在今后的研究工作中,主要針對“漏洞屬性依賴關(guān)系”和“軟件執(zhí)行流程的安全度量”進行進一步的研究。
[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.