欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種用于漏洞檢測的檢測對象程序特征提取方法

文檔序號:6332326閱讀:224來源:國知局
專利名稱:一種用于漏洞檢測的檢測對象程序特征提取方法
技術(shù)領(lǐng)域
本發(fā)明涉及一種計算機軟件的檢測方法,尤其是軟件漏洞檢測的方法。
背景技術(shù)
軟件因存在著隱藏的安全漏洞易于受到攻擊而遭受損失,其安全威脅有不斷增加 的趨勢。通過對軟件代碼進行漏洞檢測,發(fā)現(xiàn)和消除軟件中的安全漏洞是減少安全威脅、降 低安全風(fēng)險的重要手段之一。漏洞模型檢測是一種具有代表性的代碼漏洞檢測方法。為 進行基于漏洞狀態(tài)機模型的漏洞檢測,我們提出一種用于漏洞模型檢測的程序特征提取方 法,以供對待檢測程序代碼進行抽象、建立用于漏洞檢測的程序特征模型。目前的漏洞模型軟件漏洞檢測方法在檢測過程中存在著重復(fù)檢查、不夠準確等缺 點,檢測的速度和準確性顯得不足,影響著檢測方法的適用性。對此,我們提出一種用于漏 洞模型檢測的程序特征提取方法,該方法避免采用原有方法模擬程序執(zhí)行流程的檢測順 序,只提取與漏洞模型檢測的程序操作特征,注重對重點參數(shù)的檢測,以提高軟件漏洞檢測 的速度和準確性。

發(fā)明內(nèi)容
本發(fā)明目的是面向基于漏洞模型的軟件漏洞模型檢測的目標,針對目前軟件漏 洞檢測方法存在大量重復(fù)工作、影響檢測速度、以及參數(shù)分析不準確的問題,基于軟件漏洞 的狀態(tài)機模型,利用控制流圖和數(shù)據(jù)流分析技術(shù),以重點檢測對象為中心,提取與軟件漏洞 的狀態(tài)機模型相關(guān)的程序特征,對軟件代碼進行抽象建模,可用于對其進行漏洞靜態(tài)檢測, 以判斷漏洞模型在代碼中的存在性。為實現(xiàn)本發(fā)明的所述目的,本發(fā)明提供一種用于軟件漏洞模型檢測、基于檢測對 象的程序特征提取方法,用于漏洞檢測的檢測對象程序特征提取方法,包括主要步驟
1)漏洞載入流程,建立漏洞模型的數(shù)據(jù)結(jié)構(gòu);漏洞模型由漏洞狀態(tài)機的狀態(tài)的集合和 操作的集合構(gòu)成,狀態(tài)表示狀態(tài)機的狀態(tài),每個狀態(tài)有狀態(tài)號、類型和特征屬性。操作表示 引起狀態(tài)發(fā)生變化的動作,每個操作具有操作號、動作、特征、檢測對象指示、原狀態(tài)和新狀 態(tài)屬性;操作的動作指具體的程序動作。操作的特征有產(chǎn)生、轉(zhuǎn)移和使用等值;軟件漏洞 模型檢測對象為程序中漏洞相關(guān)操作所涉及的需檢測的變量,軟件漏洞模型檢測對象指示 為操作涉及的參數(shù)編號;狀態(tài)、操作的集合分別存儲在數(shù)據(jù)庫中的一個表中狀態(tài)表和操 作表;為方便模型檢測處理,在內(nèi)存中建立由操作動作進行檢索的操作轉(zhuǎn)換表;每個操作 動作對應(yīng)一個鏈表,鏈表的結(jié)點為一個操作,表示一個原狀態(tài)到新狀態(tài)的轉(zhuǎn)換關(guān)系
步驟20 起始狀態(tài);步驟21 在數(shù)據(jù)庫操作表中取一個操作的記錄;步驟22 若取到 轉(zhuǎn)步驟23,否則轉(zhuǎn)步驟26 ;步驟23判斷取得該操作動作的操作轉(zhuǎn)換表表頭是否已存在;若 已存在轉(zhuǎn)步驟24,否則轉(zhuǎn)步驟25 ;步驟24 創(chuàng)建一個操作結(jié)點,結(jié)點的操作號、特征和檢測 對象指示分別為該操作的操作號、特征和檢測對象指示;把此結(jié)點連接到對應(yīng)的操作動作 操作轉(zhuǎn)換表的鏈表尾部,轉(zhuǎn)步驟21 ;步驟25 創(chuàng)建該操作動作的操作轉(zhuǎn)換表表頭,創(chuàng)建一個
4操作結(jié)點,結(jié)點的操作號、特征和檢測對象指示分別為該操作的操作號、特征和檢測對象指 示;把此結(jié)點作為該操作動作的第一個結(jié)點,轉(zhuǎn)步驟21 ;步驟26為結(jié)束狀態(tài),操作轉(zhuǎn)換表建 立完成;
2)程序載入特征分析提取流程,對經(jīng)過gcc編譯的軟件代碼進行抽象,構(gòu)造用于漏洞 模型檢測的、基于檢測對象的程序特征序列
把程序控制流圖中與漏洞狀態(tài)相關(guān)的程序特征信息,即操作序列提取出來,并以函數(shù) 為單位進行組織;每個函數(shù)組織成若干個由檢測對象索引的操作序列鏈表;鏈表的每個結(jié) 點表示一個與漏洞狀態(tài)相關(guān)的操作或函數(shù);一方面過濾去除與漏洞檢測無關(guān)的語句,另一 方面,使函數(shù)簡化控制流到語句級,并使操作序列化,便于檢測處理;
程序特征提取處理從main函數(shù)開始進行,其流程如下,步驟31 起始狀態(tài);步驟32 為 初始化處理設(shè)置所有函數(shù)的訪問標記為OFF,值為0 ;置提取處理函數(shù)為函數(shù)main,函數(shù)的 輸入檢測對象集合和本地檢測對象集合都為空;步驟33 對提取處理函數(shù)進行函數(shù)程序特 征提?。徊襟E34 存儲提取的程序特征到磁盤,將全部函數(shù)的程序特征,包括檢測對象集合 (含輸入檢測對象集合和本地檢測對象集合)及其操作序列鏈表寫入磁盤保存;步驟36 結(jié) 束狀態(tài),此時,所有函數(shù)的操作序列鏈表已經(jīng)建立完成,作為程序操作序列分析之用;
步驟33的函數(shù)程序特征提取流程的詳細步驟是,表示對處理函數(shù)進行函數(shù)程序特征 提取的過程;步驟40 起始狀態(tài),步驟41 在程序控制流圖中取出處理函數(shù)并構(gòu)造其數(shù)據(jù) 結(jié)構(gòu)。步驟41a判斷處理函數(shù)的訪問標記為0N,值為1,是則轉(zhuǎn)步驟4e,否則轉(zhuǎn)步驟42 ;步 驟42 函數(shù)處理初始化創(chuàng)建該函數(shù)的語句塊鏈表表頭,此時表頭也是鏈表表尾,以及操作 序列鏈表表頭;為函數(shù)的輸入檢測對象集合中每個檢測對象(為原始對象),建立原始對象 的操作序列,初始無結(jié)點,和關(guān)系集合(初始化為空);步驟43 語句塊鏈表當前語句塊向后 移一次,而首次執(zhí)行是使當前語句塊指向函數(shù)的頭語句塊;步驟44 判斷語句塊是否為空, 是則轉(zhuǎn)步驟4e,否則轉(zhuǎn)步驟45 ;步驟45 進行當前語句塊的分析提取處理;步驟46 判斷當 前語句塊的后繼是否是順序結(jié)構(gòu),是則轉(zhuǎn)步驟47,否則轉(zhuǎn)步驟48 ;步驟47 取出順序結(jié)構(gòu)的 下一后繼語句塊放入語句塊鏈表表尾,后繼語句塊置標記DONE(值為1);若后繼語句塊已標 記DONE,不再放入,轉(zhuǎn)步驟4d ;步驟48 判斷當前語句塊的后繼是否是if結(jié)構(gòu),是則轉(zhuǎn)步驟 49,否則轉(zhuǎn)步驟4a ;步驟49 取出if語句為真和為假時的后繼語句塊依次放入語句塊鏈表 表尾,后繼語句塊置標記DONE ;若后繼語句塊已標記DONE,不再放入,轉(zhuǎn)步驟4d ;步驟4a 判斷當前語句塊的后繼是否是switch結(jié)構(gòu),是則轉(zhuǎn)步驟4b,否則轉(zhuǎn)步驟4d ;步驟4b 取出 switch分支語句中的一個語句塊放入語句塊鏈表表尾,分支后繼語句塊置標記DONE ;若后 繼語句塊已標記DONE,不再放入;步驟4c 對取出的switch分支語句判斷是否所有語句塊 都已處理完畢,是則轉(zhuǎn)步驟4d,否則轉(zhuǎn)步驟4b ;步驟4d 判斷語句塊鏈表當前語句塊是否是 鏈尾(此時函數(shù)的操作序列鏈表已經(jīng)建成),是則轉(zhuǎn)步驟4e,否則轉(zhuǎn)步驟43 ;步驟4e 設(shè)置 處理函數(shù)的訪問標記為0N(值為1);步驟4f 為函數(shù)處理結(jié)束狀態(tài);此時,提取處理函數(shù)的 檢測對象集合(包括輸入檢測對象集合和本地檢測對象集合)及其操作序列鏈表已經(jīng)建立 完成;
步驟45的一個語句塊的語句操作提取處理流程的詳細步驟是步驟50 起始狀態(tài);步 驟51 順序取出該語句塊的一條語句為當前語句;步驟52 判斷是否取到,若取到轉(zhuǎn)步驟 53,否則轉(zhuǎn)步驟5e ;步驟53 查操作轉(zhuǎn)換表,判斷該語句是否為產(chǎn)生型操作(語句為操作轉(zhuǎn)的特征為產(chǎn)生),是則轉(zhuǎn)步驟54,否則轉(zhuǎn)步驟55 ;步驟53a 該操作的檢測 對象指示所指的參數(shù)為新產(chǎn)生的檢測對象(為原始對象);判斷新產(chǎn)生的原始對象是否已在 本地檢測對象集合中。是則轉(zhuǎn)步驟55,否則轉(zhuǎn)步驟54 ;步驟54 將該原始對象加入到函數(shù) 的本地檢測對象集合中;建立該原始對象的操作序列,操作序列的首結(jié)點為本語句的操作; 建立該原始對象的關(guān)系集合,且初始化為空;步驟55 判斷該語句是否為賦值,且右值表達 式中含有檢測對象(包括輸入檢測對象和本地檢測對象);是則轉(zhuǎn)步驟56,否則轉(zhuǎn)步驟57 ;步 驟56 被賦值變量為關(guān)系檢測對象,右值中檢測對象為傳遞檢測對象。找到傳遞檢測對象 所屬的原始對象(傳遞檢測對象在原始對象的關(guān)系集合中),加入關(guān)系檢測對象到原始對象 的關(guān)系集合中;步驟57 查操作轉(zhuǎn)換表,判斷該語句操作是否在漏洞狀態(tài)機的操作集合中 (語句為操作轉(zhuǎn)換表中操作);是則轉(zhuǎn)步驟58,否則轉(zhuǎn)步驟59 ;步驟58 創(chuàng)建該語句操作的操 作鏈表結(jié)點置結(jié)點的操作為該語句的操作,檢測對象為操作的檢測對象指示所指的參數(shù); 找到該檢測對象所屬的原始對象(該檢測對象在原始對象的關(guān)系集合中),將該語句的操作 加到原始對象的序列尾部;步驟59 判斷該語句是否為函數(shù)調(diào)用,是則轉(zhuǎn)步驟5a,否則轉(zhuǎn)步 驟5b ;步驟5a 函數(shù)調(diào)用語句處理;步驟5b 轉(zhuǎn)步驟51 ;步驟5e為結(jié)束狀態(tài);
步驟5a為函數(shù)調(diào)用語句處理流程的詳細步驟;步驟60是起始狀態(tài)。步驟61 函數(shù)調(diào)用 檢測對象集合初始化為空;步驟62 順序取調(diào)用函數(shù)的一個參數(shù);步驟63 判斷是否取到, 若沒取到,則轉(zhuǎn)步驟66 ;步驟64 判斷參數(shù)是否為檢測對象(在檢測對象集合中),若不是則 轉(zhuǎn)步驟62,是則轉(zhuǎn)步驟65 ;步驟65 查找該檢測對象的原始對象,將本語句的函數(shù)調(diào)用加到 原始對象的操作序列尾部;將此檢測對象對應(yīng)的形參加入到函數(shù)調(diào)用檢測對象集合,轉(zhuǎn)步 驟62 ;步驟66 若函數(shù)調(diào)用檢測對象集合為空,則轉(zhuǎn)步驟69 ;步驟67 置提取處理函數(shù)為被 調(diào)用函數(shù),輸入檢測對象集合為函數(shù)調(diào)用檢測對象集合;步驟68 對提取處理函數(shù)進行程 序特征抽取,即步驟45 —個語句塊的語句操作提取處理流程的處理流程;步驟69 結(jié)束狀 態(tài),函數(shù)調(diào)用處理結(jié)束。幾次循環(huán)后,步驟63總會轉(zhuǎn)向步驟66,跳出循環(huán)。本發(fā)明有益效果這是一種用于軟件漏洞模型檢測、基于檢測對象的程序特征提 取方法,克服目前軟件漏洞檢測方法存在大量重復(fù)工作、影響檢測速度、以及參數(shù)分析不準 確的問題,通過提取與軟件漏洞的狀態(tài)機模型相關(guān)的程序特征,對軟件代碼進行抽象建模, 用于對其進行漏洞靜態(tài)檢測,以判斷漏洞模型在代碼中的存在性。


圖1用于漏洞模型檢測的程序特征提取示意圖 圖2漏洞載入流程圖
圖3程序載入特征提取流程圖 圖4函數(shù)程序特征提取流程圖 圖5語句塊的語句操作提取處理流程圖 圖6函數(shù)調(diào)用語句處理流程圖。
具體實施例方式
本發(fā)明方法工作流程如圖I-圖6所示。
6
圖1所示為本方法實施的整體結(jié)構(gòu)和工作原理。本方法的目的是根據(jù)漏洞模型所 涉及的操作對待檢測程序進行分析過濾,得到與漏洞檢測相關(guān)的程序特征。為提高處理速 度,需要將漏洞模型從數(shù)據(jù)庫中裝入內(nèi)存,以便在分析程序時,作為參考依據(jù)。程序載入和 特征分析過程,根據(jù)漏洞模型相關(guān)操作的信息抽取必要的程序操作,完成對程序的抽象,得 到漏洞相關(guān)的程序特征,即基于檢測對象的操作序列。圖2表示漏洞模型載入流程。漏洞模型由漏洞狀態(tài)機的狀態(tài)的集合和操作的集合 構(gòu)成。狀態(tài)表示狀態(tài)機的狀態(tài)。每個狀態(tài)有狀態(tài)號、類型和特征等屬性。類型是指漏洞的 分類,如文件、內(nèi)存等類別。特征有開始、過渡和漏洞等值。操作表示引起狀態(tài)發(fā)生變化的 動作,每個操作具有操作號、動作、特征、檢測對象指示、原狀態(tài)和新狀態(tài)等屬性。操作的動 作指具體的程序動作。操作的特征有產(chǎn)生、轉(zhuǎn)移和使用等值。檢測對象為程序中漏洞相關(guān) 操作所涉及的需檢測的變量,檢測對象指示為操作涉及的參數(shù)編號。狀態(tài)、操作的集合分別 存儲在數(shù)據(jù)庫中的一個表中狀態(tài)表和操作表。為方便模型檢測處理,在內(nèi)存中建立由操作 動作進行檢索的操作轉(zhuǎn)換表。每個操作動作對應(yīng)一個鏈表,鏈表的結(jié)點為一個操作,表示一 個原狀態(tài)到新狀態(tài)的轉(zhuǎn)換關(guān)系。具體步驟如下。步驟20是起始狀態(tài)。步驟21在數(shù)據(jù)庫操作表中取一個操作的記錄。步驟22若 取到轉(zhuǎn)步驟23,否則轉(zhuǎn)步驟26。步驟23判斷取得該操作動作的操作轉(zhuǎn)換表表頭是否已存 在。若已存在轉(zhuǎn)步驟24,否則轉(zhuǎn)步驟25。步驟24創(chuàng)建一個操作結(jié)點,結(jié)點的操作號、特征 和檢測對象指示分別為該操作的操作號、特征和檢測對象指示。把此結(jié)點連接到對應(yīng)的操 作動作操作轉(zhuǎn)換表的鏈表尾部,轉(zhuǎn)步驟21。步驟25創(chuàng)建該操作動作的操作轉(zhuǎn)換表表頭,創(chuàng) 建一個操作結(jié)點,結(jié)點的操作號、特征和檢測對象指示分別為該操作的操作號、特征和檢測 對象指示。把此結(jié)點作為該操作動作的第一個結(jié)點,轉(zhuǎn)步驟21。步驟26為結(jié)束狀態(tài),操作 轉(zhuǎn)換表建立完成。圖3表示程序載入和特征提取流程。把程序控制流圖中與漏洞狀態(tài)相關(guān)的程序特 征信息,即操作序列提取出來,并以函數(shù)為單位進行組織。每個函數(shù)組織成若干個由檢測對 象索引的操作序列鏈表。鏈表的每個結(jié)點表示一個與漏洞狀態(tài)相關(guān)的操作或函數(shù)。一方 面過濾去除與漏洞檢測無關(guān)的語句,另一方面,使函數(shù)簡化控制流到語句級,并使操作序列 化,便于檢測處理。程序特征提取處理從main函數(shù)開始進行,其流程如下。步驟31是起始狀態(tài)。步驟 32為初始化處理設(shè)置所有函數(shù)的訪問標記為OFF(值為0);置提取處理函數(shù)為函數(shù)main, 函數(shù)的輸入檢測對象集合和本地檢測對象集合都為空。步驟33對提取處理函數(shù)進行函數(shù) 程序特征提取。處理流程見圖4。步驟34存儲提取的程序特征到磁盤。將全部函數(shù)的程序 特征,包括檢測對象集合(含輸入檢測對象集合和本地檢測對象集合)及其操作序列鏈表寫 入磁盤保存。步驟36為結(jié)束狀態(tài)。此時,所有函數(shù)的操作序列鏈表已經(jīng)建立完成,可以作 為程序操作序列分析之用。圖4為函數(shù)程序特征提取流程圖,表示對處理函數(shù)進行函數(shù)程序特征提取的過 程。步驟40是起始狀態(tài)。步驟41在程序控制流圖中取出處理函數(shù)并構(gòu)造其數(shù)據(jù)結(jié)構(gòu)。步 驟41a判斷處理函數(shù)的訪問標記為ON(值為1)。是則轉(zhuǎn)步驟4e ;否則轉(zhuǎn)步驟42。步驟42 函數(shù)處理初始化創(chuàng)建該函數(shù)的語句塊鏈表表頭(此時表頭也是鏈表表尾),以及操作序列 鏈表表頭。為函數(shù)的輸入檢測對象集合中每個檢測對象(為原始對象),建立原始對象的操作序列(初始無結(jié)點)和關(guān)系集合(初始化為空)。步驟43語句塊鏈表當前語句塊向后移一 次,而首次執(zhí)行是使當前語句塊指向函數(shù)的頭語句塊。步驟44判斷語句塊是否為空。是則 轉(zhuǎn)步驟4e,否則轉(zhuǎn)步驟45。步驟45進行當前語句塊的分析提取處理,處理流程見圖5。步 驟46判斷當前語句塊的后繼是否是順序結(jié)構(gòu)。是則轉(zhuǎn)步驟47,否則轉(zhuǎn)步驟48。步驟47取 出順序結(jié)構(gòu)的下一后繼語句塊放入語句塊鏈表表尾,后繼語句塊置標記DONE (值為1)。若 后繼語句塊已標記DONE,不再放入。轉(zhuǎn)步驟4d。步驟48判斷當前語句塊的后繼是否是if 結(jié)構(gòu)。是則轉(zhuǎn)步驟49,否則轉(zhuǎn)步驟4a。步驟49取出if語句為真和為假時的后繼語句塊依 次放入語句塊鏈表表尾,后繼語句塊置標記DONE。若后繼語句塊已標記DONE,不再放入。轉(zhuǎn) 步驟4d。步驟4a判斷當前語句塊的后繼是否是switch結(jié)構(gòu)。是則轉(zhuǎn)步驟4b,否則轉(zhuǎn)步驟 4d。步驟4b取出switch分支語句中的一個語句塊放入語句塊鏈表表尾,分支后繼語句塊 置標記DONE。若后繼語句塊已標記DONE,不再放入。步驟4c對取出的switch分支語句判 斷是否所有語句塊都已處理完畢。是則轉(zhuǎn)步驟4d,否則轉(zhuǎn)步驟4b。步驟4d判斷語句塊鏈 表當前語句塊是否是鏈尾(此時函數(shù)的操作序列鏈表已經(jīng)建成)。是則轉(zhuǎn)步驟4e,否則轉(zhuǎn) 步驟43。步驟4e設(shè)置處理函數(shù)的訪問標記為ON(值為1)。步驟4f為函數(shù)處理結(jié)束狀態(tài)。 此時,提取處理函數(shù)的檢測對象集合(包括輸入檢測對象集合和本地檢測對象集合)及其操 作序列鏈表已經(jīng)建立完成。圖5表示一個語句塊的語句操作提取處理流程。步驟50是起始狀態(tài)。步驟51順 序取出該語句塊的一條語句為當前語句。步驟52判斷是否取到。若取到轉(zhuǎn)步驟53,否則 轉(zhuǎn)步驟5e。步驟53查操作轉(zhuǎn)換表,判斷該語句是否為產(chǎn)生型操作(語句為操作轉(zhuǎn)換表中操 作且操作的特征為產(chǎn)生)。是則轉(zhuǎn)步驟54,否則轉(zhuǎn)步驟55。步驟53a該操作的檢測對象指 示所指的參數(shù)為新產(chǎn)生的檢測對象(為原始對象)。判斷新產(chǎn)生的原始對象是否已在本地檢 測對象集合中。是則轉(zhuǎn)步驟55,否則轉(zhuǎn)步驟54。步驟54將該原始對象加入到函數(shù)的本地 檢測對象集合中;建立該原始對象的操作序列,操作序列的首結(jié)點為本語句的操作;建立 該原始對象的關(guān)系集合,且初始化為空。步驟55判斷該語句是否為賦值,且右值表達式中 含有檢測對象(包括輸入檢測對象和本地檢測對象)。是則轉(zhuǎn)步驟56,否則轉(zhuǎn)步驟57。步驟 56被賦值變量為關(guān)系檢測對象,右值中檢測對象為傳遞檢測對象。找到傳遞檢測對象所屬 的原始對象(傳遞檢測對象在原始對象的關(guān)系集合中),加入關(guān)系檢測對象到原始對象的關(guān) 系集合中。步驟57查操作轉(zhuǎn)換表,判斷該語句操作是否在漏洞狀態(tài)機的操作集合中(語句 為操作轉(zhuǎn)換表中操作)。是則轉(zhuǎn)步驟58,否則轉(zhuǎn)步驟59。步驟58創(chuàng)建該語句操作的操作鏈 表結(jié)點置結(jié)點的操作為該語句的操作,檢測對象為操作的檢測對象指示所指的參數(shù);找 到該檢測對象所屬的原始對象(該檢測對象在原始對象的關(guān)系集合中),將該語句的操作加 到原始對象的序列尾部。步驟59判斷該語句是否為函數(shù)調(diào)用。是則轉(zhuǎn)步驟5a,否則轉(zhuǎn)步 驟5b。步驟5a函數(shù)調(diào)用語句處理,處理流程見圖6。步驟5b轉(zhuǎn)步驟51。步驟5e為結(jié)束 狀態(tài),一個語句塊處理結(jié)束。圖6為函數(shù)調(diào)用語句處理流程,表示函數(shù)調(diào)用語句操作提取處理的過程。步驟60 是起始狀態(tài)。步驟61函數(shù)調(diào)用檢測對象集合初始化為空。步驟62順序取調(diào)用函數(shù)的一個 參數(shù)。步驟63判斷是否取到。若沒取到,則轉(zhuǎn)步驟66。步驟64判斷參數(shù)是否為檢測對象 (在檢測對象集合中)。若不是,則轉(zhuǎn)步驟62,是則轉(zhuǎn)步驟65。步驟65查找該檢測對象的原 始對象,將本語句的函數(shù)調(diào)用加到原始對象的操作序列尾部;將此檢測對象對應(yīng)的形參加
8入到函數(shù)調(diào)用檢測對象集合。轉(zhuǎn)步驟62。步驟66若函數(shù)調(diào)用檢測對象集合為空,則轉(zhuǎn)步驟 69。步驟67置提取處理函數(shù)為被調(diào)用函數(shù),輸入檢測對象集合為函數(shù)調(diào)用檢測對象集合。 步驟68對提取處理函數(shù)進行程序特征抽取,處理流程見圖4。步驟69是結(jié)束狀態(tài),函數(shù)調(diào) 用處理結(jié)束。
權(quán)利要求
用于漏洞檢測的檢測對象程序特征提取方法,其特征是包括主要步驟如下1)漏洞載入流程,建立漏洞模型的數(shù)據(jù)結(jié)構(gòu);漏洞模型由漏洞狀態(tài)機的狀態(tài)的集合和操作的集合構(gòu)成,狀態(tài)表示狀態(tài)機的狀態(tài),每個狀態(tài)有狀態(tài)號、類型和特征屬性;操作表示引起狀態(tài)發(fā)生變化的動作,每個操作具有操作號、動作、特征、檢測對象指示、原狀態(tài)和新狀態(tài)屬性;操作的動作指具體的程序動作;操作的特征有產(chǎn)生、轉(zhuǎn)移和使用等值; 軟件漏洞模型檢測對象為程序中漏洞相關(guān)操作所涉及的需檢測的變量,軟件漏洞模型檢測對象指示為操作涉及的參數(shù)編號;狀態(tài)、操作的集合分別存儲在數(shù)據(jù)庫中的一個表中狀態(tài)表和操作表;為方便模型檢測處理,在內(nèi)存中建立由操作動作進行檢索的操作轉(zhuǎn)換表;每個操作動作對應(yīng)一個鏈表,鏈表的結(jié)點為一個操作,表示一個原狀態(tài)到新狀態(tài)的轉(zhuǎn)換關(guān)系步驟20起始狀態(tài);步驟21在數(shù)據(jù)庫操作表中取一個操作的記錄;步驟22若取到轉(zhuǎn)步驟23,否則轉(zhuǎn)步驟26;步驟23判斷取得該操作動作的操作轉(zhuǎn)換表表頭是否已存在;若已存在轉(zhuǎn)步驟24,否則轉(zhuǎn)步驟25;步驟24創(chuàng)建一個操作結(jié)點,結(jié)點的操作號、特征和檢測對象指示分別為該操作的操作號、特征和檢測對象指示;把此結(jié)點連接到對應(yīng)的操作動作操作轉(zhuǎn)換表的鏈表尾部,轉(zhuǎn)步驟21;步驟25創(chuàng)建該操作動作的操作轉(zhuǎn)換表表頭,創(chuàng)建一個操作結(jié)點,結(jié)點的操作號、特征和檢測對象指示分別為該操作的操作號、特征和檢測對象指示;把此結(jié)點作為該操作動作的第一個結(jié)點,轉(zhuǎn)步驟21;步驟26為結(jié)束狀態(tài),操作轉(zhuǎn)換表建立完成;2)程序載入特征分析提取流程,對經(jīng)過gcc編譯的軟件代碼進行抽象,構(gòu)造用于漏洞模型檢測的、基于檢測對象的程序特征序列把程序控制流圖中與漏洞狀態(tài)相關(guān)的程序特征信息,即操作序列提取出來,并以函數(shù)為單位進行組織;每個函數(shù)組織成若干個由檢測對象索引的操作序列鏈表;鏈表的每個結(jié)點表示一個與漏洞狀態(tài)相關(guān)的操作或函數(shù);一方面過濾去除與漏洞檢測無關(guān)的語句,另一方面,使函數(shù)簡化控制流到語句級,并使操作序列化,便于檢測處理;程序特征提取處理從main函數(shù)開始進行,其流程如下,步驟31起始狀態(tài);步驟32為初始化處理設(shè)置所有函數(shù)的訪問標記為OFF,值為0;置提取處理函數(shù)為函數(shù)main,函數(shù)的輸入檢測對象集合和本地檢測對象集合都為空;步驟33對提取處理函數(shù)進行函數(shù)程序特征提?。徊襟E34存儲提取的程序特征到磁盤,將全部函數(shù)的程序特征,包括檢測對象集合、含輸入檢測對象集合和本地檢測對象集合及其操作序列鏈表寫入磁盤保存;步驟36結(jié)束狀態(tài),此時,所有函數(shù)的操作序列鏈表已經(jīng)建立完成,作為程序操作序列分析之用;步驟33的函數(shù)程序特征提取流程的詳細步驟是,表示對處理函數(shù)進行函數(shù)程序特征提取的過程;步驟40起始狀態(tài);步驟41在程序控制流圖中取出處理函數(shù)并構(gòu)造其數(shù)據(jù)結(jié)構(gòu);步驟41a判斷處理函數(shù)的訪問標記為ON,值為1,是則轉(zhuǎn)步驟4e,否則轉(zhuǎn)步驟42;步驟42函數(shù)處理初始化創(chuàng)建該函數(shù)的語句塊鏈表表頭,此時表頭也是鏈表表尾,以及操作序列鏈表表頭;為函數(shù)的輸入檢測對象集合中每個檢測對象,建立原始對象的操作序列,初始無結(jié)點,和關(guān)系集合、關(guān)系集合的初始化為空;步驟43語句塊鏈表當前語句塊向后移一次,而首次執(zhí)行是使當前語句塊指向函數(shù)的頭語句塊;步驟44判斷語句塊是否為空,是則轉(zhuǎn)步驟4e,否則轉(zhuǎn)步驟45;步驟45進行當前語句塊的分析提取處理;步驟46判斷當前語句塊的后繼是否是順序結(jié)構(gòu),是則轉(zhuǎn)步驟47,否則轉(zhuǎn)步驟48;步驟47取出順序結(jié)構(gòu)的下一后繼語句塊放入語句塊鏈表表尾,后繼語句塊置標記DONE、值為1;若后繼語句塊已標記DONE,不再放入,轉(zhuǎn)步驟4d;步驟48判斷當前語句塊的后繼是否是if結(jié)構(gòu),是則轉(zhuǎn)步驟49,否則轉(zhuǎn)步驟4a;步驟49取出if語句為真和為假時的后繼語句塊依次放入語句塊鏈表表尾,后繼語句塊置標記DONE;若后繼語句塊已標記DONE,不再放入,轉(zhuǎn)步驟4d;步驟4a判斷當前語句塊的后繼是否是switch結(jié)構(gòu),是則轉(zhuǎn)步驟4b,否則轉(zhuǎn)步驟4d;步驟4b取出switch分支語句中的一個語句塊放入語句塊鏈表表尾,分支后繼語句塊置標記DONE;若后繼語句塊已標記DONE,不再放入;步驟4c對取出的switch分支語句判斷是否所有語句塊都已處理完畢,是則轉(zhuǎn)步驟4d,否則轉(zhuǎn)步驟4b;步驟4d判斷語句塊鏈表當前語句塊是否是鏈尾、此時函數(shù)的操作序列鏈表已經(jīng)建成,是則轉(zhuǎn)步驟4e, 否則轉(zhuǎn)步驟43;步驟4e設(shè)置處理函數(shù)的訪問標記為ON(值為1);步驟4f為函數(shù)處理結(jié)束狀態(tài);此時,提取處理函數(shù)的檢測對象集合、包括輸入檢測對象集合和本地檢測對象集合及其操作序列鏈表已經(jīng)建立完成;步驟45的一個語句塊的語句操作提取處理流程的詳細步驟是步驟50起始狀態(tài);步驟51順序取出該語句塊的一條語句為當前語句;步驟52判斷是否取到,若取到轉(zhuǎn)步驟53,否則轉(zhuǎn)步驟5e;步驟53查操作轉(zhuǎn)換表,判斷該語句是否為產(chǎn)生型操作、語句為操作轉(zhuǎn)換表中操作且操作的特征為產(chǎn)生型,是則轉(zhuǎn)步驟54,否則轉(zhuǎn)步驟55;步驟53a該操作的檢測對象指示所指的參數(shù)為新產(chǎn)生的檢測對象;判斷新產(chǎn)生的原始對象是否已在本地檢測對象集合中;是則轉(zhuǎn)步驟55,否則轉(zhuǎn)步驟54;步驟54將該原始對象加入到函數(shù)的本地檢測對象集合中;建立該原始對象的操作序列,操作序列的首結(jié)點為本語句的操作;建立該原始對象的關(guān)系集合,且初始化為空;步驟55判斷該語句是否為賦值,且右值表達式中含有檢測對象、包括輸入檢測對象和本地檢測對象;是則轉(zhuǎn)步驟56,否則轉(zhuǎn)步驟57;步驟56被賦值變量為關(guān)系檢測對象,右值中檢測對象為傳遞檢測對象;找到傳遞檢測對象所屬的原始對象、傳遞檢測對象在原始對象的關(guān)系集合中,加入關(guān)系檢測對象到原始對象的關(guān)系集合中;步驟57查操作轉(zhuǎn)換表,判斷該語句操作是否在漏洞狀態(tài)機的操作集合中;是則轉(zhuǎn)步驟58,否則轉(zhuǎn)步驟59;步驟58創(chuàng)建該語句操作的操作鏈表結(jié)點置結(jié)點的操作為該語句的操作,檢測對象為操作的檢測對象指示所指的參數(shù);找到該檢測對象所屬的原始對象,將該語句的操作加到原始對象的序列尾部;步驟59判斷該語句是否為函數(shù)調(diào)用,是則轉(zhuǎn)步驟5a,否則轉(zhuǎn)步驟5b;步驟5a 函數(shù)調(diào)用語句處理;步驟5b轉(zhuǎn)步驟51;步驟5e為結(jié)束狀態(tài);步驟5a為函數(shù)調(diào)用語句處理流程的詳細步驟;步驟60是起始狀態(tài);步驟61函數(shù)調(diào)用檢測對象集合初始化為空;步驟62順序取調(diào)用函數(shù)的一個參數(shù);步驟63判斷是否取到,若沒取到,則轉(zhuǎn)步驟66;步驟64判斷參數(shù)是否為檢測對象,若不是則轉(zhuǎn)步驟62,是則轉(zhuǎn)步驟65;步驟65查找該檢測對象的原始對象,將本語句的函數(shù)調(diào)用加到原始對象的操作序列尾部;將此檢測對象對應(yīng)的形參加入到函數(shù)調(diào)用檢測對象集合,轉(zhuǎn)步驟62;步驟66若函數(shù)調(diào)用檢測對象集合為空,則轉(zhuǎn)步驟69;步驟67置提取處理函數(shù)為被調(diào)用函數(shù),輸入檢測對象集合為函數(shù)調(diào)用檢測對象集合;步驟68對提取處理函數(shù)進行程序特征抽取,即步驟45一個語句塊的語句操作提取處理流程的處理流程;步驟69結(jié)束狀態(tài),函數(shù)調(diào)用處理結(jié)束。
全文摘要
一種用于漏洞檢測的檢測對象程序特征提取方法,包括步驟如下1)漏洞載入流程,建立漏洞模型的數(shù)據(jù)結(jié)構(gòu);漏洞模型由漏洞狀態(tài)機的狀態(tài)的集合和操作的集合構(gòu)成,狀態(tài)表示狀態(tài)機的狀態(tài),每個狀態(tài)有狀態(tài)號、類型和特征屬性。2)程序載入特征分析提取流程,對經(jīng)過gcc編譯的軟件代碼進行抽象,構(gòu)造用于漏洞模型檢測的、基于檢測對象的程序特征序列把程序控制流圖中與漏洞狀態(tài)相關(guān)的程序特征信息提取出來,并以函數(shù)為單位進行組織;每個函數(shù)組織成若干個由檢測對象索引的操作序列鏈表;本發(fā)明克服目前軟件漏洞檢測方法存在大量重復(fù)工作、影響檢測速度、以及參數(shù)分析不準確的問題,以判斷漏洞模型在代碼中的存在性。
文檔編號G06F11/36GK101937395SQ20101028666
公開日2011年1月5日 申請日期2010年9月20日 優(yōu)先權(quán)日2010年9月20日
發(fā)明者曾慶凱 申請人:南京大學(xué)
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
华安县| 聂拉木县| 奉节县| 沿河| 望江县| 沂水县| 新晃| 永兴县| 吉林省| 新津县| 谷城县| 镇康县| 佛山市| 东海县| 双柏县| 来安县| 志丹县| 平和县| 尚志市| 和田市| 德阳市| 牟定县| 冕宁县| 喜德县| 莱州市| 海林市| 鹤庆县| 珲春市| 满洲里市| 天镇县| 桐梓县| 喜德县| 普洱| 高要市| 福海县| 崇义县| 开封县| 安阳县| 尖扎县| 花垣县| 苏尼特右旗|