專利名稱:一種用于漏洞模型檢測(cè)的程序操作特征提取方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)軟件的漏洞檢測(cè)方法,尤其是檢測(cè)所依據(jù)的漏洞才莫型的程序操作特征 進(jìn)行提取的方法。
背景技術(shù):
隨著軟件規(guī)模和復(fù)雜性的擴(kuò)大,其中隱藏的安全漏洞不斷增加,受到攻擊而遭受損失的威脅 也不斷增加。阻止系統(tǒng)攻擊和入侵的根本解決途徑是在軟件缺陷被利用之前發(fā)現(xiàn)并將其消除。針 對(duì)軟件安全漏洞進(jìn)行軟件代碼檢測(cè)是預(yù)測(cè)和防范漏洞的重要手段之一。漏洞靜態(tài)檢測(cè)是比較有效 的代碼漏洞檢測(cè)技術(shù),而漏洞模型檢測(cè)方法則是其中一種具有代表性的檢測(cè)方法。為進(jìn)行基于漏 洞狀態(tài)機(jī)模型的模型檢測(cè),我們提出一種用于漏洞模型檢測(cè)的程序操作特征提取方法,以提供對(duì) 檢測(cè)程序代碼進(jìn)行抽象、建立與漏洞檢測(cè)有關(guān)的程序特征模型。
目前的基于漏洞模型的軟件漏洞檢測(cè)方法在檢測(cè)過程中存在著重復(fù)檢查等缺點(diǎn),檢測(cè)速度上 顯得不足,影響著漏洞檢測(cè)方法的適用性。對(duì)此,我們提出一種用于漏洞模型檢測(cè)的程序操作特 征提取方法,該方法避免采用原有方法模擬程序執(zhí)行流程的檢測(cè)順序,只提取與漏洞模型檢測(cè)的 程序操作特征,以提高軟件漏洞檢測(cè)的速度。
發(fā)明內(nèi)容
本發(fā)明目的是提出一種面向基于漏洞模型的軟件漏洞模型檢測(cè)的目標(biāo),針對(duì)目前軟件漏洞 檢測(cè)方法存在大量重復(fù)工作、影響檢測(cè)速度的問題,基于軟件漏洞的狀態(tài)機(jī)模型,利用控制流圖 和數(shù)據(jù)流分析技術(shù),提取與軟件漏洞的狀態(tài)機(jī)模型相關(guān)的程序特征,對(duì)軟件代碼進(jìn)行抽象建模, 可用于對(duì)其進(jìn)行漏洞靜態(tài)檢測(cè),以判斷漏洞模型在代碼中的存在性。
為實(shí)現(xiàn)本發(fā)明的所述目的,本發(fā)明提供一種用于軟件漏洞模型檢測(cè)的程序特征提取方法,方 法主要步驟包括1)漏洞模型從數(shù)據(jù)庫中載入內(nèi)存,在分析程序時(shí),作為參考依據(jù),建立漏洞 模型的數(shù)據(jù)結(jié)構(gòu);
2)程序載入特征分析提取流程,對(duì)經(jīng)過gCC編譯的軟件代碼進(jìn)行抽象,根據(jù)漏洞模型相關(guān) 操作的信息抽取需要的操作,完成對(duì)程序的抽象,得到程序特征序列,即構(gòu)造用于漏洞模型檢測(cè) 的程序特征序列。
所述漏洞模型載入流程漏洞模型由漏洞狀態(tài)的狀態(tài)結(jié)點(diǎn)、有向邊的集合所構(gòu)成;狀態(tài)結(jié)點(diǎn) 有啟始、中間過渡和漏洞識(shí)別3種類型,每個(gè)狀態(tài)結(jié)點(diǎn)具有狀態(tài)號(hào)、類型和描述等屬性;有向邊 表示引起狀態(tài)變化的操作,每個(gè)有向邊具有邊號(hào)、類型、原狀態(tài)、新狀態(tài)和描述等屬性;狀態(tài)結(jié)
點(diǎn)、有向邊的集合分別存儲(chǔ)在數(shù)據(jù)庫中的一個(gè)表中狀態(tài)結(jié)點(diǎn)表和有向邊表;為方便模型檢測(cè)處 理,在內(nèi)存中建立由有向邊類型進(jìn)行檢索的操作轉(zhuǎn)換表;每個(gè)類型的有向邊對(duì)應(yīng)一個(gè)鏈表,鏈表 的結(jié)點(diǎn)為一個(gè)有向邊,表示一個(gè)原狀態(tài)到新狀態(tài)的轉(zhuǎn)換關(guān)系;
程序載入和特征提取流程把程序控制流圖中與漏洞狀態(tài)相關(guān)的信息,即操作序列提取出來, 并以函數(shù)為單位進(jìn)行組織,進(jìn)行提取與漏洞模型相關(guān)的操作序列的流程每個(gè)函數(shù)程序特征對(duì)應(yīng) 一個(gè)操作序列鏈表,程序特征鏈表以函數(shù)為單位進(jìn)行組織,操作序列鏈表的結(jié)點(diǎn)為一個(gè)與漏洞狀 態(tài)相關(guān)的操作或函數(shù);函數(shù)程序特征載入時(shí),將磁盤中程序特征鏈表裝入內(nèi)存,初始函數(shù)處理標(biāo) 志為INI (值為0);每個(gè)函數(shù)組織一個(gè)操作序列鏈表,鏈表的結(jié)點(diǎn)為一個(gè)與漏洞狀態(tài)相關(guān)的操作 或函數(shù)。 一方面過濾去除與漏洞檢測(cè)無關(guān)的語句,另一方面,使函數(shù)簡(jiǎn)化控制流到語句級(jí),并使 操作序列化,便于檢測(cè)處理;
本發(fā)明的有益效果是克服目前軟件漏洞檢測(cè)方法存在大量重復(fù)工作、加快檢測(cè)速度,通過 提取與軟件漏洞的狀態(tài)機(jī)模型相關(guān)的程序特征,對(duì)軟件代碼進(jìn)行抽象建模,可用于對(duì)其進(jìn)行漏洞 靜態(tài)檢測(cè),以判斷漏洞模型在代碼中的存在性。
圖1用于漏洞模型檢測(cè)的程序特征提取示意圖
圖2漏洞載入流程圖
圖3程序載入特征提取流程圖
圖4語句塊的語句操作提取處理流程圖
具體實(shí)施例方式
本發(fā)明方法工作流程如圖1-圖4所示。
圖1所示為本方法實(shí)施的整體結(jié)構(gòu)和工作原理。本方法的目的是根據(jù)漏洞模型所涉及的操作 對(duì)待檢測(cè)程序進(jìn)行分析過濾。因此,需要將漏洞模型從數(shù)據(jù)庫中裝入內(nèi)存,以便在分析程序時(shí), 作為參考依據(jù);程序載入特征分析過程,根據(jù)漏洞模型相關(guān)操作的信息抽取需要的操作,完成對(duì) 程序的抽象,得到程序特征序列。
圖2表示漏洞模型載入流程。漏洞模型由漏洞狀態(tài)機(jī)的狀態(tài)結(jié)點(diǎn)、有向邊的集合所構(gòu)成。狀 態(tài)結(jié)點(diǎn)有起始、中間過渡和漏洞識(shí)別等3種類型,每個(gè)狀態(tài)結(jié)點(diǎn)具有狀態(tài)號(hào)、類型和描述等屬性。 有向邊表示引起狀態(tài)變化的操作,每個(gè)有向邊具有邊號(hào)、類型、原狀態(tài)、新狀態(tài)和描述等屬性。 狀態(tài)結(jié)點(diǎn)、有向邊的集合分別存儲(chǔ)在數(shù)據(jù)庫中的一個(gè)表中狀態(tài)結(jié)點(diǎn)表和有向邊表。為方便模型 檢測(cè)處理,在內(nèi)存中建立由有向邊類型進(jìn)行檢索的操作轉(zhuǎn)換表。每個(gè)類型的有向邊對(duì)應(yīng)一個(gè)鏈表, 鏈表的結(jié)點(diǎn)為一個(gè)有向邊,表示一個(gè)原狀態(tài)到新狀態(tài)的轉(zhuǎn)換關(guān)系。
步驟20是初始動(dòng)作。步驟21在數(shù)據(jù)庫有向邊表中取一個(gè)有向邊的記錄。步驟22若取到轉(zhuǎn)
步驟23,否則,轉(zhuǎn)步驟26。步驟23判斷取得有向邊類型的操作轉(zhuǎn)換表頭是否已存在。若己存在 轉(zhuǎn)步驟24,否則,轉(zhuǎn)步驟25。步驟24創(chuàng)建一個(gè)有向邊結(jié)點(diǎn),結(jié)點(diǎn)的皿為該有向邊的邊號(hào)。把 此結(jié)點(diǎn)連接到對(duì)應(yīng)有向邊類型的鏈表尾部,轉(zhuǎn)步驟21。步驟25創(chuàng)建該有向邊類型的操作轉(zhuǎn)換表 頭,創(chuàng)建一個(gè)有向邊結(jié)點(diǎn),結(jié)點(diǎn)的,為該有向邊的邊號(hào)。把此結(jié)點(diǎn)作為該有向邊類型的第一個(gè) 結(jié)點(diǎn),轉(zhuǎn)步驟21。步驟26是結(jié)束,操作轉(zhuǎn)換表建立完成。
圖3表示程序載入和特征提取流程。把程序控制流圖中與漏洞狀態(tài)相關(guān)的信息,即操作序列 提取出來,并以函數(shù)為單位進(jìn)行組織。每個(gè)函數(shù)組織一個(gè)操作序列鏈表,鏈表的結(jié)點(diǎn)為一個(gè)與漏 洞狀態(tài)相關(guān)的操作或函數(shù)。 一方面過濾去除與漏洞檢測(cè)無關(guān)的語句,另一方面,使函數(shù)簡(jiǎn)化控制 流到語句級(jí),并使操作序列化,便于檢測(cè)處理。
步驟30是初始動(dòng)作。步驟31在程序控制流圖中選取一個(gè)函數(shù)f構(gòu)造其數(shù)據(jù)結(jié)構(gòu)。步驟32 創(chuàng)建該函數(shù)的語句塊鏈表表頭(此時(shí)表頭也是鏈表表尾),以及操作序列鏈表表頭。步驟33語句 塊鏈表當(dāng)前語句塊向后移一次。開始時(shí)當(dāng)前語句塊指(移)向?yàn)楹瘮?shù)的頭語句塊。步驟34若語 句塊為空,則轉(zhuǎn)步驟3d,否則轉(zhuǎn)步驟35。步驟35進(jìn)行當(dāng)前語句塊的分析提取處理,處理流程見 圖4。步驟36判斷當(dāng)前語句塊的后繼是否是順序結(jié)構(gòu)。是則轉(zhuǎn)步驟37,否則轉(zhuǎn)步驟38。步驟37 取出順序結(jié)構(gòu)的下一后繼語句塊放入語句塊鏈表表尾,后繼語句塊置標(biāo)記DONE (值為1)。若后 繼語句塊己標(biāo)記DONE,不再放入。轉(zhuǎn)步驟3d。步驟38判斷當(dāng)前語句塊的后繼是否是if結(jié)構(gòu)。 是則轉(zhuǎn)步驟39,否則轉(zhuǎn)步驟3a。步驟39取出if語句為真和為假時(shí)的后繼語句塊依次放入語句 塊鏈表表尾,后繼語句塊置標(biāo)記D0NE。若后繼語句塊已標(biāo)記DONE,不再放入。轉(zhuǎn)步驟3d。步驟 3a判斷當(dāng)前語句塊的后繼是否是switch結(jié)構(gòu)。是則轉(zhuǎn)步驟3b,否則轉(zhuǎn)步驟3d。步驟3b取出switch 分支語句中的一個(gè)語句塊放入語句塊鏈表表尾,分支后繼語句塊置標(biāo)記D0NE。若后繼語句塊己標(biāo) 記D0NE,不再放入。步驟3c對(duì)取出的switch分支語句判斷是否所有語句塊都已處理完畢。是則 轉(zhuǎn)步驟3d,否則轉(zhuǎn)步驟3b。步驟3d若語句塊鏈表當(dāng)前語句塊已是鏈尾(此時(shí)函數(shù)的操作序列鏈 表已經(jīng)建成),轉(zhuǎn)步驟3e,否則轉(zhuǎn)步驟33。步驟3e判斷是否所有函數(shù)已處理完。是則轉(zhuǎn)步驟3f , 否則轉(zhuǎn)步驟31。步驟3f將全部函數(shù)的鏈表寫入磁盤保存。步驟3g為結(jié)束。此時(shí),所有函數(shù)的操 作序列鏈表己經(jīng)建立完成,可以作為操作序列分析之用。
圖4表示一個(gè)語句塊的語句操作提取處理流程。步驟40是初始動(dòng)作。步驟41順序取出該語 句塊的一條語句為當(dāng)前語句。步驟42若取到轉(zhuǎn)步驟43,否則轉(zhuǎn)步驟45。步驟43判斷該語句操 作是否在漏洞狀態(tài)機(jī)操作集合中(操作存在于有向邊表之中)或?yàn)楹瘮?shù)調(diào)用,是則轉(zhuǎn)步驟44,否 則轉(zhuǎn)步驟41。步驟44創(chuàng)建該語句操作的操作鏈表結(jié)點(diǎn),結(jié)點(diǎn)的類型為語句的操作或函數(shù)名。并 連接該結(jié)點(diǎn)到該函數(shù)的操作序列鏈表尾部。轉(zhuǎn)步驟41。步驟45—個(gè)語句塊處理結(jié)束。
權(quán)利要求
1、用于軟件漏洞模型檢測(cè)的程序特征提取方法,其特征是包括如下步驟1)漏洞模型從數(shù)據(jù)庫中載入內(nèi)存,在分析程序時(shí),作為參考依據(jù),建立漏洞模型的數(shù)據(jù)結(jié)構(gòu);2)程序載入特征分析提取流程,對(duì)經(jīng)過gcc編譯的軟件代碼進(jìn)行抽象,根據(jù)漏洞模型相關(guān)操作的信息抽取需要的操作,完成對(duì)程序的抽象,得到程序特征序列,即構(gòu)造用于漏洞模型檢測(cè)的程序特征序列。所述漏洞模型載入流程漏洞模型由漏洞狀態(tài)的狀態(tài)結(jié)點(diǎn)、有向邊的集合所構(gòu)成;狀態(tài)結(jié)點(diǎn)有啟始、中間過渡和漏洞識(shí)別3種類型,每個(gè)狀態(tài)結(jié)點(diǎn)具有狀態(tài)號(hào)、類型和描述等屬性;有向邊表示引起狀態(tài)變化的操作,每個(gè)有向邊具有邊號(hào)、類型、原狀態(tài)、新狀態(tài)和描述等屬性;狀態(tài)結(jié)點(diǎn)、有向邊的集合分別存儲(chǔ)在數(shù)據(jù)庫中的一個(gè)表中狀態(tài)結(jié)點(diǎn)表和有向邊表;為方便模型檢測(cè)處理,在內(nèi)存中建立由有向邊類型進(jìn)行檢索的操作轉(zhuǎn)換表;每個(gè)類型的有向邊對(duì)應(yīng)一個(gè)鏈表,鏈表的結(jié)點(diǎn)為一個(gè)有向邊,表示一個(gè)原狀態(tài)到新狀態(tài)的轉(zhuǎn)換關(guān)系;程序載入和特征提取流程把程序控制流圖中與漏洞狀態(tài)相關(guān)的信息,即操作序列提取出來,并以函數(shù)為單位進(jìn)行組織,進(jìn)行提取與漏洞模型相關(guān)的操作序列的流程每個(gè)函數(shù)程序特征對(duì)應(yīng)一個(gè)操作序列鏈表,程序特征鏈表以函數(shù)為單位進(jìn)行組織,操作序列鏈表的結(jié)點(diǎn)為一個(gè)與漏洞狀態(tài)相關(guān)的操作或函數(shù);函數(shù)程序特征載入時(shí),將磁盤中程序特征鏈表裝入內(nèi)存,初始函數(shù)處理標(biāo)志為INI(值為0);每個(gè)函數(shù)組織一個(gè)操作序列鏈表,鏈表的結(jié)點(diǎn)為一個(gè)與漏洞狀態(tài)相關(guān)的操作或函數(shù)。一方面過濾去除與漏洞檢測(cè)無關(guān)的語句,另一方面,使函數(shù)簡(jiǎn)化控制流到語句級(jí),并使操作序列化,便于檢測(cè)處理。
2、 根據(jù)權(quán)利要求1所述的用于軟件漏洞模型檢測(cè)的程序特征提取方法,其特征是在內(nèi)存中 建立由有向邊類型進(jìn)行檢索的操作轉(zhuǎn)換表的流程步驟20:初始動(dòng)作;步驟21:在數(shù)據(jù)庫有向 邊表中取一個(gè)有向邊的記錄;步驟22:若取到記錄轉(zhuǎn)步驟23,否則,轉(zhuǎn)步驟26;步驟23:判斷 取得有向邊類型的操作轉(zhuǎn)換表頭是否已存在,若已存在轉(zhuǎn)步驟24,否則,轉(zhuǎn)步驟25;步驟24: 創(chuàng)建一個(gè)有向邊結(jié)點(diǎn),結(jié)點(diǎn)的逸f為該有向邊的邊號(hào);把此結(jié)點(diǎn)連接到對(duì)應(yīng)有向邊類型的鏈表尾部,轉(zhuǎn)步驟21,直到在數(shù)據(jù)庫有向邊表中取完有向邊的記錄;步驟25:創(chuàng)建該有向邊類型的操 作轉(zhuǎn)換表頭,創(chuàng)建一個(gè)有向邊結(jié)點(diǎn),結(jié)點(diǎn)的邊號(hào)為該有向邊的邊號(hào);把此結(jié)點(diǎn)作為該有向邊類型 的第一個(gè)結(jié)點(diǎn),轉(zhuǎn)步驟21;直到在數(shù)據(jù)庫有向邊表中取完有向邊的記錄;步驟26:結(jié)束,操作 轉(zhuǎn)換表建立完成;
3、 根據(jù)權(quán)利要求1所述的用于軟件漏洞模型檢測(cè)的程序特征提取方法,其特征是程序載入 和特征提取流程的步驟步驟30:初始動(dòng)作;步驟31:在程序控制流圖中選取一個(gè)函數(shù)f構(gòu)造 其數(shù)據(jù)結(jié)構(gòu);步驟32:創(chuàng)建該函數(shù)的語句塊鏈表表頭(此時(shí)表頭也是鏈表表尾),以及操作序列 鏈表表頭;步驟33:語句塊鏈表當(dāng)前語句塊向后移一次,開始時(shí)當(dāng)前語句塊指(移)向?yàn)楹瘮?shù)的 頭語句塊;步驟34:若語句塊為空,則轉(zhuǎn)步驟3d,否則轉(zhuǎn)步驟35;步驟35:進(jìn)行當(dāng)前語句塊的 分析提取流程(圖4);步驟36:判斷當(dāng)前語句塊的后繼是否是順序結(jié)構(gòu),是則轉(zhuǎn)步驟37,否則 轉(zhuǎn)步驟38;步驟37:取出順序結(jié)構(gòu)的下一后繼語句塊放入語句塊鏈表表尾,后繼語句塊置標(biāo)記 DONE (值為l);若后繼語句塊已標(biāo)記DONE,不再放入,轉(zhuǎn)步驟3d;步驟38:判斷當(dāng)前語句塊的 后繼是否是if結(jié)構(gòu),是則轉(zhuǎn)步驟39,否則轉(zhuǎn)步驟3a;步驟39:取出if語句為真和為假時(shí)的后 繼語句塊依次放入語句塊鏈表表尾,后繼語句塊置標(biāo)記DONE;若后繼語句塊己標(biāo)記DONE,不再 放入,轉(zhuǎn)步驟3d;步驟3a:判斷當(dāng)前語句塊的后繼是否是switch結(jié)構(gòu),是則轉(zhuǎn)步驟3b,否則轉(zhuǎn) 步驟3d;步驟3b:取出switch分支語句中的一個(gè)語句塊放入語句塊鏈表表尾,分支后繼語句塊置標(biāo)記D0NE;若后繼語句塊已標(biāo)記DONE,不再放入;步驟3c:對(duì)取出的switch分支語句判斷是否所有語句塊都已處理完畢,是則轉(zhuǎn)步驟3d,否則轉(zhuǎn)步驟3b;步驟3d:若語句塊鏈表當(dāng)前語句塊已是鏈尾(此時(shí)函數(shù)的操作序列鏈表已經(jīng)建成),轉(zhuǎn)步驟3e,否則轉(zhuǎn)步驟33;步驟3e:判斷是否所有函數(shù)己處理完,是則轉(zhuǎn)步驟3f,否則轉(zhuǎn)步驟31;步驟3f:將全部函數(shù)的鏈表寫入磁盤保 存;步驟3g:所有函數(shù)的操作序列鏈表已經(jīng)建立完成,可以作為操作序列分析之用,結(jié)束。
4、根據(jù)權(quán)利要求1所述的用于軟件漏洞模型檢測(cè)的程序特征提取方法,其特征是語句操作 提取處理流程步驟40:初始動(dòng)作;步驟41:順序取出該語句塊的一條語句為當(dāng)前語句;步驟 42:若取到轉(zhuǎn)步驟43,否則轉(zhuǎn)步驟45;步驟43:判斷該語句操作是否在漏洞狀態(tài)機(jī)操作集合中 (操作存在于有向邊表之中)或?yàn)楹瘮?shù)調(diào)用,是則轉(zhuǎn)步驟44,否則轉(zhuǎn)步驟41;步驟44:創(chuàng)建該 語句操作的操作鏈表結(jié)點(diǎn),結(jié)點(diǎn)的類型為語句的操作或函數(shù)名;并連接該結(jié)點(diǎn)到該函數(shù)的操作序 列鏈表尾部,轉(zhuǎn)步驟41;步驟45: —個(gè)語句塊處理結(jié)束。
全文摘要
用于軟件漏洞模型檢測(cè)的程序特征提取方法,如下步驟1)漏洞模型從數(shù)據(jù)庫中載入內(nèi)存,在分析程序時(shí),作為參考依據(jù),建立漏洞模型的數(shù)據(jù)結(jié)構(gòu);2)程序載入特征分析提取流程,對(duì)經(jīng)過gcc編譯的軟件代碼進(jìn)行抽象,根據(jù)漏洞模型相關(guān)操作的信息抽取需要的操作,得到程序特征序列,即構(gòu)造用于漏洞模型檢測(cè)的程序特征序列。所述漏洞模型載入流程漏洞模型由漏洞狀態(tài)的狀態(tài)結(jié)點(diǎn)、有向邊的集合所構(gòu)成;程序載入和特征提取流程把程序控制流圖中與漏洞狀態(tài)相關(guān)的信息;進(jìn)行提取與漏洞模型相關(guān)的操作序列的流程每個(gè)函數(shù)程序特征對(duì)應(yīng)一個(gè)操作序列鏈表,程序特征鏈表以函數(shù)為單位進(jìn)行組織,操作序列鏈表的結(jié)點(diǎn)為一個(gè)與漏洞狀態(tài)相關(guān)的操作或函數(shù)。
文檔編號(hào)G06F21/00GK101388055SQ200810155449
公開日2009年3月18日 申請(qǐng)日期2008年10月22日 優(yōu)先權(quán)日2008年10月22日
發(fā)明者林 張, 曾慶凱 申請(qǐng)人:南京大學(xué)