專利名稱:一種用于漏洞檢測(cè)的可調(diào)對(duì)象程序特征提取方法
技術(shù)領(lǐng)域:
本發(fā)明涉及軟件工程技術(shù)領(lǐng)域,尤其是涉及對(duì)軟件的檢測(cè)方法。
背景技術(shù):
軟件因存在著隱藏的安全漏洞而易受攻擊造成損失,其安全威脅有不斷增加的趨勢(shì)。通過對(duì)軟件代碼進(jìn)行漏洞檢測(cè),發(fā)現(xiàn)和消除軟件中的安全漏洞是減少安全威脅、降低安全風(fēng)險(xiǎn)的重要手段之一。漏洞模型檢測(cè)是一種具有代表性的代碼漏洞檢測(cè)方法。為此,我們提出一種用于漏洞檢測(cè)的可調(diào)對(duì)象程序狀態(tài)特征提取方法,以供對(duì)待檢測(cè)程序代碼進(jìn)行狀態(tài)抽象建模、建立用于漏洞檢測(cè)的程序狀態(tài)特征模型。目前的漏洞模型軟件漏洞檢測(cè)方法在檢測(cè)過程中存在著重復(fù)檢查、檢查關(guān)注重點(diǎn)不集中、不夠準(zhǔn)確等缺點(diǎn),檢測(cè)的速度和準(zhǔn)確性顯得不足,影響著檢測(cè)方法的適用性。
發(fā)明內(nèi)容
本發(fā)明目的是,提出一種用于漏洞檢測(cè)的程序狀態(tài)特征提取方法,該方法避免采用原有方法模擬程序執(zhí)行流程的檢測(cè)順序,只提取與漏洞模型檢測(cè)相關(guān)的可調(diào)對(duì)象程序狀態(tài)特征,注重對(duì)可能存在潛在漏洞的重點(diǎn)狀態(tài)的檢測(cè),以提高軟件漏洞檢測(cè)的速度和準(zhǔn)確性。為實(shí)現(xiàn)本發(fā)明的所述目的,本發(fā)明提出的技術(shù)方案是,一種用于軟件漏洞檢測(cè)、可調(diào)對(duì)象程序特征提取方法,其步驟包括I)漏洞模型載入流程,建立漏洞模型的數(shù)據(jù)結(jié)構(gòu);2)程序載入和狀態(tài)特征分析提取流程,對(duì)經(jīng)過gcc編譯的軟件代碼進(jìn)行抽象,構(gòu)造用于漏洞檢測(cè)的、可調(diào)對(duì)象的程序狀態(tài)特征序列。將漏洞模型從數(shù)據(jù)庫中裝入內(nèi)存,以便在分析程序時(shí),作為參考依據(jù)。程序載入和狀態(tài)特征分析過程,根據(jù)漏洞模型相關(guān)操作的信息抽取必要的程序狀態(tài)序列,完成對(duì)程序的抽象建模,得到漏洞相關(guān)的程序狀態(tài)特征,即可調(diào)對(duì)象的的狀態(tài)特征序列。漏洞模型由漏洞相關(guān)操作的集合構(gòu)成。操作表示引起狀態(tài)發(fā)生變化的動(dòng)作,每個(gè)操作具有操作號(hào)、動(dòng)作、特征、輸入變量與輸出變量的集合等屬性。操作的動(dòng)作指具體的程序動(dòng)作;操作的特征有產(chǎn)生、轉(zhuǎn)移、刷新和使用等值??烧{(diào)對(duì)象指程序中漏洞相關(guān)操作所涉及的需分析和檢測(cè)的變量,輸入變量和輸出變量都是可調(diào)對(duì)象。操作的集合存儲(chǔ)在數(shù)據(jù)庫中的一個(gè)表中即操作關(guān)系表。為方便模型檢測(cè)處理,在內(nèi)存中建立由操作動(dòng)作進(jìn)行檢索的操作變量關(guān)系表。每個(gè)操作動(dòng)作對(duì)應(yīng)一個(gè)鏈表,鏈表的結(jié)點(diǎn)為一個(gè)輸入輸出關(guān)系,表示一個(gè)輸出變量與其輸入變量的關(guān)系。程序載入和狀態(tài)特征提取流程,把程序控制流圖中與漏洞狀態(tài)相關(guān)的程序狀態(tài)特征信息,即程序可調(diào)變量的狀態(tài)序列提取出來,并以函數(shù)為單位進(jìn)行組織;每個(gè)函數(shù)組織成若干個(gè)由可調(diào)對(duì)象索引的操作狀態(tài)序列鏈表。本發(fā)明的有益效果是,實(shí)現(xiàn)面向基于漏洞模型的軟件漏洞模型檢測(cè)的目標(biāo),針對(duì)目前軟件漏洞檢測(cè)方法存在大量重復(fù)工作、檢查和關(guān)注目標(biāo)過于寬泛、影響檢測(cè)速度、以及狀態(tài)分析不準(zhǔn)確的問題,基于軟件漏洞的狀態(tài)模型,利用控制流圖和數(shù)據(jù)流分析技術(shù),以重點(diǎn)外部可調(diào)對(duì)象為中心,提取與軟件漏洞的狀態(tài)模型相關(guān)的程序狀態(tài)特征,對(duì)軟件代碼進(jìn)行抽象建模,可用于對(duì)其進(jìn)行漏洞靜態(tài)檢測(cè),以判斷漏洞模型在代碼中的存在。本發(fā)明避免采用原有方法模擬程序執(zhí)行流程的檢測(cè)順序,只提取與漏洞模型檢測(cè)相關(guān)的可調(diào)對(duì)象程序狀態(tài)特征,注重對(duì)可能存在潛在漏洞的重點(diǎn)狀態(tài)的檢測(cè),大大提高軟件漏洞檢測(cè)的速度和準(zhǔn)確性。
圖
圖
圖
圖
圖
圖
I用于漏洞模型檢測(cè)的程序狀態(tài)特征提取示意圖2為漏洞模型載入流程3為程序載入狀態(tài)特征提取流程4為函數(shù)程序狀態(tài)特征提取流程5為語句塊的語句狀態(tài)提取處理流程6為函數(shù)調(diào)用語句處理流程圖。
具體實(shí)施例方式本發(fā)明方法工作流程如圖I-圖6所示。圖I所示為本方法實(shí)施的整體結(jié)構(gòu)和工作原理。本方法的目的是根據(jù)漏洞模型所涉及的操作對(duì)待檢測(cè)程序進(jìn)行狀態(tài)分析和過濾,得到與漏洞檢測(cè)相關(guān)的程序狀態(tài)特征。為提高處理速度,需要將漏洞模型從數(shù)據(jù)庫中裝入內(nèi)存,以便在分析程序時(shí),作為參考依據(jù)。程序載入和狀態(tài)特征分析過程,根據(jù)漏洞模型相關(guān)操作的信息抽取必要的程序狀態(tài)序列,完成對(duì)程序的抽象建模,得到漏洞相關(guān)的程序狀態(tài)特征,即可調(diào)對(duì)象的的狀態(tài)特征序列。圖2表示漏洞模型載入流程。漏洞模型由漏洞相關(guān)操作的集合構(gòu)成。操作表示引起狀態(tài)發(fā)生變化的動(dòng)作,每個(gè)操作具有操作號(hào)、動(dòng)作、特征、輸入變量與輸出變量的集合等屬性。操作的動(dòng)作指具體的程序動(dòng)作。操作的特征有產(chǎn)生、轉(zhuǎn)移、刷新和使用等值??烧{(diào)對(duì)象指程序中漏洞相關(guān)操作所涉及的需分析和檢測(cè)的變量,輸入變量和輸出變量都是可調(diào)對(duì)象。操作的集合存儲(chǔ)在數(shù)據(jù)庫中的一個(gè)表中操作關(guān)系表。為方便模型檢測(cè)處理,在內(nèi)存中建立由操作動(dòng)作進(jìn)行檢索的操作變量關(guān)系表。每個(gè)操作動(dòng)作對(duì)應(yīng)一個(gè)鏈表,鏈表的結(jié)點(diǎn)為一個(gè)輸入輸出關(guān)系,表示一個(gè)輸出變量與其輸入變量的關(guān)系。具體步驟如下。步驟20是起始狀態(tài);步驟21在數(shù)據(jù)庫的操作關(guān)系表中依次取一個(gè)操作關(guān)系頭的記錄;步驟22判斷是否取到一個(gè)操作關(guān)系頭的記錄,若取到轉(zhuǎn)步驟23,否則轉(zhuǎn)步驟27 ;步驟23創(chuàng)建該操作動(dòng)作的操作變量關(guān)系表表頭,根據(jù)輸出變量數(shù)目,創(chuàng)建輸出變量指針鏈;步驟24在數(shù)據(jù)庫操作關(guān)系表中依次取該操作的輸出變量關(guān)系的記錄;步驟25判斷是否取到該操作的輸出變量關(guān)系的記錄;若取到轉(zhuǎn)步驟26,否則轉(zhuǎn)步驟21 ;步驟26創(chuàng)建一個(gè)輸入輸出關(guān)系結(jié)點(diǎn),用讀取的內(nèi)容設(shè)置結(jié)點(diǎn)的輸出變量與其輸入變量;判斷是否把相應(yīng)的輸出變量指針指向此結(jié)點(diǎn),是轉(zhuǎn)步驟27,否則轉(zhuǎn)步驟24。步驟27為結(jié)束狀態(tài),操作變量關(guān)系表建立完成。圖3表示程序載入和狀態(tài)特征提取流程。把程序控制流圖中與漏洞狀態(tài)相關(guān)的程序狀態(tài)特征信息,即程序可調(diào)對(duì)象的狀態(tài)序列提取出來,并以函數(shù)為單位進(jìn)行組織。每個(gè)函數(shù)組織成若干個(gè)由可調(diào)對(duì)象索引的操作狀態(tài)序列鏈表。狀態(tài)序列鏈表的每個(gè)結(jié)點(diǎn)表示一個(gè) 與漏洞狀態(tài)相關(guān)的可調(diào)對(duì)象的變量狀態(tài)。一方面使函數(shù)簡(jiǎn)化為漏洞檢測(cè)所關(guān)注的相關(guān)變量集合,另一方面,過濾去除與漏洞檢測(cè)無關(guān)的變量狀態(tài),并使其序列化,便于檢測(cè)處理。程序狀態(tài)特征提取處理從main函數(shù)開始進(jìn)行,其流程如下。步驟31是起始狀態(tài)。步驟32為初始化處理設(shè)置所有函數(shù)的訪問標(biāo)記為OFF(值為O);置提取處理函數(shù)為函數(shù)main,函數(shù)調(diào)用可調(diào)對(duì)象集合為空。步驟33對(duì)提取處理函數(shù)進(jìn)行函數(shù)程序狀態(tài)特征提取。處理流程見圖4。步驟34存儲(chǔ)提取的程序狀態(tài)特征到磁盤。將全部函數(shù)的程序狀態(tài)特征,包括可調(diào)對(duì)象集合及其操作狀態(tài)序列寫入磁盤保存。步驟35為結(jié)束狀態(tài)。此時(shí),所有函數(shù)的操作狀態(tài)序列已經(jīng)建立完成,可以作為程序操作狀態(tài)序列分析之用。圖4為函數(shù)程序狀態(tài)特征提取流程圖,表示對(duì)處理函數(shù)進(jìn)行函數(shù)程序狀態(tài)特征提取的過程。步驟40是起始狀態(tài)。步驟41在程序控制流圖中取出處理函數(shù)并構(gòu)造其數(shù)據(jù)結(jié)構(gòu)。步驟41a判斷處理函數(shù)的訪問標(biāo)記為ON(值為I)。是則轉(zhuǎn)步驟4f;否則轉(zhuǎn)步驟42。步驟42函數(shù)處理初始化創(chuàng)建該函數(shù)的語句塊鏈表表頭(此時(shí)表頭也是鏈表表尾),以及操作狀態(tài)序列鏈表表頭。為函數(shù)的輸入可調(diào)對(duì)象集合中每個(gè)可調(diào)對(duì)象(為原始對(duì)象),建立原始對(duì)象的操作狀態(tài)序列(初始無結(jié)點(diǎn))和關(guān)聯(lián)集合(初始化為空)。步驟43語句塊鏈表當(dāng)前語句塊向后移一次,而首次執(zhí)行時(shí)使當(dāng)前語句塊指向函數(shù)的頭語句塊。步驟44判斷語句塊是否為空。是則轉(zhuǎn)步驟4d,否則轉(zhuǎn)步驟45。步驟45進(jìn)行當(dāng)前語句塊的分析狀態(tài)提取處理,處理流程見圖5。步驟46判斷當(dāng)前語句塊的后繼是否是順序結(jié)構(gòu)。是則轉(zhuǎn)步驟47,否則轉(zhuǎn)步驟48。步驟47取出順序結(jié)構(gòu)的下一后繼語句塊放入語句塊鏈表表尾,后繼語句塊置標(biāo)記DONE (值為I)。若后繼語句塊已標(biāo)記DONE,不再放入。轉(zhuǎn)步驟4d。步驟48判斷當(dāng)前語句塊的后繼是否是if結(jié)構(gòu)。是則轉(zhuǎn)步驟49,否則轉(zhuǎn)步驟4a。步驟49對(duì)條件表達(dá)式提取變量集合(稱為刷新變量集合)。取出if語句為真和為假時(shí)的后繼語句塊,并將刷新變量集合加鏈接到后繼語句塊,依次放入語句塊鏈表表尾,后繼語句塊置標(biāo)記DONE。若后繼語句塊已標(biāo)記DONE,不再放入。轉(zhuǎn)步驟4d。步驟4a判斷當(dāng)前語句塊的后繼是否是switch結(jié)構(gòu)。是則轉(zhuǎn)步驟4b,否則轉(zhuǎn)步驟4d。步驟4b取出switch分支語句中的一個(gè)語句塊放入語句塊鏈表表尾,分支后繼語句塊置標(biāo)記DONE。若后繼語句塊已標(biāo)記D0NE,不再放入。步驟4c對(duì)取出的switch分支語句判斷是否所有語句塊都已處理完畢。是則轉(zhuǎn)步驟4d,否則轉(zhuǎn)步驟4b。步驟4d判斷語句塊鏈表當(dāng)前語句塊是否是鏈尾(此時(shí)函數(shù)的操作狀態(tài)序列鏈表已經(jīng)建成)。是則轉(zhuǎn)步驟4e,否則轉(zhuǎn)步驟43。步驟4e創(chuàng)建該操作動(dòng)作的操作變量關(guān)系表表頭,創(chuàng)建輸出變量指針鏈。步驟4el取得傳遞變量中函數(shù)形參為輸出變量,取得則步驟4e2,否則步驟4e3。步驟4e2創(chuàng)建一個(gè)輸出變量關(guān)系結(jié)點(diǎn),以輸出變量狀態(tài)設(shè)置此結(jié)點(diǎn),把相應(yīng)的輸出變量指針指向此結(jié)點(diǎn),轉(zhuǎn)步驟4el。步驟4e3設(shè)置處理函數(shù)的訪問標(biāo)記為ON(值為I)。步驟4f為函數(shù)處理結(jié)束狀態(tài)。此時(shí),提取處理函數(shù)的可調(diào)對(duì)象集合及其操作狀態(tài)序列鏈表已經(jīng)建立完成。圖5表示一個(gè)語句塊的語句操作狀態(tài)提取處理流程。步驟50是起始狀態(tài)。步驟51順序取出該語句塊的一條語句為當(dāng)前語句。步驟52判斷是否取到。若取到轉(zhuǎn)步驟53,否則轉(zhuǎn)步驟5e。步驟53查操作變量關(guān)系表,判斷該語句是否為產(chǎn)生操作(語句為操作變量關(guān)系表中操作且操作的特征為產(chǎn)生)。是則轉(zhuǎn)步驟53a,否則轉(zhuǎn)步驟55。步驟53a該操作的輸出變量為新產(chǎn)生的可調(diào)對(duì)象(為原始對(duì)象)。判斷新產(chǎn)生的原始對(duì)象是否已在本地可調(diào)對(duì)象集合中。是則轉(zhuǎn)步驟55,否則轉(zhuǎn)步驟54。步驟54將該原始對(duì)象加入到函數(shù)的本地可調(diào)對(duì)象集合中;建立該原始對(duì)象的操作狀態(tài)序列,操作狀態(tài)序列的首結(jié)點(diǎn)輸入和輸出項(xiàng)同為自己,操作為本語句的操作;建立該原始對(duì)象的關(guān)聯(lián)集合,且初始化為空。轉(zhuǎn)步驟55。步驟55判斷該語句操作是否為漏洞狀態(tài)相關(guān)操作(語句為操作變量關(guān)系表中操作且操作的特征為非產(chǎn)生)。是則轉(zhuǎn)步驟56,否則轉(zhuǎn)步驟59。步驟56根據(jù)本語句操作查操作變量關(guān)系表,依次取得一個(gè)輸出變量,是則步驟56a,否則轉(zhuǎn)步驟59。步驟56a查判斷輸出變量的輸入變量是否屬于語句塊的刷新變量集合,是則步驟56,否則轉(zhuǎn)步驟57。步驟57判斷輸出變量是否已在本地可調(diào)對(duì)象集合中。是則轉(zhuǎn)步驟58a,否則轉(zhuǎn)步驟58。步驟58將該輸出變量加入到函數(shù)的本地可調(diào)對(duì)象集合中;建立該可調(diào)對(duì)象的操作狀態(tài)序列,根據(jù)輸出變量關(guān)系設(shè)置操作狀態(tài)序列的首結(jié)點(diǎn),操作為本語句的操作。找到輸入變量所屬的原始對(duì)象,加入輸出變量到原始對(duì)象的關(guān)聯(lián)集合中。轉(zhuǎn)步驟56。步驟58a根據(jù)輸出變量關(guān)系,建立并設(shè)置相應(yīng)輸入輸出關(guān)系結(jié)點(diǎn),并鏈接到該可調(diào)對(duì)象的操作狀態(tài)序列。轉(zhuǎn)步驟56。步驟59判斷該語句是否為函數(shù)調(diào)用。是則轉(zhuǎn)步驟5a,否則轉(zhuǎn)步驟5b。步驟5a函數(shù)調(diào)用語句處理,處理流程見圖6,轉(zhuǎn)步驟5b。步驟5b轉(zhuǎn)步驟51。步驟5e為結(jié)束狀態(tài),一個(gè)語句塊處理結(jié)束。圖6為函數(shù)調(diào)用語句處理流程,表示函數(shù)調(diào)用語句操作狀態(tài)提取處理的過程。即步驟5a函數(shù)調(diào)用語句處理流程步驟60是起始狀態(tài)。步驟60a判斷若處理函數(shù)的訪問標(biāo)記是否為0N,則步驟60b,否則步驟61 ;步驟60b查操作變量關(guān)系表,得輸入輸出關(guān)系集合;依次更新輸出變量的狀態(tài),建立并設(shè)置相應(yīng)的操作狀態(tài)序列結(jié)點(diǎn),并鏈接到輸出變量的操作狀態(tài)序列;轉(zhuǎn)步驟69 ;步驟61函數(shù)調(diào)用輸入可調(diào)對(duì)象集合初始化為空;步驟62順序取調(diào)用函數(shù)的一個(gè)參數(shù);步驟63判斷是否取到,若沒取到,則轉(zhuǎn)步驟67 ;步驟64判斷參數(shù)是否在可調(diào)對(duì)象集合中,若不是,則轉(zhuǎn)步驟62,是則轉(zhuǎn)步驟65 ;步驟65將此可調(diào)對(duì)象對(duì)應(yīng)的形參加入到函數(shù)調(diào)用輸入可調(diào)對(duì)象集合;轉(zhuǎn)步驟62 ;步驟67置提取處理函數(shù)為被調(diào)用函數(shù),輸入可調(diào)對(duì)象集合為函數(shù)調(diào)用可調(diào)對(duì)象集合;步驟68對(duì)提取處理函數(shù)進(jìn)行程序狀態(tài)特征抽取,處理流程見函數(shù)程序狀態(tài)特征提取流程(參見圖4),轉(zhuǎn)步驟69 ;步驟69是結(jié)束狀態(tài),函數(shù)調(diào)用處理結(jié)束。
權(quán)利要求
1.一種用于漏洞檢測(cè)的可調(diào)對(duì)象程序特征提取方法,其特征是包括步驟如下 1)漏洞模型載入流程,建立漏洞模型的數(shù)據(jù)結(jié)構(gòu); 2)程序載入和狀態(tài)特征分析提取流程,對(duì)經(jīng)過gcc編譯的軟件代碼進(jìn)行抽象,構(gòu)造用于漏洞檢測(cè)的、可調(diào)對(duì)象的程序狀態(tài)特征序列; 將漏洞模型從數(shù)據(jù)庫中裝入內(nèi)存,在分析程序時(shí),作為參考依據(jù)。程序載入和狀態(tài)特征分析過程,根據(jù)漏洞模型相關(guān)操作的信息抽取必要的程序狀態(tài)序列,完成對(duì)待測(cè)程序的抽象建模,得到漏洞相關(guān)的程序狀態(tài)特征,即可調(diào)對(duì)象的的狀態(tài)特征序列; 漏洞模型由漏洞相關(guān)操作的集合構(gòu)成;操作表示引起狀態(tài)發(fā)生變化的動(dòng)作,每個(gè)操作具有操作號(hào)、動(dòng)作、特征、輸入變量與輸出變量的集合等屬性;操作的動(dòng)作指具體的程序動(dòng)作;操作的特征有產(chǎn)生、轉(zhuǎn)移、刷新和使用等值。可調(diào)對(duì)象指程序中漏洞相關(guān)操作所涉及的需分析和檢測(cè)的變量,輸入變量和輸出變量都是可調(diào)對(duì)象;操作的集合存儲(chǔ)在數(shù)據(jù)庫中的一個(gè)表中即操作關(guān)系表。
2.根據(jù)權(quán)利要求I所述的用于漏洞檢測(cè)的可調(diào)對(duì)象程序特征提取方法,其特征是為方便模型檢測(cè)處理,在內(nèi)存中建立由操作動(dòng)作進(jìn)行檢索的操作變量關(guān)系表。每個(gè)操作動(dòng)作對(duì)應(yīng)一個(gè)鏈表,鏈表的結(jié)點(diǎn)為一個(gè)輸入輸出關(guān)系,表不一個(gè)輸出變量與其輸入變量的關(guān)系;具體流程步驟20是起始狀態(tài);步驟21在數(shù)據(jù)庫的操作關(guān)系表中依次取一個(gè)操作關(guān)系頭的記錄;步驟22判斷是否取到一個(gè)操作關(guān)系頭的記錄,若取到轉(zhuǎn)步驟23,否則轉(zhuǎn)步驟27 ;步驟23創(chuàng)建該操作動(dòng)作的操作變量關(guān)系表表頭,根據(jù)輸出變量數(shù)目,創(chuàng)建輸出變量指針鏈;步驟24在數(shù)據(jù)庫操作關(guān)系表中依次取該操作的輸出變量關(guān)系的記錄;步驟25判斷是否取到該操作的輸出變量關(guān)系的記錄;若取到轉(zhuǎn)步驟26,否則轉(zhuǎn)步驟21 ;步驟26創(chuàng)建一個(gè)輸入輸出關(guān)系結(jié)點(diǎn),用讀取的內(nèi)容設(shè)置結(jié)點(diǎn)的輸出變量與其輸入變量;判斷是否把相應(yīng)的輸出變量指針指向此結(jié)點(diǎn),是轉(zhuǎn)步驟27,否則轉(zhuǎn)步驟24。步驟27為結(jié)束狀態(tài),操作變量關(guān)系表建立完成。
3.根據(jù)權(quán)利要求I或2所述的用于漏洞檢測(cè)的可調(diào)對(duì)象程序特征提取方法,其特征是程序載入和狀態(tài)特征提取流程,把程序控制流圖中與漏洞狀態(tài)相關(guān)的程序狀態(tài)特征信息,即程序可調(diào)對(duì)象的狀態(tài)序列提取出來,并以函數(shù)為單位進(jìn)行組織;每個(gè)函數(shù)組織成若干個(gè)由可調(diào)對(duì)象索引的操作狀態(tài)序列鏈表;狀態(tài)序列鏈表的每個(gè)結(jié)點(diǎn)表示一個(gè)與漏洞狀態(tài)相關(guān)的可調(diào)對(duì)象的變量狀態(tài)。一方面使函數(shù)簡(jiǎn)化為漏洞檢測(cè)所關(guān)注的相關(guān)變量集合,另一方面,過濾去除與漏洞檢測(cè)無關(guān)的變量狀態(tài),并使其序列化,便于檢測(cè)處理。
4.根據(jù)權(quán)利要求I或3所述的用于漏洞檢測(cè)的可調(diào)對(duì)象程序特征提取方法,其特征是程序狀態(tài)特征提取處理從main函數(shù)開始進(jìn)行,其流程如下步驟31是起始狀態(tài)。步驟32為初始化處理設(shè)置所有函數(shù)的訪問標(biāo)記為OFF、值為O ;置提取處理函數(shù)為函數(shù)main,函數(shù)調(diào)用可調(diào)對(duì)象集合為空;步驟33對(duì)提取處理函數(shù)進(jìn)行函數(shù)程序狀態(tài)特征提取;步驟34存儲(chǔ)提取的程序狀態(tài)特征到磁盤。將全部函數(shù)的程序狀態(tài)特征,包括可調(diào)對(duì)象集合及其操作狀態(tài)序列寫入磁盤保存;步驟35為結(jié)束狀態(tài);此時(shí),所有函數(shù)的操作狀態(tài)序列已經(jīng)建立完成,作為程序操作狀態(tài)序列分析之用。
5.根據(jù)權(quán)利要求4所述的用于漏洞檢測(cè)的可調(diào)對(duì)象程序特征提取方法,其特征是步驟·33對(duì)提取處理函數(shù)進(jìn)行函數(shù)程序狀態(tài)特征提取流程表示對(duì)處理函數(shù)進(jìn)行函數(shù)程序狀態(tài)特征提取的過程;步驟40起始狀態(tài)。步驟41在程序控制流圖中取出處理函數(shù)并構(gòu)造其數(shù)據(jù)結(jié)構(gòu);步驟41a判斷處理函數(shù)的訪問標(biāo)記為ON、值為I,是則轉(zhuǎn)步驟4f,否則轉(zhuǎn)步驟42 ;步驟42函數(shù)處理初始化創(chuàng)建該函數(shù)的語句塊鏈表表頭、此時(shí)表頭也是鏈表表尾,以及操作狀態(tài)序列鏈表表頭,為函數(shù)的輸入可調(diào)對(duì)象集合中每個(gè)可調(diào)對(duì)象、可調(diào)對(duì)象為原始對(duì)象,建立原始對(duì)象的操作狀態(tài)序列、初始時(shí)無結(jié)點(diǎn),建立原始對(duì)象的關(guān)聯(lián)集合、初始化為空;步驟43語句塊鏈表當(dāng)前語句塊向后移一次,而首次執(zhí)行時(shí)使當(dāng)前語句塊指向函數(shù)的頭語句塊;步驟44判斷語句塊是否為空,是則轉(zhuǎn)步驟4d,否則轉(zhuǎn)步驟45 ;步驟45進(jìn)行當(dāng)前語句塊的分析狀態(tài)提取處理;步驟46判斷當(dāng)前語句塊的后繼是否是順序結(jié)構(gòu),是則轉(zhuǎn)步驟47,否則轉(zhuǎn)步驟48 ;步驟47取出順序結(jié)構(gòu)的下一后繼語句塊放入語句塊鏈表表尾,后繼語句塊置標(biāo)記DONE、值為I ;若后繼語句塊已標(biāo)記DONE,不再放入。轉(zhuǎn)步驟4d。步驟48判斷當(dāng)前語句塊的后繼是否是if結(jié)構(gòu)。是則轉(zhuǎn)步驟49,否則轉(zhuǎn)步驟4a ;步驟49對(duì)條件表達(dá)式提取變量集合、稱為刷新變量集合;取出if語句為真和為假時(shí)的后繼語句塊,并將刷新變量集合加鏈接到后繼語句塊,依次放入語句塊鏈表表尾,后繼語句塊置標(biāo)記DONE。若后繼語句塊已標(biāo)記DONE,不再放入。轉(zhuǎn)步驟4d。步驟4a判斷當(dāng)前語句塊的后繼是否是switch結(jié)構(gòu)。是則轉(zhuǎn)步驟4b,否則轉(zhuǎn)步驟4d。步驟4b取出switch分支語句中的一個(gè)語句塊放入語句塊鏈表表尾,分支后繼語句塊置標(biāo)記DONE。若后繼語句塊已標(biāo)記DONE,不再放入;步驟4c對(duì)取出的switch分支語句判斷是否所有語句塊都已處理完畢 。是則轉(zhuǎn)步驟4d,否則轉(zhuǎn)步驟4b ;步驟 4d判斷語句塊鏈表當(dāng)前語句塊是否是鏈尾(此時(shí)函數(shù)的操作狀態(tài)序列鏈表已經(jīng)建成),是則轉(zhuǎn)步驟4e,否則轉(zhuǎn)步驟43 ;步驟4e創(chuàng)建該操作動(dòng)作的操作變量關(guān)系表表頭,創(chuàng)建輸出變量指針鏈;步驟4el取得傳遞變量中函數(shù)形參為輸出變量,取得則步驟4e2,否則步驟4e3 ;步驟4e2創(chuàng)建一個(gè)輸出變量關(guān)系結(jié)點(diǎn),以輸出變量狀態(tài)設(shè)置此結(jié)點(diǎn),把相應(yīng)的輸出變量指針指向此結(jié)點(diǎn),轉(zhuǎn)步驟4el ;步驟4e3設(shè)置處理函數(shù)的訪問標(biāo)記為ON、值為I ;步驟4f為函數(shù)處理結(jié)束狀態(tài);此時(shí),提取處理函數(shù)的可調(diào)對(duì)象集合及其操作狀態(tài)序列鏈表已經(jīng)建立完成。
6.根據(jù)權(quán)利要求5所述的用于漏洞檢測(cè)的可調(diào)對(duì)象程序特征提取方法,其特征是步驟45進(jìn)行當(dāng)前語句塊的分析狀態(tài)提取處理流程的具體步驟步驟50起始狀態(tài)。步驟51順序取出該語句塊的一條語句為當(dāng)前語句;步驟52判斷是否取到,若取到轉(zhuǎn)步驟53,否則轉(zhuǎn)步驟5e ;步驟53查操作變量關(guān)系表,判斷該語句是否為產(chǎn)生操作、語句為操作變量關(guān)系表中操作且操作的特征為產(chǎn)生操作;是則轉(zhuǎn)步驟53a,否則轉(zhuǎn)步驟55 ;步驟53a該操作的輸出變量為新產(chǎn)生的可調(diào)對(duì)象、為原始對(duì)象;判斷新產(chǎn)生的原始對(duì)象是否已在本地可調(diào)對(duì)象集合中;是則轉(zhuǎn)步驟55,否則轉(zhuǎn)步驟54 ;步驟54將該原始對(duì)象加入到函數(shù)的本地可調(diào)對(duì)象集合中;建立該原始對(duì)象的操作狀態(tài)序列,操作狀態(tài)序列的首結(jié)點(diǎn)輸入和輸出項(xiàng)同為自己,操作為本語句的操作;建立該原始對(duì)象的關(guān)聯(lián)集合,且初始化為空;步驟55判斷該語句操作是否為漏洞狀態(tài)相關(guān)操作,語句為操作變量關(guān)系表中操作且操作的特征為非產(chǎn)生,是則轉(zhuǎn)步驟56,否則轉(zhuǎn)步驟59 ;步驟56根據(jù)本語句操作查操作變量關(guān)系表,判斷是否依次取得一個(gè)輸出變量,是則步驟56a,否則轉(zhuǎn)步驟59 ;步驟56a判斷輸出變量的輸入變量是否屬于語句塊的刷新變量集合,是則轉(zhuǎn)步驟56,否則轉(zhuǎn)步驟57 ;步驟57判斷輸出變量是否已在本地可調(diào)對(duì)象集合中,是則轉(zhuǎn)步驟58a,否則轉(zhuǎn)步驟58 ;步驟58將該輸出變量加入到函數(shù)的本地可調(diào)對(duì)象集合中;建立該可調(diào)對(duì)象的操作狀態(tài)序列,根據(jù)輸出變量關(guān)系設(shè)置操作狀態(tài)序列的首結(jié)點(diǎn),操作為本語句的操作;找到輸入變量所屬的原始對(duì)象,加入輸出變量到原始對(duì)象的關(guān)聯(lián)集合中,轉(zhuǎn)步驟56 ;步驟58a根據(jù)輸出變量關(guān)系,建立并設(shè)置相應(yīng)輸入輸出關(guān)系結(jié)點(diǎn),并鏈接到該可調(diào)對(duì)象的操作狀態(tài)序列,轉(zhuǎn)步驟56 ;步驟59判斷該語句是否為函數(shù)調(diào)用,是則轉(zhuǎn)步驟5a,否則轉(zhuǎn)步驟5b ;步驟5a函數(shù)調(diào)用語句處理;步驟5b轉(zhuǎn)步驟51 ;步驟5e為結(jié)束狀態(tài),一個(gè)語句塊處理結(jié)束。步驟5a函數(shù)調(diào)用語句處理流程步驟60是起始狀態(tài)。步驟60a判斷若處理函數(shù)的訪問標(biāo)記是否為ON,則步驟60b,否則步驟61 ;步驟60b查操作變量關(guān)系表, 得輸入輸出關(guān)系集合;依次更新輸出變量的狀態(tài),建立并設(shè)置相應(yīng)的操作狀態(tài)序列結(jié)點(diǎn),并鏈接到輸出變量的操作狀態(tài)序列;轉(zhuǎn)步驟69 ;步驟61函數(shù)調(diào)用輸入可調(diào)對(duì)象集合初始化為空;步驟62順序取調(diào)用函數(shù)的一個(gè)參數(shù);步驟63判斷是否取到,若沒取到,則轉(zhuǎn)步驟67 ;步驟64判斷參數(shù)是否在可調(diào)對(duì)象集合中,若不是,則轉(zhuǎn)步驟62,是則轉(zhuǎn)步驟65 ;步驟65將此可調(diào)對(duì)象對(duì)應(yīng)的形參加入到函數(shù)調(diào)用輸入可調(diào)對(duì)象集合;轉(zhuǎn)步驟62 ;步驟67置提取處理函數(shù)為被調(diào)用函數(shù),輸入可調(diào)對(duì)象集合為函數(shù)調(diào)用可調(diào)對(duì)象集合;步驟68對(duì)提取處理函數(shù)進(jìn)行程序狀態(tài)特征抽取,處理流程見函數(shù)程序狀態(tài)特征提取流程,轉(zhuǎn)步驟69 ;步驟69是結(jié)束狀態(tài),函數(shù)調(diào)用處理結(jié)束。
全文摘要
一種用于漏洞檢測(cè)的可調(diào)對(duì)象程序特征提取方法,包括步驟如下1)漏洞模型載入流程,建立漏洞模型的數(shù)據(jù)結(jié)構(gòu);2)程序載入和狀態(tài)特征分析提取流程,對(duì)經(jīng)過gcc編譯的軟件代碼進(jìn)行抽象,構(gòu)造用于漏洞檢測(cè)的、可調(diào)對(duì)象的程序狀態(tài)特征序列;將漏洞模型從數(shù)據(jù)庫中裝入內(nèi)存,在分析程序時(shí),作為參考依據(jù)。程序載入和狀態(tài)特征分析過程,根據(jù)漏洞模型相關(guān)操作的信息抽取必要的程序狀態(tài)序列,完成對(duì)待測(cè)程序的抽象建模,得到漏洞相關(guān)的程序狀態(tài)特征,即可調(diào)對(duì)象的狀態(tài)特征序列;漏洞模型由漏洞相關(guān)操作的集合構(gòu)成;可調(diào)對(duì)象指程序中漏洞相關(guān)操作所涉及的需分析和檢測(cè)的變量,輸入變量和輸出變量都是可調(diào)對(duì)象。
文檔編號(hào)G06F9/44GK102929614SQ20121039154
公開日2013年2月13日 申請(qǐng)日期2012年10月16日 優(yōu)先權(quán)日2012年10月16日
發(fā)明者曾慶凱 申請(qǐng)人:南京大學(xué)