專(zhuān)利名稱(chēng):一種基于隱馬爾可夫模型的匯編指令級(jí)漏洞檢測(cè)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種匯編指令級(jí)的漏洞檢測(cè)方法,特別涉及一種基于隱馬爾可夫模型 的匯編指令級(jí)漏洞檢測(cè)方法,屬于信息安全技術(shù)領(lǐng)域。
背景技術(shù):
隨著計(jì)算機(jī)技術(shù)的迅速發(fā)展,人類(lèi)社會(huì)的信息化程度越來(lái)越高,整個(gè)社會(huì)的政治、 經(jīng)濟(jì)、軍事、文化以及其他領(lǐng)域?qū)τ?jì)算機(jī)信息系統(tǒng)的依賴(lài)程度也越來(lái)越高。在這種情況下, 計(jì)算機(jī)系統(tǒng)的安全性得到了人們?cè)絹?lái)越多的關(guān)注。然而,大型軟件、系統(tǒng)的編寫(xiě)需要許許多 多程序員共同完成,他們將一個(gè)軟件或系統(tǒng)分成若干板塊,分工編寫(xiě),然后再匯總,測(cè)試;最 后再修補(bǔ)、發(fā)布,因此在軟件中存在安全漏洞幾乎是不可避免的。軟件漏洞是指軟件設(shè)計(jì)實(shí) 現(xiàn)過(guò)程中被引入的、在數(shù)據(jù)訪問(wèn)或行為邏輯等方面的缺陷。這些漏洞常常被攻擊者利用,從 而使程序行為違背一定的安全策略。在大多數(shù)情況下,軟件系統(tǒng)的源代碼不可得,因此必須 對(duì)軟件的可執(zhí)行程序進(jìn)行分析,這種針對(duì)可執(zhí)行程序的分析非常困難,因?yàn)閺闹泻茈y發(fā)現(xiàn) 典型的上下文相關(guān)性?;谏鲜鲈颍壳皩?duì)匯編指令級(jí)漏洞檢測(cè)技術(shù)的研究越來(lái)越受到 重視。為了檢測(cè)到漏洞,相應(yīng)的分析方法需要具有高覆蓋率和低誤報(bào)率/漏報(bào)率。自動(dòng) 化的動(dòng)態(tài)檢測(cè)方法通常會(huì)在可控環(huán)境中(通常位于虛擬機(jī)中)執(zhí)行程序,同時(shí)監(jiān)視匯編指 令的執(zhí)行以分析可執(zhí)行程序的行為特征。然而,動(dòng)態(tài)分析的問(wèn)題在于其必須運(yùn)行可執(zhí)行程 序,并且必須執(zhí)行盡可能多的匯編指令,這會(huì)產(chǎn)生大量的系統(tǒng)開(kāi)銷(xiāo)。特別是當(dāng)軟件系統(tǒng)進(jìn)入 休眠狀態(tài)時(shí),動(dòng)態(tài)檢測(cè)方法必須等待軟件的下一次執(zhí)行,而這意味著更長(zhǎng)的分析時(shí)間和更 多的系統(tǒng)開(kāi)銷(xiāo)。由于受限于執(zhí)行遍歷策略,動(dòng)態(tài)分析方法目前只對(duì)分析惡意軟件效果較好, 因?yàn)閻阂廛浖w積較小。當(dāng)分析包含海量匯編指令的軟件時(shí),有限的匯編指令執(zhí)行策略無(wú) 法對(duì)軟件系統(tǒng)的行為特征進(jìn)行有效分析,也無(wú)法對(duì)潛在的安全漏洞進(jìn)行定位。靜態(tài)檢測(cè)方法可執(zhí)行程序的源代碼或匯編指令進(jìn)行分析,且可以在提高分析覆蓋 率的同時(shí)減少系統(tǒng)開(kāi)銷(xiāo)。此類(lèi)分析方法可以比動(dòng)態(tài)分析方法發(fā)現(xiàn)更多的安全漏洞。此外, 靜態(tài)分析方法可以覆蓋所有可能的匯編指令。Csaba Nagy等人提出了一種靜態(tài)分析方法(在實(shí)施例中稱(chēng)為“方法1”),該方法 通過(guò)識(shí)別并跟蹤軟件中與用戶(hù)輸入相關(guān)的源代碼實(shí)現(xiàn)對(duì)漏洞的定位。該方法通過(guò)掃描源代 碼實(shí)現(xiàn)分析過(guò)程,而不需要運(yùn)行可執(zhí)行程序或執(zhí)行匯編指令。在對(duì)源代碼的掃描過(guò)程中,該 方法采用污點(diǎn)標(biāo)記技術(shù)對(duì)安全漏洞進(jìn)行定位。因此,當(dāng)無(wú)法獲得源代碼時(shí),該方法就無(wú)法跟 蹤軟件的數(shù)據(jù)流,也就是說(shuō),該方法的分析對(duì)象受限于開(kāi)源軟件系統(tǒng)。Pattabiraman等人開(kāi)發(fā)了一套安全漏洞檢測(cè)系統(tǒng)(在實(shí)施例中稱(chēng)為“方法2”)。 該系統(tǒng)分析與關(guān)鍵變量相關(guān)的源代碼片段。該方法通過(guò)控制流分析法判斷需要分析哪些片 段,從而為這些源代碼片段構(gòu)造檢測(cè)表達(dá)式。由于這種方法也屬于源代碼分析方法,因此該 方法無(wú)法分析可執(zhí)行程序。Hassen Saidi開(kāi)發(fā)了一個(gè)分析工具套件,該套件結(jié)合了多種靜態(tài)分析方法和工具(在實(shí)施例中稱(chēng)為“方法3”)。該套件采用靜態(tài)分析方法來(lái)分析軟件的可執(zhí)行程序或匯 編指令。該套件采用的方法是生成抽象狀態(tài)圖,并將該狀態(tài)圖作為中間結(jié)構(gòu),以共享其輸出 并產(chǎn)生分析結(jié)果。雖然采用此方法可以降低誤報(bào)率,但是該方法只能分析代碼量較小的惡 意軟件,而無(wú)法分析規(guī)模較大的軟件?,F(xiàn)有技術(shù)中,很少有能夠?qū)蓤?zhí)行程序或匯編指令進(jìn)行有效分析的靜態(tài)或動(dòng)態(tài)分 析方法?,F(xiàn)有的匯編指令分析器需要對(duì)每一條匯編指令進(jìn)行掃描并分析,這種方法導(dǎo)致了 很高的系統(tǒng)開(kāi)銷(xiāo)和大量的誤警警報(bào)。此外,由于很難從大量的不具有顯著關(guān)聯(lián)性的匯編指 令中定位安全漏洞,因此現(xiàn)有方法能夠從匯編指令中檢測(cè)到的安全漏洞比例大約在50%左 右,不能滿(mǎn)足實(shí)際應(yīng)用的需求。本發(fā)明使用到一項(xiàng)重要的已有技術(shù)隱馬爾科夫模型。隱馬爾可夫模型是一種有效的描述存在于離散時(shí)間段上的具有關(guān)聯(lián)關(guān)系的數(shù)據(jù) 序列的統(tǒng)計(jì)學(xué)方法。隱馬爾科夫模型的理論基礎(chǔ)是在1970年前后由Baum等人建立起來(lái)的,隨后有CMU 的Baker和IBM的Jelinek等人將其應(yīng)用到語(yǔ)音識(shí)別之中,由于Bell實(shí)驗(yàn)室Rabiner等人 在80年代中期對(duì)隱馬爾科夫模型的深入淺出的介紹,才逐漸使隱馬爾科夫模型為世界各 國(guó)從事語(yǔ)音處理的研究員所了解和熟悉,進(jìn)而成為公認(rèn)的一個(gè)研究熱點(diǎn)。隱馬爾科夫模型是在Markov鏈(一種有限狀態(tài)機(jī))的基礎(chǔ)上發(fā)展起來(lái)的。首 先介紹兩個(gè)概念狀態(tài)集合和觀察序列。狀態(tài)集合指隱馬爾科夫模型所具有的全部狀態(tài) (S1, ...,Si, ...,Sn),其中N為狀態(tài)總數(shù),取值為正整數(shù);觀察序列是一個(gè)具有上下文關(guān)聯(lián) 性的數(shù)據(jù)序列,用V1, . . .,vt,. . .,ντ表示,V1, . . .,vt,. . .,ντ為一個(gè)觀測(cè)序列,其中Vt = cm,表示該序列中時(shí)刻t的元素的取值為cm,m的取值范圍為1彡m彡M,M表示每個(gè)狀態(tài)可 輸出的元素(值)的總數(shù),其取值范圍為正整數(shù)。由于實(shí)際問(wèn)題比Markov鏈模型所描述的更為復(fù)雜,觀察到的觀察序列中的元素 并不是與Markov鏈中的狀態(tài)一一對(duì)應(yīng),而是通過(guò)一組概率分布相聯(lián)系。這樣,站在觀察 者的角度,只能看到觀察值,不像Markov鏈模型中的觀察值和狀態(tài)一一對(duì)應(yīng)。因此,我們 不能直接看到狀態(tài),而是通過(guò)一個(gè)隨機(jī)過(guò)程去感知狀態(tài)的存在及其特性,這就是所謂的 “隱”Markov模型,即Hidden Markov Model。它是一個(gè)雙重隨機(jī)過(guò)程第一個(gè)隨機(jī)過(guò)程是Markov鏈,這是基本的隨機(jī)過(guò)程,描述了狀態(tài)之間的轉(zhuǎn)移概 率,這個(gè)概率用% = P(qt+1 = SjIqt = Si)來(lái)描述,表示在t時(shí)刻從狀態(tài)i跳轉(zhuǎn)到狀態(tài)j的 轉(zhuǎn)移概率;在qt = Si中,qt表示t時(shí)刻時(shí)狀變量,其值為Si ;i, j的取值范圍為1彡i, j彡N且均為正整數(shù)。第二個(gè)隨機(jī)過(guò)程描述了狀態(tài)和所研究的觀察序列之間的統(tǒng)計(jì)對(duì)應(yīng)關(guān)系,該關(guān)系由 狀態(tài)輸出概率h (Cm) =P(vt = C1Jqt = Si)來(lái)描述,表示t時(shí)刻時(shí),狀態(tài)i輸出觀察序列中 元素Vt = Cm的概率。除此之外,使用隱馬爾科夫模型描述一個(gè)隨機(jī)過(guò)程的時(shí)候,需要指定狀態(tài)的起始, 因此每一個(gè)狀態(tài)還具有一個(gè)初始概率η”下面以一個(gè)全連接結(jié)構(gòu)的3狀態(tài)的隱馬爾科夫 模型模型為例(如圖1所示),介紹描述隱馬爾科夫模型的參數(shù)組對(duì)于該隱馬爾科夫模型,狀態(tài)轉(zhuǎn)移矩陣A由所有狀態(tài)之間的狀態(tài)轉(zhuǎn)移概率組成, 每一行表示從某一狀態(tài)到其他所有狀態(tài)的轉(zhuǎn)移概率,因此每行中的元素之和為1 aUα\2 13
A =a2iα22α23αη輸出概率矩陣B由所有狀態(tài)的輸出概率組成,由于每個(gè)狀態(tài)具有M個(gè)輸出概率,因 此該矩陣的大小為3XM,且每一行元素之和為1 :
、(Cl) ... MO、B= b2(ct) ... b2(cM)
Mc^ …bH通常,隱馬爾科夫模型模型等概率的從某一狀態(tài)開(kāi)始,因此各個(gè)狀態(tài)的初始概率 矩陣η被設(shè)定為Ji = {Ji ! = 1/3, π 2 = 1/3, π 3 = 1/3}這樣,一個(gè)隱馬爾科夫模型可以由參數(shù)組λ = {Α,B,π}來(lái)描述。更形象地說(shuō), 隱馬爾科夫模型可分為兩部分,一個(gè)是Markov鏈,由{Α,π}描述,產(chǎn)生的輸出為狀態(tài)序 列;另一個(gè)部分是一個(gè)隨機(jī)過(guò)程,由概率輸出矩陣{B}描述,產(chǎn)生的輸出為觀察值序列。因 此,對(duì)于一個(gè)具有時(shí)間長(zhǎng)度T的觀察序列Vl,. . .,vt,. . .,ντ,其隱含的對(duì)應(yīng)了一組狀態(tài)序列 q1; . . .,qt,. . .,qT,其中qt e (S1, . . .,Si, . . .,SN),圖2展示了隱馬爾科夫模型的組成。使用隱馬爾科夫模型進(jìn)行分類(lèi)的過(guò)程如下1.訓(xùn)練隱馬爾科夫模型參數(shù)對(duì)于同屬類(lèi)別r(l彡r彡R且為正整數(shù),R為所研究類(lèi)別的總數(shù),取值范圍為正整 數(shù))的一組觀測(cè)序列Or = Io1,. . .,ok,. . .,O1J,(1彡k彡K且為正整數(shù),K為屬于第r類(lèi)別 的觀測(cè)序列的總數(shù),取值范圍為正整數(shù)))其中ok = Iv1,. . . ,Vt,...,ντ},利用Baum-Welch 算法迭代的調(diào)整隱馬爾科夫模型模型參數(shù),得到最優(yōu)的能夠描述該類(lèi)別觀測(cè)數(shù)據(jù)屬性的隱 馬爾科夫模型參數(shù)λτ= IAjjBj, πτ}。在訓(xùn)練過(guò)程中,我們采用有監(jiān)督的學(xué)習(xí)方式,為每一 類(lèi)的觀測(cè)數(shù)據(jù)訓(xùn)練一個(gè)隱馬爾科夫模型模型。2.對(duì)待測(cè)觀察序列的識(shí)別給定一個(gè)待測(cè)的觀察值序列Ok = Iv1, . . .,vt,. . .,ντ},以及一個(gè)模型參數(shù)組入r ={Ar, Br, π J,計(jì)算該觀察序列在該模型上發(fā)生的概率P(0k| λ》,是評(píng)價(jià)一個(gè)給定的模型 如何匹配待測(cè)的觀察序列的方法。在將待測(cè)觀察序列進(jìn)行分類(lèi)的時(shí)候,我們需要將觀測(cè)序列與每一類(lèi)別的隱馬爾科 夫模型進(jìn)行匹配(假設(shè)共有C類(lèi)),并將該觀察序列劃歸于與其具有最大相似度的類(lèi)別中。在機(jī)器語(yǔ)言中,匯編指令之間具有很強(qiáng)的邏輯關(guān)系,一段代碼本質(zhì)上就是一個(gè)具 有關(guān)聯(lián)關(guān)系的數(shù)據(jù)序列。匯編指令中的關(guān)聯(lián)關(guān)系是指,當(dāng)前指令存在的概率只取決于上一 條指令存在的概率,而跟更前面的指令無(wú)關(guān),也不受到后面指令的影響,這正好具有典型的 馬爾可夫性質(zhì)。
發(fā)明內(nèi)容
本發(fā)明的目的是針對(duì)上述已有技術(shù)存在的不足,提出一種基于隱馬爾可夫模型的 匯編指令級(jí)漏洞檢測(cè)方法。本發(fā)明的目的是通過(guò)下述技術(shù)方案實(shí)現(xiàn)的。
一種基于隱馬爾可夫模型的匯編指令級(jí)漏洞檢測(cè)方法,其具體操作步驟如下步驟一、構(gòu)造漏洞指令庫(kù)。漏洞指令庫(kù)用來(lái)存儲(chǔ)已知漏洞及已知漏洞的特征,一個(gè)漏洞包括3個(gè)屬性漏洞 名稱(chēng)、匯編指令幀和數(shù)字碼;每個(gè)匯編指令幀包括1條或多條匯編指令;每個(gè)數(shù)字碼包括兩 部分,其中一部分為每個(gè)漏洞的唯一編碼,另一部分為該漏洞對(duì)應(yīng)的匯編指令幀中包含的 匯編指令的順序編號(hào)。對(duì)于每一個(gè)漏洞,其具體構(gòu)造方法為步驟1. 1 針對(duì)包含一種軟件漏洞的一個(gè)或一個(gè)以上的可執(zhí)行程序使用靜態(tài)反匯 編分析工具進(jìn)行反匯編,獲得可執(zhí)行程序中全部函數(shù)的函數(shù)結(jié)構(gòu)圖;將每個(gè)函數(shù)結(jié)構(gòu)圖稱(chēng) 為一個(gè)匯編指令片段。每個(gè)函數(shù)圖對(duì)應(yīng)一個(gè)函數(shù),每個(gè)函數(shù)結(jié)構(gòu)圖包括但不限于以下信息函數(shù)名稱(chēng)、函 數(shù)參數(shù)、返回值類(lèi)型、函數(shù)中使用的全局變量和局部變量、函數(shù)中使用的寄存器、函數(shù)中使 用的系統(tǒng)調(diào)用、函數(shù)包含的所有匯編指令、函數(shù)的控制流結(jié)構(gòu)、對(duì)關(guān)鍵指令的類(lèi)高級(jí)語(yǔ)言注 釋。所述函數(shù)的控制流結(jié)構(gòu)是基于跳轉(zhuǎn)指令進(jìn)行劃分的。步驟1. 2 從步驟1. 1中獲得的匯編指令片段中提取出產(chǎn)生該漏洞的匯編指令片 段。(1)棧溢出漏洞的匯編指令片段,包含如下匯編指令序列①寄存器ESP向低地址 移動(dòng),開(kāi)辟新的棧空間;②寄存器ECX記錄待復(fù)制內(nèi)容的長(zhǎng)度;③寄存器ESI記錄一個(gè)指針 值,該指針指向待復(fù)制內(nèi)容的首地址;④寄存器EDI記錄一個(gè)指針值,該指針指向復(fù)制時(shí)要 使用的棧空間的首地址;⑤將ESI指向的待復(fù)制內(nèi)容以雙字為單位復(fù)制到EDI指向的???間中;⑥將待復(fù)制內(nèi)容剩余的部分以字節(jié)為單位復(fù)制到剩余的棧空間中;⑦ESP指向理論 上的返回地址。(2)堆溢出漏洞的匯編指令片段,包含如下匯編指令序列①調(diào)用HeapCreate函 數(shù),創(chuàng)建堆空間P,包含2個(gè)堆塊,即堆塊A和堆塊B ;②調(diào)用HeapAlIoc函數(shù),為堆塊A動(dòng)態(tài) 分配空間;③把超過(guò)堆塊A大小的內(nèi)容復(fù)制到堆塊A中;④調(diào)用HeapAlloc函數(shù),為堆塊B 動(dòng)態(tài)分配空間,此時(shí)堆塊B的塊首指針已經(jīng)被堆塊A中超出的內(nèi)容所覆蓋。(3)格式化輸出漏洞的匯編指令片段,包含如下匯編指令序列①使用call指令 調(diào)用格式化輸出函數(shù)之前的三條指令之內(nèi),沒(méi)有push offset指令 ’②pushoffset指令注 釋中的“%”個(gè)數(shù)與push offset指令之前連續(xù)出現(xiàn)的push指令數(shù)不符;③在push offset 指令注釋中,出現(xiàn)“ % n”。步驟1. 3 使用動(dòng)態(tài)反匯編分析工具從步驟1. 2中得到的產(chǎn)生該漏洞的匯編指令 片段中依次提取出產(chǎn)生該漏洞的匯編指令,將這些匯編指令組成的有序集合稱(chēng)為匯編指令 幀。具體為步驟1. 3. 1 在正常狀態(tài)下運(yùn)行步驟1. 1中所述可執(zhí)行程序,使用動(dòng)態(tài)反匯編分析 工具依次跟蹤步驟1. 2中提取出的產(chǎn)生該漏洞的匯編指令片段,記錄下每個(gè)產(chǎn)生該漏洞的 匯編指令片段中在此次運(yùn)行過(guò)程中所執(zhí)行的匯編指令,將這些執(zhí)行的匯編指令組成的有序 集合稱(chēng)為匯編指令集合1 ;步驟1. 3. 2 激活該漏洞,使用動(dòng)態(tài)反匯編分析工具再次運(yùn)行步驟1. 1中所述可執(zhí) 行程序,跟蹤步驟1. 2中提取的產(chǎn)生該漏洞的匯編指令片段,依次記錄下每個(gè)匯編指令片段中在此次運(yùn)行過(guò)程中所執(zhí)行的匯編指令,將這些執(zhí)行的匯編指令組成的有序集合稱(chēng)為匯 編指令集合2 ;步驟1. 3. 3 依次將匯編指令集合1和匯編指令集合2中的匯編指令進(jìn)行匹配比 對(duì),并分為以下三種情況處理情況1 對(duì)于同時(shí)出現(xiàn)在匯編指令集合1和匯編指令集合2中的匯編指令,視為不 是觸發(fā)該漏洞的匯編指令,做刪除處理;情況2 對(duì)于在編指令集合1中出現(xiàn),但是在匯編指令集合2中沒(méi)有出現(xiàn)的匯編指 令,做丟棄處理;做丟棄處理的這些匯編指令是可執(zhí)行程序在正常運(yùn)行時(shí)所執(zhí)行的,而在觸 發(fā)漏洞時(shí)未執(zhí)行的匯編指令,因此視為不是觸發(fā)該漏洞的匯編指令。情況3 對(duì)于在匯編指令集合2中出現(xiàn),但是在編指令集合1中沒(méi)有出現(xiàn)的匯編指 令組成的有序集合稱(chēng)為匯編指令幀;匯編指令幀中存儲(chǔ)與觸發(fā)漏洞有關(guān)的匯編指令。經(jīng)過(guò)上述步驟的操作即可得到產(chǎn)生該漏洞的匯編指令幀。動(dòng)態(tài)反匯編分析工具包括但不限于Paimei、Sabre公司的BinNavi。步驟1. 4 構(gòu)造漏洞指令庫(kù)。按照步驟1. 3得到的匯編指令幀中的匯編指令的依次提取順序,為每條匯編指令 增加一條數(shù)字碼。通過(guò)重復(fù)執(zhí)行步驟1. 1到步驟1. 4的操作,可構(gòu)造包含多個(gè)漏洞的漏洞指令庫(kù)。步驟二、針對(duì)步驟一中構(gòu)造的漏洞指令庫(kù)中的全部漏洞,分別為漏洞指令庫(kù)中的 每種漏洞選取多個(gè)含有該漏洞的可執(zhí)行程序作為該漏洞的訓(xùn)練數(shù)據(jù)。漏洞指令庫(kù)中的每種 漏洞用\表示,該漏洞的訓(xùn)練數(shù)據(jù)用Ti表示;i代表漏洞指令庫(kù)中每個(gè)漏洞的唯一編碼。步驟三、獲取漏洞指令庫(kù)中的每個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段。針對(duì)步驟二得到的漏洞指令庫(kù)中的每個(gè)漏洞的訓(xùn)練數(shù)據(jù)使用靜態(tài)反匯編分析工 具進(jìn)行反匯編,獲得可執(zhí)行程序中全部函數(shù)的函數(shù)結(jié)構(gòu)圖;將每個(gè)函數(shù)結(jié)構(gòu)圖稱(chēng)為一個(gè)匯 編指令片段。優(yōu)選的,步驟1. 1、步驟三中所述靜態(tài)反匯編分析工具為IDA Pro。步驟四、獲取訓(xùn)練數(shù)據(jù)的數(shù)字碼序列。依次對(duì)步驟三得到的漏洞指令庫(kù)中的每個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的 匯編指令分別采用結(jié)構(gòu)化處理方法進(jìn)行處理,獲得漏洞指令庫(kù)中每個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯 編指令片段的數(shù)字碼序列;所述結(jié)構(gòu)化處理方法的具體操作步驟為步驟4. 1 依次將漏洞指令庫(kù)中的每一條匯編指令(漏洞指令庫(kù)中的所有匯編指 令分別用P1-Psum表示,其中,sum為正整數(shù),表示漏洞指令庫(kù)包含的匯編指令的數(shù)量)中 的數(shù)字去掉,組成新字符串(新字符串分別用Q1 Qsim表示)。步驟4. 2 漏洞指令庫(kù)包含的匯編指令的數(shù)量使用計(jì)數(shù)器A計(jì)數(shù),計(jì)數(shù)器A的計(jì)數(shù) 值用m表示(m彡1且m為正整數(shù));設(shè)定m的初值為1。步驟4. 3 判斷計(jì)數(shù)器A的計(jì)數(shù)值m是否不大于第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指 令片段的個(gè)數(shù)N,N為正整數(shù);;如果該條件成立,則執(zhí)行步驟4. 4的操作;否則,結(jié)束操作。步驟4.4 將第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的每一條匯編指令(分別 用P' i P' SUffl,表示,其中,sum'為正整數(shù),表示第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的匯編指令的數(shù)量)中的數(shù)字去掉,組成新字符串(分別用Q' i Q' 表示);步驟4. 5 第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的匯編指令的數(shù)量用計(jì)數(shù)器B 計(jì)數(shù),計(jì)數(shù)器B的計(jì)數(shù)值用i表示(i為正整數(shù));設(shè)定計(jì)數(shù)器B的計(jì)數(shù)值i的初值為1。步驟4. 6 判斷第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的匯編指令的計(jì)數(shù)器B 的計(jì)數(shù)值i是否不大于第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的匯編指令的數(shù)量sum', 如果該條件成立,則執(zhí)行步驟4. 7的操作;否則,執(zhí)行步驟4. 9的操作。步驟4.7 依次將第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的每一條匯編指令中 的數(shù)字去掉,組成新字符串Q' i與步驟4. 1得到的將漏洞指令庫(kù)中的每一條匯編指令中的 數(shù)字去掉,組成新字符串Q1 Qsum逐一對(duì)比,并采用字符匹配的方法計(jì)算字符串Q' i分別 與字符串Q1 Qsim的相似度(分別用S1 S·表示)。如果相似度S1 S·均小于某一 預(yù)先設(shè)定的閾值,則字符串Q' 應(yīng)的數(shù)字碼為0 ;否則,如果相似度S1-Ssim中僅有一個(gè) 最大值Smax,則字符串Q' i對(duì)應(yīng)的數(shù)字碼為最大值Smax對(duì)應(yīng)的匯編指令在漏洞指令庫(kù)的數(shù) 字碼;否則,如果相似度S1 Ssum中的最大值Smax多于一個(gè),即可隨機(jī)選取任意一個(gè)最大值 Smax,則字符串Q' i對(duì)應(yīng)的數(shù)字碼為該最大值Smax對(duì)應(yīng)的匯編指令在漏洞指令庫(kù)的數(shù)字碼。步驟4. 8 將第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的匯編指令的計(jì)數(shù)器B的 計(jì)數(shù)值i值增1,重復(fù)執(zhí)行步驟4. 6到步驟4. 8。步驟4. 9 將漏洞指令庫(kù)包含的匯編指令的計(jì)數(shù)器A的計(jì)數(shù)值m的值增1,重復(fù)執(zhí) 行步驟4. 3到步驟4. 9。經(jīng)過(guò)結(jié)構(gòu)化處理方法的一次完整操作,即可得到屬于漏洞指令庫(kù)中的一個(gè)漏洞的 數(shù)字碼序列C^ = Io1, . . .,ok,. . .,oN},也稱(chēng)為該漏洞的一組觀測(cè)序列;1彡k彡N且k為 正整數(shù),N為該漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段的個(gè)數(shù),該漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段 中的每一個(gè)匯編指令片段產(chǎn)生一個(gè)該漏洞的觀測(cè)序列。KrSN' , N'為漏洞指令庫(kù)中 包含的漏洞的數(shù)量,r和N'均為正整數(shù)。步驟五、依次獲得漏洞指令庫(kù)中的每個(gè)漏洞對(duì)應(yīng)的隱馬爾科夫模型的參數(shù)λ r = {Ar Br 耵 r} ο分別利用漏洞指令庫(kù)中的每個(gè)漏洞的訓(xùn)練數(shù)據(jù)訓(xùn)練隱馬爾科夫模型,獲得漏洞指 令庫(kù)中的每個(gè)漏洞對(duì)應(yīng)的隱馬爾科夫模型的參數(shù)K= {Ar, Br, π J。對(duì)于漏洞指令庫(kù)中的每個(gè)漏洞的一組觀測(cè)序列Or = Io1, . . .,ok,. . .,oN},利用 Baum-Welch算法迭代調(diào)整隱馬爾科夫模型模型的參數(shù),得到最優(yōu)的能夠描述該類(lèi)別漏洞的 隱馬爾科夫模型參數(shù)^= {Ar, Br, π J,即為漏洞指令庫(kù)中的每個(gè)漏洞訓(xùn)練一個(gè)隱馬爾科 夫模型模型。步驟六、使用步驟五得到的漏洞指令庫(kù)中的每個(gè)漏洞的隱馬爾科夫模型模型對(duì)待 測(cè)可執(zhí)行程序進(jìn)行漏洞識(shí)別;具體為步驟6. 1 針對(duì)待測(cè)可執(zhí)行程序使用靜態(tài)反匯編分析工具進(jìn)行反匯編,并獲得可 執(zhí)行程序中全部函數(shù)的函數(shù)結(jié)構(gòu)圖,并將每個(gè)函數(shù)結(jié)構(gòu)圖稱(chēng)為一個(gè)匯編指令片段。步驟6.2 依次對(duì)待測(cè)可執(zhí)行程序的匯編指令片段中的匯編指令進(jìn)行處理,獲得 待測(cè)可執(zhí)行程序的數(shù)字碼序列O' = Iv1, . . . , VtI ,也稱(chēng)為該待測(cè)可執(zhí)行程序的觀測(cè)序列; 其中,V1, ...,Vt為該待測(cè)可執(zhí)行程序的匯編指令片段中的一條匯編指令對(duì)應(yīng)的數(shù)字碼;t 為正整數(shù),表示待測(cè)可執(zhí)行程序的匯編指令片段中的匯編指令的數(shù)量。具體操作步驟為
步驟6. 2. 1 待測(cè)可執(zhí)行程序的匯編指令片段中的匯編指令的數(shù)量用計(jì)數(shù)器C計(jì) 數(shù),計(jì)數(shù)器C的計(jì)數(shù)值用j表示,j為正整數(shù);設(shè)定計(jì)數(shù)器C的計(jì)數(shù)值j的初值為1 ;。步驟6. 2. 2 判斷待測(cè)可執(zhí)行程序的匯編指令片段中的匯編指令的計(jì)數(shù)器C的計(jì) 數(shù)值j的值是否不大于待測(cè)可執(zhí)行程序的匯編指令片段中的匯編指令的數(shù)量,如果該條件 成立,則執(zhí)行步驟6. 2. 3的操作;否則,執(zhí)行步驟4. 9的操作。步驟6. 2. 3 依次將待測(cè)可執(zhí)行程序的匯編指令片段中的每一條匯編指令(用Cj 表示)中的數(shù)字去掉,組成新字符串(用C'彳表示)與步驟4. 1得到的將漏洞指令庫(kù)中的 每一條匯編指令中的數(shù)字去掉,組成新字符串Q1 Qsim逐一對(duì)比,并采用字符匹配的方法計(jì) 算字符串C' j分別與字符串Q1 Qsim的相似度(分別用S'工 S' ■表示)。如果相似 度S' i S' ■均小于某一預(yù)先設(shè)定的閾值,則字符串C'彳對(duì)應(yīng)的數(shù)字碼為0;否則,如 果相似度S' i S' ■中僅有一個(gè)最大值S' _,則字符串C'彳對(duì)應(yīng)的數(shù)字碼為最大值 S' max對(duì)應(yīng)的匯編指令在漏洞指令庫(kù)的數(shù)字碼;否則,如果相似度S' i S' ■中的最大 值S' _多于一個(gè),即可隨機(jī)選取任意一個(gè)最大值S' max,則字符串C'」對(duì)應(yīng)的數(shù)字碼為 該最大值S' _對(duì)應(yīng)的匯編指令在漏洞指令庫(kù)的數(shù)字碼。步驟6. 2. 4 將表示待測(cè)可執(zhí)行程序的匯編指令片段中的匯編指令的計(jì)數(shù)器C的 計(jì)數(shù)值j值增1,重復(fù)執(zhí)行步驟6. 2. 2到步驟6. 2. 4。經(jīng)過(guò)步驟6. 2. 1到步驟6. 2. 4的操作,即可得到待測(cè)可執(zhí)行程序的數(shù)字碼序列ο ‘ =Iv1, . . .,vt} ο步驟6. 3 根據(jù)步驟6. 2中得到的待測(cè)可執(zhí)行程序的數(shù)字碼序列ο‘分別利用步驟 五得到的漏洞指令庫(kù)中的每個(gè)漏洞對(duì)應(yīng)的隱馬爾科夫模型的參數(shù)K= {Ar, Br, Jij,計(jì)算 該待測(cè)可執(zhí)行程序的觀察序列ο' = Iv1, . . . , vj在該隱馬爾科夫模型λ r = {Ar, Br, π r} 上發(fā)生的概率Ρ(ο'入山即得到P(o' X1WJP(C)' λΝ,)。步驟6. 4 取P (ο ‘ I λ J到P (ο ‘ | λ )中的最大值,如果該最大值大于某一個(gè) 預(yù)先設(shè)定的閾值,則待測(cè)可執(zhí)行程序含有該最大值對(duì)應(yīng)的隱馬爾科夫模型所表示的漏洞。經(jīng)過(guò)上述步驟的操作,即可檢測(cè)出待測(cè)可執(zhí)行程序中存在的漏洞。有益效果本發(fā)明提出的方法與已有技術(shù)相比較,有如下優(yōu)點(diǎn)(1)本發(fā)明的方法直接對(duì)匯編指令進(jìn)行分析,并可在一個(gè)較小的匯編指令范圍內(nèi) 準(zhǔn)確識(shí)別漏洞,提高了漏洞檢測(cè)的效率,同時(shí)降低了誤報(bào)率和漏報(bào)率;(2)漏洞指令庫(kù)提供一種機(jī)制,將非結(jié)構(gòu)化的匯編指令映射為結(jié)構(gòu)化的數(shù)字碼序 列,這些數(shù)字碼序列可以被經(jīng)典的模式識(shí)別模型所處理;(3)首次將隱馬爾科夫模型應(yīng)用于對(duì)存在上下文關(guān)聯(lián)性的匯編指令進(jìn)行建模并對(duì) 漏洞特征進(jìn)行識(shí)別。
圖1為已有技術(shù)的全連接結(jié)構(gòu)的3個(gè)狀態(tài)的隱馬爾科夫模型示意圖;圖2為已有技術(shù)的隱馬爾科夫模型的組成示意圖。
具體實(shí)施例方式下面結(jié)合具體實(shí)施例對(duì)本發(fā)明技術(shù)方案進(jìn)行詳細(xì)描述。本實(shí)施例采用本發(fā)明方法對(duì)大小在50KB至100KB之間的30個(gè)可執(zhí)行程序進(jìn)行漏 洞檢測(cè)。步驟如下步驟一、采用30個(gè)大小在IOKB左右的可執(zhí)行程序構(gòu)造漏洞指令庫(kù),漏洞指令庫(kù)包 含3個(gè)漏洞,具體為步驟1. 1 針對(duì)包含一種軟件漏洞的10個(gè)可執(zhí)行程序使用靜態(tài)反匯編分析工具進(jìn)行反 匯編,獲得可執(zhí)行程序中全部函數(shù)的函數(shù)結(jié)構(gòu)圖;將每個(gè)函數(shù)結(jié)構(gòu)圖稱(chēng)為一個(gè)匯編指令片段。每個(gè)函數(shù)圖對(duì)應(yīng)一個(gè)函數(shù),每個(gè)函數(shù)圖包括但不限于以下信息函數(shù)名稱(chēng)、函數(shù)參 數(shù)、返回值類(lèi)型、函數(shù)中使用的全局變量和局部變量、函數(shù)中使用的寄存器、函數(shù)中使用的 系統(tǒng)調(diào)用、函數(shù)包含的所有匯編指令、函數(shù)的控制流結(jié)構(gòu)、對(duì)關(guān)鍵指令的類(lèi)高級(jí)語(yǔ)言注釋。所述函數(shù)的控制流結(jié)構(gòu)是基于跳轉(zhuǎn)指令進(jìn)行劃分的。步驟1. 2 從步驟1. 1中獲得的匯編指令片段中提取出產(chǎn)生以下3種漏洞的匯編 指令片段(1)棧溢出漏洞的匯編指令片段;(2)堆溢出漏洞的匯編指令片段;(3)格式化 輸出漏洞的匯編指令片段。步驟1. 3 使用Paimei動(dòng)態(tài)反匯編分析工具從步驟1. 2中得到的產(chǎn)生該漏洞的匯 編指令片段中依次提取出產(chǎn)生該漏洞的匯編指令,將這些匯編指令組成的有序集合稱(chēng)為匯 編指令幀。具體為步驟1. 3. 1 在正常狀態(tài)下運(yùn)行步驟1. 1中所述可執(zhí)行程序,使用動(dòng)態(tài)反匯編分析 工具依次跟蹤步驟1. 2中提取出的產(chǎn)生該漏洞的匯編指令片段,記錄下每個(gè)產(chǎn)生該漏洞的 匯編指令片段中在此次運(yùn)行過(guò)程中所執(zhí)行的匯編指令,將這些執(zhí)行的匯編指令組成的有序 集合稱(chēng)為匯編指令集合1 ;步驟1. 3. 2 激活該漏洞,使用動(dòng)態(tài)反匯編分析工具再次運(yùn)行步驟1. 1中所述可執(zhí) 行程序,跟蹤步驟1. 2中提取的產(chǎn)生該漏洞的匯編指令片段,依次記錄下每個(gè)匯編指令片 段中在此次運(yùn)行過(guò)程中所執(zhí)行的匯編指令,將這些執(zhí)行的匯編指令組成的有序集合稱(chēng)為匯 編指令集合2 ;步驟1. 3. 3 依次將匯編指令集合1和匯編指令集合2中的匯編指令進(jìn)行匹配比 對(duì),并分為以下三種情況處理情況1 對(duì)于同時(shí)出現(xiàn)在匯編指令集合1和匯編指令集合2中的匯編指令,視為不 是觸發(fā)該漏洞的匯編指令,做刪除處理;情況2 對(duì)于在編指令集合1中出現(xiàn),但是在匯編指令集合2中沒(méi)有出現(xiàn)的匯編指 令,做丟棄處理;做丟棄處理的這些匯編指令是可執(zhí)行程序在正常運(yùn)行時(shí)所執(zhí)行的,而在觸 發(fā)漏洞時(shí)未執(zhí)行的匯編指令,因此視為不是觸發(fā)該漏洞的匯編指令。情況3 對(duì)于在匯編指令集合2中出現(xiàn),但是在編指令集合1中沒(méi)有出現(xiàn)的匯編指 令組成的有序集合稱(chēng)為匯編指令幀;匯編指令幀中存儲(chǔ)與觸發(fā)漏洞有關(guān)的匯編指令。經(jīng)過(guò)上述步驟的操作即可得到產(chǎn)生該漏洞的匯編指令幀。步驟1. 4 構(gòu)造漏洞指令庫(kù)。按照步驟1. 3得到的匯編指令幀中的匯編指令的依次提取順序,為每條匯編指令 增加一條數(shù)字碼。數(shù)字碼是一個(gè)5位十進(jìn)制數(shù),其中左邊兩位代表漏洞類(lèi)型的編碼,其它三位為某一類(lèi)型的漏洞對(duì)應(yīng)的匯編指令序列的順序編號(hào)。通過(guò)重復(fù)執(zhí)行步驟1. 1到步驟1. 4的操作,可構(gòu)造包含3個(gè)漏洞的漏洞指令庫(kù)。通過(guò)上述步驟的操作,構(gòu)造了 1個(gè)漏洞指令庫(kù),其中包含表示這3種漏洞的共35 個(gè)匯編指令。表1漏洞指令庫(kù)結(jié)構(gòu)
數(shù)字碼匯編指令
步驟二、針對(duì)步驟一中構(gòu)造的漏洞指令庫(kù)中的全部漏洞,分別為每種漏洞選取多 個(gè)含有該漏洞的可執(zhí)行程序。漏洞指令庫(kù)中的每種漏洞用\表示,該漏洞的訓(xùn)練數(shù)據(jù)用Ti 表示;i代表漏洞指令庫(kù)中每個(gè)漏洞的唯一編碼。步驟二、針對(duì)3種漏洞,對(duì)于漏洞指令庫(kù)中的每一個(gè)漏洞類(lèi)型,分別選取12個(gè)可執(zhí) 行程序作為該漏洞的訓(xùn)練數(shù)據(jù)。漏洞指令庫(kù)中的每種漏洞用Vi表示,該漏洞的訓(xùn)練數(shù)據(jù)用 Ti表示;i代表漏洞指令庫(kù)中每個(gè)漏洞的唯一編碼。為了提高數(shù)據(jù)量和得到實(shí)驗(yàn)結(jié)果的無(wú) 偏估計(jì),采用了交叉驗(yàn)證規(guī)則。測(cè)試用可執(zhí)行程序被隨機(jī)拆分為兩組5個(gè)程序用來(lái)訓(xùn)練, 剩余7個(gè)程序用來(lái)測(cè)試。系統(tǒng)性能通過(guò)對(duì)所有程序進(jìn)行100次隨機(jī)組合來(lái)評(píng)估,取平均結(jié) 果作為最終識(shí)別率。步驟三、獲取漏洞指令庫(kù)中的每個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段。針對(duì)步驟二得到的漏洞指令庫(kù)中的每個(gè)漏洞的訓(xùn)練數(shù)據(jù)使用IDA Pro靜態(tài)反匯編 分析工具進(jìn)行反匯編,獲得可執(zhí)行程序中全部函數(shù)的函數(shù)結(jié)構(gòu)圖;將每個(gè)函數(shù)結(jié)構(gòu)圖稱(chēng)為 一個(gè)匯編指令片段。步驟四、獲取訓(xùn)練數(shù)據(jù)的數(shù)字碼序列。依次對(duì)步驟三得到的漏洞指令庫(kù)中的每個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的 匯編指令分別采用結(jié)構(gòu)化處理方法進(jìn)行處理,獲得漏洞指令庫(kù)中每個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯 編指令片段的數(shù)字碼序列;所述結(jié)構(gòu)化處理方法的具體操作步驟為步驟4. 1 依次將漏洞指令庫(kù)中的每一條匯編指令(漏洞指令庫(kù)中的所有匯編指 令分別用P1-Psum表示,其中,sum為正整數(shù),表示漏洞指令庫(kù)包含的匯編指令的數(shù)量)中 的數(shù)字去掉,組成新字符串(新字符串分別用Q1 Qsim表示)。步驟4. 2 漏洞指令庫(kù)包含的匯編指令的數(shù)量使用計(jì)數(shù)器A計(jì)數(shù),計(jì)數(shù)器A的計(jì)數(shù) 值用m表示(m彡1且m為正整數(shù));設(shè)定m的初值為1。步驟4. 3 判斷計(jì)數(shù)器A的計(jì)數(shù)值m是否不大于第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指 令片段的個(gè)數(shù)N,N為正整數(shù);;如果該條件成立,則執(zhí)行步驟4. 4的操作;否則,結(jié)束操作。步驟4.4 將第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的每一條匯編指令(分別 用P' i P' SUffl,表示,其中,sum'為正整數(shù),表示第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段 中的匯編指令的數(shù)量)中的數(shù)字去掉,組成新字符串(分別用Q' i Q' 表示);步驟4. 5 第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的匯編指令的數(shù)量用計(jì)數(shù)器B 計(jì)數(shù),計(jì)數(shù)器B的計(jì)數(shù)值用i表示(i為正整數(shù));設(shè)定計(jì)數(shù)器B的計(jì)數(shù)值i的初值為1。步驟4. 6 判斷第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的匯編指令的計(jì)數(shù)器B 的計(jì)數(shù)值i是否不大于第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的匯編指令的數(shù)量sum', 如果該條件成立,則執(zhí)行步驟4. 7的操作;否則,執(zhí)行步驟4. 9的操作。
步驟4.7 依次將第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的每一條匯編指令中 的數(shù)字去掉,組成新字符串Q' i與步驟4. 1得到的將漏洞指令庫(kù)中的每一條匯編指令中的 數(shù)字去掉,組成新字符串Q1 Qsum逐一對(duì)比,并采用字符匹配的方法計(jì)算字符串Q' i分別 與字符串Q1 Qsim的相似度(分別用S1 S·表示)。如果相似度S1 S·均小于某一 預(yù)先設(shè)定的閾值,則字符串Q' 應(yīng)的數(shù)字碼為0 ;否則,如果相似度S1-Ssim中僅有一個(gè) 最大值Smax,則字符串Q' i對(duì)應(yīng)的數(shù)字碼為最大值Smax對(duì)應(yīng)的匯編指令在漏洞指令庫(kù)的數(shù) 字碼;否則,如果相似度S1 Ssum中的最大值Smax多于一個(gè),即可隨機(jī)選取任意一個(gè)最大值 Smax,則字符串Q' i對(duì)應(yīng)的數(shù)字碼為該最大值Smax對(duì)應(yīng)的匯編指令在漏洞指令庫(kù)的數(shù)字碼。步驟4. 8 將第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的匯編指令的計(jì)數(shù)器B的 計(jì)數(shù)值i值增1,重復(fù)執(zhí)行步驟4. 6到步驟4. 8。步驟4. 9 將漏洞指令庫(kù)包含的匯編指令的計(jì)數(shù)器A的計(jì)數(shù)值m的值增1,重復(fù)執(zhí) 行步驟4. 3到步驟4. 9。經(jīng)過(guò)結(jié)構(gòu)化處理方法的一次完整操作,即可得到屬于漏洞指令庫(kù)中的一個(gè)漏洞的 數(shù)字碼序列C^ = Io1, . . .,ok,. . .,oN},也稱(chēng)為該漏洞的一組觀測(cè)序列;1彡k彡N且k為 正整數(shù),N為該漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段的個(gè)數(shù),該漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段 中的每一個(gè)匯編指令片段產(chǎn)生一個(gè)該漏洞的觀測(cè)序列。KrSN' , N'為漏洞指令庫(kù)中 包含的漏洞的數(shù)量,r和N'均為正整數(shù)。步驟五、依次獲得漏洞指令庫(kù)中的每個(gè)漏洞對(duì)應(yīng)的隱馬爾科夫模型的參數(shù)λ r = {Ar Br 耵 r} ο分別利用漏洞指令庫(kù)中的每個(gè)漏洞的訓(xùn)練數(shù)據(jù)訓(xùn)練隱馬爾科夫模型,獲得漏洞指 令庫(kù)中的每個(gè)漏洞對(duì)應(yīng)的隱馬爾科夫模型的參數(shù)K= {Ar, Br, π J。對(duì)于漏洞指令庫(kù)中的每個(gè)漏洞的一組觀測(cè)序列Or = Io1, . . .,ok,. . .,oN},利用 Baum-Welch算法迭代調(diào)整隱馬爾科夫模型模型的參數(shù),得到最優(yōu)的能夠描述該類(lèi)別漏洞的 隱馬爾科夫模型參數(shù)^= {Ar, Br, π J,即為漏洞指令庫(kù)中的每個(gè)漏洞訓(xùn)練一個(gè)隱馬爾科 夫模型模型。本實(shí)施例中,為每一種漏洞類(lèi)型都建立1個(gè)隱馬爾科夫模型。因此一共建立了 3 個(gè)隱馬爾科夫模型參數(shù)集。在初始化過(guò)程中,隱馬爾科夫模型狀態(tài)被當(dāng)作均勻分布。B^中 的每一行中的元素都被賦值為Ι/k,其中k = 35,k是漏洞指令庫(kù)包含的匯編指令的數(shù)量。 每一個(gè)狀態(tài)的轉(zhuǎn)換概率也是相等的。因此,在使用Baum-Welch算法進(jìn)行訓(xùn)練的過(guò)程中,3狀 態(tài)隱馬爾科夫模型中需要估算的參數(shù)的全部數(shù)量是114,其中9個(gè)狀態(tài)轉(zhuǎn)換+3*35個(gè)輸出概 率。在測(cè)試過(guò)程中,使用7個(gè)測(cè)試程序,此7個(gè)可執(zhí)行程序均為無(wú)漏洞可執(zhí)行程序或不 含這3類(lèi)漏洞的可執(zhí)行程序。因此,產(chǎn)生的測(cè)試結(jié)果均與這3類(lèi)漏洞不匹配。取這些結(jié)果 的均值,由此得到的值作為判斷漏洞類(lèi)型歸屬的閾值。在之后的測(cè)試過(guò)程中,小于該值的測(cè) 試結(jié)果,均視為與已知漏洞類(lèi)型不匹配。步驟六、使用步驟五得到的漏洞指令庫(kù)中的每個(gè)漏洞的隱馬爾科夫模型模型對(duì)待 測(cè)可執(zhí)行程序進(jìn)行漏洞識(shí)別;具體為步驟6. 1 針對(duì)待測(cè)可執(zhí)行程序使用靜態(tài)反匯編分析工具進(jìn)行反匯編,并獲得可 執(zhí)行程序中全部函數(shù)的函數(shù)結(jié)構(gòu)圖,并將每個(gè)函數(shù)結(jié)構(gòu)圖稱(chēng)為一個(gè)匯編指令片段。
步驟6.2 依次對(duì)待測(cè)可執(zhí)行程序的匯編指令片段中的匯編指令進(jìn)行處理,獲得 待測(cè)可執(zhí)行程序的數(shù)字碼序列O' = Iv1, . . . , VtI ,也稱(chēng)為該待測(cè)可執(zhí)行程序的觀測(cè)序列; 其中,V1, ...,Vt為該待測(cè)可執(zhí)行程序的匯編指令片段中的一條匯編指令對(duì)應(yīng)的數(shù)字碼;t 為正整數(shù),表示待測(cè)可執(zhí)行程序的匯編指令片段中的匯編指令的數(shù)量。具體操作步驟為步驟6. 2. 1 待測(cè)可執(zhí)行程序的匯編指令片段中的匯編指令的數(shù)量用計(jì)數(shù)器C計(jì) 數(shù),計(jì)數(shù)器C的計(jì)數(shù)值用j表示,j為正整數(shù);設(shè)定計(jì)數(shù)器C的計(jì)數(shù)值j的初值為1 ;。步驟6. 2. 2 判斷待測(cè)可執(zhí)行程序的匯編指令片段中的匯編指令的計(jì)數(shù)器C的計(jì) 數(shù)值j的值是否不大于待測(cè)可執(zhí)行程序的匯編指令片段中的匯編指令的數(shù)量,如果該條件 成立,則執(zhí)行步驟6. 2. 3的操作;否則,執(zhí)行步驟4. 9的操作。步驟6. 2. 3 依次將待測(cè)可執(zhí)行程序的匯編指令片段中的每一條匯編指令(用Cj 表示)中的數(shù)字去掉,組成新字符串(用C'彳表示)與步驟4. 1得到的將漏洞指令庫(kù)中的 每一條匯編指令中的數(shù)字去掉,組成新字符串Q1 Qsim逐一對(duì)比,并采用字符匹配的方法計(jì) 算字符串C' j分別與字符串Q1 Qsim的相似度(分別用S'工 S' ■表示)。如果相似 度S' i S' ■均小于某一預(yù)先設(shè)定的閾值,則字符串C'彳對(duì)應(yīng)的數(shù)字碼為0;否則,如 果相似度S' i S' ■中僅有一個(gè)最大值S' _,則字符串C'彳對(duì)應(yīng)的數(shù)字碼為最大值 S' max對(duì)應(yīng)的匯編指令在漏洞指令庫(kù)的數(shù)字碼;否則,如果相似度S' i S' ■中的最大 值S' _多于一個(gè),即可隨機(jī)選取任意一個(gè)最大值S' max,則字符串C'」對(duì)應(yīng)的數(shù)字碼為 該最大值S' _對(duì)應(yīng)的匯編指令在漏洞指令庫(kù)的數(shù)字碼。步驟6. 2. 4 將表示待測(cè)可執(zhí)行程序的匯編指令片段中的匯編指令的計(jì)數(shù)器C的 計(jì)數(shù)值j值增1,重復(fù)執(zhí)行步驟6. 2. 2到步驟6. 2. 4。經(jīng)過(guò)步驟6. 2. 1到步驟6. 2. 4的操作,即可得到待測(cè)可執(zhí)行程序的數(shù)字碼序列ο ‘ =Iv1, . . .,vt} ο步驟6. 3 根據(jù)步驟6. 2中得到的待測(cè)可執(zhí)行程序的數(shù)字碼序列ο‘分別利用步驟 五得到的漏洞指令庫(kù)中的每個(gè)漏洞對(duì)應(yīng)的隱馬爾科夫模型的參數(shù)K= {Ar, Br, \},計(jì)算 該待測(cè)可執(zhí)行程序的觀察序列ο' = Iv1, . . . , vj在該隱馬爾科夫模型λ r = {Ar, Br, π r} 上發(fā)生的概率Ρ(ο'入山即得到P(o' X1WJP(C)' λΝ,)。步驟6.4:取Ρ(ο'丨人^到卩⑦‘I λΝ,)中的最大值,如果該最大值大于某一個(gè) 預(yù)先設(shè)定的閾值,則待測(cè)可執(zhí)行程序含有該最大值對(duì)應(yīng)的隱馬爾科夫模型所表示的漏洞。經(jīng)過(guò)上述步驟的操作,即可檢測(cè)出待測(cè)可執(zhí)行程序中存在的漏洞。表2展示了識(shí)別率隨著隱馬爾科夫模型狀態(tài)數(shù)的增加而增加,隱馬爾科夫模型狀 態(tài)數(shù)的取值從1至7。當(dāng)隱馬爾科夫模型狀態(tài)數(shù)大于7時(shí),識(shí)別率不再顯著變化。這意味 著當(dāng)狀態(tài)數(shù)較少時(shí),隱馬爾科夫模型狀態(tài)不足以為上下文相關(guān)的數(shù)字碼序列進(jìn)行建模。雖 然較大的狀態(tài)數(shù)能夠提供理想的識(shí)別率,但是此時(shí)的計(jì)算代價(jià)也非常高,因?yàn)樾枰?jì)算更 多的隱馬爾科夫模型參數(shù)。因此,我們選擇7狀態(tài)隱馬爾科夫模型進(jìn)行實(shí)驗(yàn)。為了說(shuō)明本 發(fā)明方法的效果,對(duì)相同的測(cè)試程序分別采用方法1、方法2和方法3進(jìn)行檢測(cè);由于方法1 和方法2基于源代碼分析,因此在這兩個(gè)方法的測(cè)試中,使用了 36個(gè)測(cè)試程序?qū)?yīng)的源代 碼。表2基于不同隱馬爾科夫模型狀態(tài)數(shù)得到的識(shí)別率 表3顯示了本發(fā)明中的方法與另外三種方法對(duì)于不同漏洞類(lèi)型的性能比較。當(dāng)分 析棧溢出漏洞時(shí),由于其特征相對(duì)容易識(shí)別,本發(fā)明中的方法識(shí)別出了 89. 的漏洞(漏 報(bào)率為10.9%),而誤報(bào)率是21.9%。相比之下,方法1、2、3的誤報(bào)率都在22%以上,且漏 報(bào)率在11%以上。對(duì)于堆溢出漏洞,由于其特征不如棧溢出漏洞明顯,本發(fā)明中的方法產(chǎn)生 了 30. 7%的誤報(bào)率,而漏報(bào)率為21.4%。即便如此,本發(fā)明中的方法的漏報(bào)率低于方法1和 3,而誤報(bào)率低于方法1和方法2。對(duì)于格式化輸出漏洞,本發(fā)明中的方法產(chǎn)生了 20. 7%的漏 報(bào)率,而其它方法的漏報(bào)率則在20. 9% -22. 5%之間,本發(fā)明中的方法的誤報(bào)率為17. 7%, 低于方法1的19. 2%和方法2的18. 5%。最終,平均誤報(bào)率顯示,本發(fā)明中的方法在對(duì)漏洞的識(shí)別能力上更加準(zhǔn)確。且平均 漏報(bào)率顯示,本發(fā)明方法能夠提供比源代碼檢測(cè)工具更高的漏洞識(shí)別率,也就是更低的漏 報(bào)率。因此,本發(fā)明中的方法可以作為識(shí)別其他更多類(lèi)型的漏洞的分類(lèi)器和識(shí)別器。表3本發(fā)明中的方法與其他方法的性能比較 本實(shí)施例中,所有的實(shí)驗(yàn)都是在臺(tái)式兼容機(jī)上執(zhí)行,該機(jī)器裝有奔騰雙核 2. 20GHzCPU,內(nèi)存容量是2GB,操作系統(tǒng)是Windows XP SP2。以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人 員來(lái)說(shuō),在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn),或者對(duì)其中部分技術(shù)特征進(jìn) 行等同替換,這些改進(jìn)和替換也應(yīng)視為本發(fā)明的保護(hù)范圍。
權(quán)利要求
一種基于隱馬爾可夫模型的匯編指令級(jí)漏洞檢測(cè)方法,其具體操作步驟如下步驟一、構(gòu)造漏洞指令庫(kù);漏洞指令庫(kù)用來(lái)存儲(chǔ)已知漏洞及已知漏洞的特征,一個(gè)漏洞包括3個(gè)屬性漏洞名稱(chēng)、匯編指令幀和數(shù)字碼;每個(gè)匯編指令幀包括1條或多條匯編指令;每個(gè)數(shù)字碼包括兩部分,其中一部分為每個(gè)漏洞的唯一編碼,另一部分為該漏洞對(duì)應(yīng)的匯編指令幀中包含的匯編指令的順序編號(hào);對(duì)于每一個(gè)漏洞,其具體構(gòu)造方法為步驟1.1針對(duì)包含一種軟件漏洞的一個(gè)或一個(gè)以上的可執(zhí)行程序使用靜態(tài)反匯編分析工具進(jìn)行反匯編,獲得可執(zhí)行程序中全部函數(shù)的函數(shù)結(jié)構(gòu)圖;將每個(gè)函數(shù)結(jié)構(gòu)圖稱(chēng)為一個(gè)匯編指令片段;步驟1.2從步驟1.1中獲得的匯編指令片段中提取出產(chǎn)生該漏洞的匯編指令片段;步驟1.3使用動(dòng)態(tài)反匯編分析工具從步驟1.2中得到的產(chǎn)生該漏洞的匯編指令片段中依次提取出產(chǎn)生該漏洞的匯編指令,將這些匯編指令組成的有序集合稱(chēng)為匯編指令幀;具體為步驟1.3.1在正常狀態(tài)下運(yùn)行步驟1.1中所述可執(zhí)行程序,使用動(dòng)態(tài)反匯編分析工具依次跟蹤步驟1.2中提取出的產(chǎn)生該漏洞的匯編指令片段,記錄下每個(gè)產(chǎn)生該漏洞的匯編指令片段中在此次運(yùn)行過(guò)程中所執(zhí)行的匯編指令,將這些執(zhí)行的匯編指令組成的有序集合稱(chēng)為匯編指令集合1;步驟1.3.2激活該漏洞,使用動(dòng)態(tài)反匯編分析工具再次運(yùn)行步驟1.1中所述可執(zhí)行程序,跟蹤步驟1.2中提取的產(chǎn)生該漏洞的匯編指令片段,依次記錄下每個(gè)匯編指令片段中在此次運(yùn)行過(guò)程中所執(zhí)行的匯編指令,將這些執(zhí)行的匯編指令組成的有序集合稱(chēng)為匯編指令集合2;步驟1.3.3依次將匯編指令集合1和匯編指令集合2中的匯編指令進(jìn)行匹配比對(duì),并分為以下三種情況處理情況1對(duì)于同時(shí)出現(xiàn)在匯編指令集合1和匯編指令集合2中的匯編指令,視為不是觸發(fā)該漏洞的匯編指令,做刪除處理;情況2對(duì)于在編指令集合1中出現(xiàn),但是在匯編指令集合2中沒(méi)有出現(xiàn)的匯編指令,做丟棄處理;做丟棄處理的這些匯編指令是可執(zhí)行程序在正常運(yùn)行時(shí)所執(zhí)行的,而在觸發(fā)漏洞時(shí)未執(zhí)行的匯編指令,因此視為不是觸發(fā)該漏洞的匯編指令;情況3對(duì)于在匯編指令集合2中出現(xiàn),但是在編指令集合1中沒(méi)有出現(xiàn)的匯編指令組成的有序集合稱(chēng)為匯編指令幀;匯編指令幀中存儲(chǔ)與觸發(fā)漏洞有關(guān)的匯編指令;經(jīng)過(guò)上述步驟的操作即可得到產(chǎn)生該漏洞的匯編指令幀;步驟1.4構(gòu)造漏洞指令庫(kù);按照步驟1.3得到的匯編指令幀中的匯編指令的依次提取順序,為每條匯編指令增加一條數(shù)字碼;通過(guò)重復(fù)執(zhí)行步驟1.1到步驟1.4的操作,可構(gòu)造包含多個(gè)漏洞的漏洞指令庫(kù);步驟二、針對(duì)步驟一中構(gòu)造的漏洞指令庫(kù)中的全部漏洞,分別為漏洞指令庫(kù)中的每種漏洞選取多個(gè)含有該漏洞的可執(zhí)行程序作為該漏洞的訓(xùn)練數(shù)據(jù);漏洞指令庫(kù)中的每種漏洞用Vi表示,該漏洞的訓(xùn)練數(shù)據(jù)用Ti表示;i代表漏洞指令庫(kù)中每個(gè)漏洞的唯一編碼;步驟三、獲取漏洞指令庫(kù)中的每個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段;針對(duì)步驟二得到的漏洞指令庫(kù)中的每個(gè)漏洞的訓(xùn)練數(shù)據(jù)使用靜態(tài)反匯編分析工具進(jìn)行反匯編,獲得可執(zhí)行程序中全部函數(shù)的函數(shù)結(jié)構(gòu)圖;將每個(gè)函數(shù)結(jié)構(gòu)圖稱(chēng)為一個(gè)匯編指令片段;步驟四、獲取訓(xùn)練數(shù)據(jù)的數(shù)字碼序列;依次對(duì)步驟三得到的漏洞指令庫(kù)中的每個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的匯編指令分別采用結(jié)構(gòu)化處理方法進(jìn)行處理,獲得漏洞指令庫(kù)中每個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段的數(shù)字碼序列;所述結(jié)構(gòu)化處理方法的具體操作步驟為步驟4.1依次將漏洞指令庫(kù)中的每一條匯編指令中的數(shù)字去掉,組成新字符串;漏洞指令庫(kù)中的所有匯編指令分別用P1~Psum表示,其中,sum為正整數(shù),表示漏洞指令庫(kù)包含的匯編指令的數(shù)量;由漏洞指令庫(kù)中的每一條匯編指令產(chǎn)生的新字符串分別用Q1~Qsum表示;步驟4.2漏洞指令庫(kù)包含的匯編指令的數(shù)量使用計(jì)數(shù)器A計(jì)數(shù),計(jì)數(shù)器A的計(jì)數(shù)值用m表示,m≥1且m為正整數(shù);設(shè)定m的初值為1;步驟4.3判斷計(jì)數(shù)器A的計(jì)數(shù)值m是否不大于第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段的個(gè)數(shù)N,N為正整數(shù);;如果該條件成立,則執(zhí)行步驟4.4的操作;否則,結(jié)束操作;步驟4.4將第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的每一條匯編指令中的數(shù)字去掉,組成新字符串;第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的每一條匯編指令分別用P′1~P′sum′表示,其中,sum′為正整數(shù),表示第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的匯編指令的數(shù)量;第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的每一條匯編指令產(chǎn)生的新字符串分別用Q′1~Q′sum′表示;步驟4.5第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的匯編指令的數(shù)量用計(jì)數(shù)器B計(jì)數(shù),計(jì)數(shù)器B的計(jì)數(shù)值用i表示,i為正整數(shù);設(shè)定計(jì)數(shù)器B的計(jì)數(shù)值i的初值為1;步驟4.6判斷第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的匯編指令的計(jì)數(shù)器B的計(jì)數(shù)值i是否不大于第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的匯編指令的數(shù)量sum′,如果該條件成立,則執(zhí)行步驟4.7的操作;否則,執(zhí)行步驟4.9的操作;步驟4.7依次將第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的每一條匯編指令中的數(shù)字去掉,組成新字符串Q′i與步驟4.1得到的將漏洞指令庫(kù)中的每一條匯編指令中的數(shù)字去掉,組成新字符串Q1~Qsum逐一對(duì)比,并采用字符匹配的方法計(jì)算字符串Q′i分別與字符串Q1~Qsum的相似度,分別用S1~Ssum表示;如果相似度S1~Ssum均小于某一預(yù)先設(shè)定的閾值,則字符串Q′i對(duì)應(yīng)的數(shù)字碼為0;否則,如果相似度S1~Ssum中僅有一個(gè)最大值Smax,則字符串Q′i對(duì)應(yīng)的數(shù)字碼為最大值Smax對(duì)應(yīng)的匯編指令在漏洞指令庫(kù)的數(shù)字碼;否則,如果相似度S1~Ssum中的最大值Smax多于一個(gè),即可隨機(jī)選取任意一個(gè)最大值Smax,則字符串Q′i對(duì)應(yīng)的數(shù)字碼為該最大值Smax對(duì)應(yīng)的匯編指令在漏洞指令庫(kù)的數(shù)字碼;步驟4.8將第m個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的匯編指令的計(jì)數(shù)器B的計(jì)數(shù)值i值增1,重復(fù)執(zhí)行步驟4.6到步驟4.8;步驟4.9將漏洞指令庫(kù)包含的匯編指令的計(jì)數(shù)器A的計(jì)數(shù)值m的值增1,重復(fù)執(zhí)行步驟4.3到步驟4.9;經(jīng)過(guò)結(jié)構(gòu)化處理方法的一次完整操作,即可得到屬于漏洞指令庫(kù)中的一個(gè)漏洞的數(shù)字碼序列Or={o1,...,ok,...,oN},也稱(chēng)為該漏洞的一組觀測(cè)序列;1≤k≤N且k為正整數(shù),N為該漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段的個(gè)數(shù),該漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段中的每一個(gè)匯編指令片段產(chǎn)生一個(gè)該漏洞的觀測(cè)序列;1≤r≤N′,N′為漏洞指令庫(kù)中包含的漏洞的數(shù)量,r和N′均為正整數(shù);步驟五、依次獲得漏洞指令庫(kù)中的每個(gè)漏洞對(duì)應(yīng)的隱馬爾科夫模型的參數(shù)λr={Ar,Br,πr};分別利用漏洞指令庫(kù)中的每個(gè)漏洞的訓(xùn)練數(shù)據(jù)訓(xùn)練隱馬爾科夫模型,獲得漏洞指令庫(kù)中的每個(gè)漏洞對(duì)應(yīng)的隱馬爾科夫模型的參數(shù)λr={Ar,Br,πr};對(duì)于漏洞指令庫(kù)中的每個(gè)漏洞的一組觀測(cè)序列Or={o1,...,ok,...,oN},利用Baum Welch算法迭代調(diào)整隱馬爾科夫模型模型的參數(shù),得到最優(yōu)的能夠描述該類(lèi)別漏洞的隱馬爾科夫模型參數(shù)λr={Ar,Br,πr},即為漏洞指令庫(kù)中的每個(gè)漏洞訓(xùn)練一個(gè)隱馬爾科夫模型模型;步驟六、使用步驟五得到的漏洞指令庫(kù)中的每個(gè)漏洞的隱馬爾科夫模型模型對(duì)待測(cè)可執(zhí)行程序進(jìn)行漏洞識(shí)別;具體為步驟6.1針對(duì)待測(cè)可執(zhí)行程序使用靜態(tài)反匯編分析工具進(jìn)行反匯編,并獲得可執(zhí)行程序中全部函數(shù)的函數(shù)結(jié)構(gòu)圖,并將每個(gè)函數(shù)結(jié)構(gòu)圖稱(chēng)為一個(gè)匯編指令片段;步驟6.2依次對(duì)待測(cè)可執(zhí)行程序的匯編指令片段中的匯編指令進(jìn)行處理,獲得待測(cè)可執(zhí)行程序的數(shù)字碼序列o′={v1,...,vt},也稱(chēng)為該待測(cè)可執(zhí)行程序的觀測(cè)序列;其中,v1,...,vt為該待測(cè)可執(zhí)行程序的匯編指令片段中的一條匯編指令對(duì)應(yīng)的數(shù)字碼;t為正整數(shù),表示待測(cè)可執(zhí)行程序的匯編指令片段中的匯編指令的數(shù)量;具體操作步驟為步驟6.2.1待測(cè)可執(zhí)行程序的匯編指令片段中的匯編指令的數(shù)量用計(jì)數(shù)器C計(jì)數(shù),計(jì)數(shù)器C的計(jì)數(shù)值用j表示,j為正整數(shù);設(shè)定計(jì)數(shù)器C的計(jì)數(shù)值j的初值為1;;步驟6.2.2判斷待測(cè)可執(zhí)行程序的匯編指令片段中的匯編指令的計(jì)數(shù)器C的計(jì)數(shù)值j的值是否不大于待測(cè)可執(zhí)行程序的匯編指令片段中的匯編指令的數(shù)量,如果該條件成立,則執(zhí)行步驟6.2.3的操作;否則,執(zhí)行步驟4.9的操作;步驟6.2.3依次將待測(cè)可執(zhí)行程序的匯編指令片段中的每一條匯編指令Cj中的數(shù)字去掉,組成新字符串C′j與步驟4.1得到的將漏洞指令庫(kù)中的每一條匯編指令中的數(shù)字去掉,組成新字符串Q1~Qsum逐一對(duì)比,并采用字符匹配的方法計(jì)算字符串C′j分別與字符串Q1~Qsum的相似度,分別用S′1~S′sum表示;如果相似度S′1~S′sum均小于某一預(yù)先設(shè)定的閾值,則字符串C′j對(duì)應(yīng)的數(shù)字碼為0;否則,如果相似度S′1~S′sum中僅有一個(gè)最大值S′max,則字符串C′j對(duì)應(yīng)的數(shù)字碼為最大值S′max對(duì)應(yīng)的匯編指令在漏洞指令庫(kù)的數(shù)字碼;否則,如果相似度S′1~S′sum中的最大值S′max多于一個(gè),即可隨機(jī)選取任意一個(gè)最大值S′max,則字符串C′j對(duì)應(yīng)的數(shù)字碼為該最大值S′max對(duì)應(yīng)的匯編指令在漏洞指令庫(kù)的數(shù)字碼;步驟6.2.4將表示待測(cè)可執(zhí)行程序的匯編指令片段中的匯編指令的計(jì)數(shù)器C的計(jì)數(shù)值j值增1,重復(fù)執(zhí)行步驟6.2.2到步驟6.2.4;經(jīng)過(guò)步驟6.2.1到步驟6.2.4的操作,即可得到待測(cè)可執(zhí)行程序的數(shù)字碼序列o′={v1,...,vt};步驟6.3根據(jù)步驟6.2中得到的待測(cè)可執(zhí)行程序的數(shù)字碼序列o′分別利用步驟五得到的漏洞指令庫(kù)中的每個(gè)漏洞對(duì)應(yīng)的隱馬爾科夫模型的參數(shù)λr={Ar,Br,πr},計(jì)算該待測(cè)可執(zhí)行程序的觀察序列o′={v1,...,vt}在該隱馬爾科夫模型λr={Ar,Br,πr}上發(fā)生的概率P(o′|λr),即得到P(o′|λ1)到P(o′|λN′);步驟6.4取P(o′|λ1)到P(o′|λN′)中的最大值,如果該最大值大于某一個(gè)預(yù)先設(shè)定的閾值,則待測(cè)可執(zhí)行程序含有該最大值對(duì)應(yīng)的隱馬爾科夫模型所表示的漏洞;經(jīng)過(guò)上述步驟的操作,即可檢測(cè)出待測(cè)可執(zhí)行程序中存在的漏洞。
2.如權(quán)利要求1所述的一種基于隱馬爾可夫模型的匯編指令級(jí)漏洞檢測(cè)方法,其特征 在于步驟1. 1中所述函數(shù)結(jié)構(gòu)圖包括但不限于以下信息函數(shù)名稱(chēng)、函數(shù)參數(shù)、返回值類(lèi) 型、函數(shù)中使用的全局變量和局部變量、函數(shù)中使用的寄存器、函數(shù)中使用的系統(tǒng)調(diào)用、函 數(shù)包含的所有匯編指令、函數(shù)的控制流結(jié)構(gòu)、對(duì)關(guān)鍵指令的類(lèi)高級(jí)語(yǔ)言注釋。
3.如權(quán)利要求2所述的一種基于隱馬爾可夫模型的匯編指令級(jí)漏洞檢測(cè)方法,其特征 在于所述函數(shù)的控制流結(jié)構(gòu)是基于跳轉(zhuǎn)指令進(jìn)行劃分的。
4.如權(quán)利要求1所述的一種基于隱馬爾可夫模型的匯編指令級(jí)漏洞檢測(cè)方法,其特征 在于步驟1. 2中所述提取出產(chǎn)生漏洞的匯編指令片段的方法包括提取棧溢出漏洞的匯編 指令片段的方法,具體為棧溢出漏洞的匯編指令片段,包含如下匯編指令序列①寄存器ESP向低地址移動(dòng),開(kāi) 辟新的??臻g;②寄存器ECX記錄待復(fù)制內(nèi)容的長(zhǎng)度;③寄存器ESI記錄一個(gè)指針值,該指 針指向待復(fù)制內(nèi)容的首地址;④寄存器EDI記錄一個(gè)指針值,該指針指向復(fù)制時(shí)要使用的 棧空間的首地址;⑤將ESI指向的待復(fù)制內(nèi)容以雙字為單位復(fù)制到EDI指向的棧空間中; ⑥將待復(fù)制內(nèi)容剩余的部分以字節(jié)為單位復(fù)制到剩余的棧空間中 ’⑦ESP指向理論上的返 回地址。
5.如權(quán)利要求1所述的一種基于隱馬爾可夫模型的匯編指令級(jí)漏洞檢測(cè)方法,其特征 在于步驟1. 2中所述提取出產(chǎn)生漏洞的匯編指令片段的方法包括提取堆溢出漏洞的匯編 指令片段的方法,具體為堆溢出漏洞的匯編指令片段,包含如下匯編指令序列①調(diào)用HeapCreate函數(shù),創(chuàng)建 堆空間P,包含2個(gè)堆塊,即堆塊A和堆塊B ;②調(diào)用HeapAlIoc函數(shù),為堆塊A動(dòng)態(tài)分配空 間;③把超過(guò)堆塊A大小的內(nèi)容復(fù)制到堆塊A中;④調(diào)用HeapAlloc函數(shù),為堆塊B動(dòng)態(tài)分 配空間,此時(shí)堆塊B的塊首指針已經(jīng)被堆塊A中超出的內(nèi)容所覆蓋。
6.如權(quán)利要求1所述的一種基于隱馬爾可夫模型的匯編指令級(jí)漏洞檢測(cè)方法,其特征 在于步驟1. 2中所述提取出產(chǎn)生漏洞的匯編指令片段的方法包括提取格式化輸出漏洞的 匯編指令片段的方法,具體為格式化輸出漏洞的匯編指令片段,包含如下匯編指令序列①使用call指令調(diào)用格式 化輸出函數(shù)之前的三條指令之內(nèi),沒(méi)有push offset指令;②push offset指令注釋中的 “ %,,個(gè)數(shù)與push offset指令之前連續(xù)出現(xiàn)的push指令數(shù)不符;③在push offset指令 注釋中,出現(xiàn)“ % η”。
7.如權(quán)利要求1所述的一種基于隱馬爾可夫模型的匯編指令級(jí)漏洞檢測(cè)方法,其特征 在于優(yōu)選的,步驟1. 1、步驟三中所述靜態(tài)反匯編分析工具為IDA Pro。
8.如權(quán)利要求1所述的一種基于隱馬爾可夫模型的匯編指令級(jí)漏洞檢測(cè)方法,其特征 在于步驟1. 3中所述動(dòng)態(tài)反匯編分析工具包括但不限于Paimei、Sabre公司的BinNavi。
全文摘要
本發(fā)明涉及一種基于隱馬爾可夫模型的匯編指令級(jí)漏洞檢測(cè)方法,屬于信息安全技術(shù)領(lǐng)域;包括如下步驟①構(gòu)造漏洞指令庫(kù)VIL;②針對(duì)步驟①中構(gòu)造的漏洞指令庫(kù)中的全部漏洞,分別為漏洞指令庫(kù)中的每種漏洞選取多個(gè)含有該漏洞的可執(zhí)行程序作為該漏洞的訓(xùn)練數(shù)據(jù);③獲取漏洞指令庫(kù)中的每個(gè)漏洞的訓(xùn)練數(shù)據(jù)的匯編指令片段;④獲取訓(xùn)練數(shù)據(jù)的數(shù)字碼序列;⑤依次獲得漏洞指令庫(kù)中的每個(gè)漏洞對(duì)應(yīng)的隱馬爾科夫模型的參數(shù)λr={Ar,Br,πr};⑥對(duì)待測(cè)可執(zhí)行程序進(jìn)行漏洞識(shí)別。本發(fā)明提出的方法與已有技術(shù)相比較,有如下優(yōu)點(diǎn)首次將HMM應(yīng)用于對(duì)存在上下文關(guān)聯(lián)性的匯編指令進(jìn)行建模并對(duì)漏洞特征進(jìn)行識(shí)別;提高了漏洞檢測(cè)的效率,同時(shí)降低了誤報(bào)率和漏報(bào)率。
文檔編號(hào)G06F21/00GK101923618SQ20101025702
公開(kāi)日2010年12月22日 申請(qǐng)日期2010年8月19日 優(yōu)先權(quán)日2010年8月19日
發(fā)明者李寧, 王崑聲, 白昊, 胡昌振 申請(qǐng)人:中國(guó)航天科技集團(tuán)公司第七一○研究所;北京理工大學(xué)