專利名稱:一種針對(duì)軟件缺陷的檢測(cè)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種針對(duì)軟件缺陷(software vulnerability)的檢測(cè)方法,屬于信息安全技術(shù)領(lǐng)域。
背景技術(shù):
隨著計(jì)算機(jī)技術(shù)的迅速發(fā)展,人類社會(huì)的信息化程度越來越高,整個(gè)社會(huì)的政治、經(jīng)濟(jì)、軍事、文化以及其他領(lǐng)域?qū)τ?jì)算機(jī)信息系統(tǒng)的依賴程度也越來越高。在這種情況下,計(jì)算機(jī)系統(tǒng)的安全性得到了人們?cè)絹碓蕉嗟年P(guān)注。然而,大型軟件、系統(tǒng)的編寫需要許許多多程序員共同完成,他們將一個(gè)軟件或系統(tǒng)分成若干板塊,分工編寫,然后再匯總,測(cè)試;最后再修補(bǔ)、發(fā)布,因此在軟件中存在安全漏洞幾乎是不可避免的。軟件缺陷包括軟件安全漏洞和其它軟件錯(cuò)誤。軟件安全漏洞是在軟件設(shè)計(jì)實(shí)現(xiàn)過程中被引入的、在數(shù)據(jù)訪問或行為邏輯等方面的錯(cuò)誤并被攻擊者利用,從而使程序行為違背一定的安全策略。其它軟件錯(cuò)誤是相對(duì)于基于軟件安全漏洞來講不能夠威脅到軟件系統(tǒng)安全的那些軟件錯(cuò)誤。按照檢測(cè)過程中是否需要執(zhí)行程序的標(biāo)準(zhǔn),軟件安全漏洞檢測(cè)技術(shù)分為動(dòng)態(tài)檢測(cè)和靜態(tài)檢測(cè)。(1)動(dòng)態(tài)測(cè)試動(dòng)態(tài)測(cè)試是在程序運(yùn)行過程中注入測(cè)試數(shù)據(jù),通過對(duì)程序的運(yùn)行環(huán)境(包括環(huán)境變量、內(nèi)存、堆和棧等)進(jìn)行分析,觀察程序運(yùn)行是否正常、程序行為是否滿足要求,來檢測(cè)程序是否存在漏洞。動(dòng)態(tài)檢測(cè)技術(shù)的優(yōu)點(diǎn)是不直接面對(duì)源代碼,不需要修改目標(biāo)程序源代碼,這在一定程度上提高程序的保密性。但其缺點(diǎn)是僅關(guān)注程序運(yùn)行的外部表現(xiàn),因此,定位不準(zhǔn)確、漏報(bào)率高,不能很好地發(fā)現(xiàn)隱藏在程序中的漏洞。動(dòng)態(tài)測(cè)試主要應(yīng)用于軟件生命周期的測(cè)試階段。(2)靜態(tài)檢測(cè)靜態(tài)檢測(cè)主要應(yīng)用于軟件生命周期的編碼階段。靜態(tài)檢測(cè)不編譯運(yùn)行程序,而是通過對(duì)程序源代碼進(jìn)行分析以發(fā)現(xiàn)其中的錯(cuò)誤。靜態(tài)檢測(cè)的目標(biāo)不是證明程序完全正確,而是作為動(dòng)態(tài)測(cè)試的補(bǔ)充,在程序運(yùn)行前盡可能多地發(fā)現(xiàn)其中隱含的錯(cuò)誤,提高程序的可靠性和健壯性。對(duì)一些狀態(tài)有限且對(duì)穩(wěn)定性要求很高的軟件來說,采用適當(dāng)?shù)撵o態(tài)檢測(cè)技術(shù)是非常有必要的。但靜態(tài)檢測(cè)也有局限性,對(duì)于程序的某些性質(zhì)(比如和指針運(yùn)算、動(dòng)態(tài)存儲(chǔ)分配等相關(guān)的性質(zhì)),用靜態(tài)檢測(cè)難以奏效。因此,靜態(tài)檢測(cè)并不能完全替代動(dòng)態(tài)測(cè)試。目前對(duì)軟件安全漏洞檢測(cè)技術(shù)的研究有很多,這些方法可用于對(duì)軟件缺陷進(jìn)行檢測(cè),但其檢測(cè)的不夠全面,基本檢測(cè)不到與軟件安全漏洞對(duì)應(yīng)的其它軟件錯(cuò)誤。本發(fā)明提出的方法中使用到兩項(xiàng)重要的已有技術(shù)遺傳算法和Fuzzing技術(shù)。遺傳算法是近年來發(fā)展迅速的一種啟發(fā)式搜索算法。自上世紀(jì)70年代美國Michigan大學(xué)的John Holland教授提出遺傳算法(genetic algorithms,GA)的概念體系以來,遺傳算法在許多領(lǐng)域得到了高度關(guān)注和廣泛應(yīng)用。遺傳算法是一種借鑒生物界自然選擇和自然遺傳機(jī)制的高度并行、隨機(jī)、自適應(yīng)搜索算法。它借用了生物遺傳學(xué)的觀點(diǎn),通過自然選擇、遺傳、變異等作用機(jī)制,實(shí)現(xiàn)各個(gè)個(gè)體的適應(yīng)性的提高,體現(xiàn)了自然界中“物競天擇、適者生存”的進(jìn)化過程。天然并行性和對(duì)全局信息的有效利用能力是遺傳算法的兩大顯著特點(diǎn)。遺傳算法不需要梯度信息,對(duì)目標(biāo)函數(shù)性質(zhì)沒有過多要求。采用遺傳算法來求解搜索問題,是充分發(fā)揮該算法并行、在滿足一定條件上進(jìn)行高效搜索的優(yōu)點(diǎn)。一個(gè)串行運(yùn)算的遺傳算法描述如下(1)對(duì)待解決問題進(jìn)行編碼;(2)隨機(jī)初始化種群X(O) = (X1, x2, -xk) ;k為初始種群數(shù)量;(3)對(duì)當(dāng)前群體X(t) (t為迭代次數(shù))中的每個(gè)個(gè)體Xi,計(jì)算其適應(yīng)度Fit (Xi)的值,適應(yīng)度表示了該個(gè)體的性能好壞;(4)應(yīng)用選擇算子產(chǎn)生中間代)(r(t);(5)對(duì)&(0應(yīng)用其它的算子,產(chǎn)生新一代群體X(t+1),這些算子的目的在于擴(kuò)展有限個(gè)體的覆蓋面,體現(xiàn)全局搜索的思想;(6)判斷是否滿足終止條件,如果滿足,輸出結(jié)果,結(jié)束;否則,t = t+Ι ;返回(3)。遺傳算法中最常用的算子有如下幾種(1)選擇算子(selection/r印roduction)選擇算子從群體中按某一概率成對(duì)選擇個(gè)體,某個(gè)體Xi被選擇的概率與其適應(yīng)度值成正比。最通常的實(shí)現(xiàn)方法是輪盤賭(roulette wheel)模型。(2)交叉算子(Crossover)交叉算子將被選中的兩個(gè)個(gè)體的基因鏈按概率pc進(jìn)行交叉,生成兩個(gè)新的個(gè)體,交叉位置是隨機(jī)的。其中PC是一個(gè)系統(tǒng)參數(shù)。(3)變異算子(Mutation)變異算子將新個(gè)體的基因鏈的各位按概率pm進(jìn)行變
已Fuzzing是一種基于缺陷注入的自動(dòng)軟件測(cè)試技術(shù)。通過編寫fuzzer工具向目標(biāo)程序提供某種形式的輸入并觀察其響應(yīng)來發(fā)現(xiàn)問題,這種輸入可以是完全隨機(jī)的或精心構(gòu)造的。Fuzzing測(cè)試通常以大小相關(guān)的部分、字符串、標(biāo)志字符串開始或結(jié)束的二進(jìn)制塊等為重點(diǎn),使用邊界值附近的值對(duì)目標(biāo)進(jìn)行測(cè)試。主要有兩種類型的fuzzing技術(shù)1. dumb fuzzing 這種測(cè)試無需了解協(xié)議或文件本身格式,通過提供完全隨機(jī)的輸入或簡單改變某些字節(jié)去發(fā)現(xiàn)問題。這種方法實(shí)現(xiàn)起來較簡單,容易快速觸發(fā)錯(cuò)誤,但它的完全隨機(jī)性會(huì)導(dǎo)致產(chǎn)生大量無效的輸入或格式。2. Intelligent fuzzing 研究目標(biāo)應(yīng)用程序的協(xié)議或文件格式、功能配置,了解各類漏洞的成因,有目的地編寫fuzzer。編寫有效的fuzzer需要花費(fèi)時(shí)間,但能夠?qū)δ承└信d趣的部分集中測(cè)試,因此更有效。在對(duì)目標(biāo)進(jìn)行fuzzing的過程中,也可能存在各種問題校驗(yàn)和、加密、壓縮等措施會(huì)大大增加fuzzer工具的編寫難度;編寫智能化的fuzzer依賴目標(biāo)程序的協(xié)議文檔,因此協(xié)議文檔的完整性影響fuzzing測(cè)試的效果,等等。Fuzzing測(cè)試過程中需要采取措施記錄目標(biāo)的狀態(tài),通常通過日志的方式記錄下各種信息,以便后續(xù)分析。目前比較有名的fuzzer工具有SPIKE和Peach,它們提供了對(duì)許多協(xié)議接口的支持,現(xiàn)有的許多fuzzer都是基于這兩個(gè)框架實(shí)現(xiàn)的。概括的講,F(xiàn)uzzing測(cè)試過程如下第1步生成大量的數(shù)據(jù)作為測(cè)試用例。
第2步將測(cè)試用例輸入到程序中,看程序是否發(fā)生異常。第3步監(jiān)測(cè)并記錄任何引發(fā)程序崩潰或者異常的惡意輸入。第4步審查測(cè)試日志,繼續(xù)深入分析。
發(fā)明內(nèi)容
本發(fā)明的目的是針對(duì)上述已有技術(shù)存在的不足,提出一種針對(duì)軟件缺陷的檢測(cè)方法。本發(fā)明的目的是通過下述技術(shù)方案實(shí)現(xiàn)的。一種針對(duì)軟件缺陷的檢測(cè)方法,其具體操作步驟如下步驟一、收集包含已知缺陷的軟件源代碼程序。步驟二、獲取缺陷代碼表。對(duì)步驟一中所述的軟件程序進(jìn)行處理,確認(rèn)引發(fā)缺陷的相關(guān)代碼,并利用反匯編工具得到引發(fā)缺陷的相關(guān)代碼的匯編代碼,構(gòu)造缺陷代碼表。步驟三、獲取待測(cè)試程序的控制流圖CFG和匯編代碼。分析待測(cè)試程序的可執(zhí)行文件,利用反匯編工具可得到待測(cè)試程序的控制流圖CFG (Control Flow Graph)和匯編代碼??刂屏鲌DCFG表示為G = <N,E>,其中N為控制流圖CFG中的節(jié)點(diǎn)的集合,E為控制流圖CFG中的邊的集合??刂屏鲌DCFG中的每個(gè)節(jié)點(diǎn)對(duì)應(yīng)待測(cè)試程序的可執(zhí)行文件中的一個(gè)匯編代碼段;控制流圖CFG中的每條邊表示各節(jié)點(diǎn)之間的跳轉(zhuǎn)關(guān)系。然后為集合N建立一張節(jié)點(diǎn)起始地址表,其記錄每個(gè)節(jié)點(diǎn)對(duì)應(yīng)的匯編代碼段的起始地址。步驟四、確定待測(cè)試程序匯編代碼中的重點(diǎn)分析代碼段并通過待測(cè)試程序的控制流圖CRi獲取經(jīng)過重點(diǎn)分析代碼段對(duì)應(yīng)的節(jié)點(diǎn)的所有路徑。具體為步驟4. 1 根據(jù)步驟二得到的缺陷代碼表,在步驟三得到的待測(cè)試程序的匯編代碼中查找缺陷代碼表中的代碼;如果在待測(cè)試程序的匯編代碼中出現(xiàn)缺陷代碼表中的代碼,則記錄其位置,確定其為重點(diǎn)分析代碼段。步驟4. 2 在待測(cè)試程序的控制流圖CFG中標(biāo)記該重點(diǎn)分析代碼段對(duì)應(yīng)的節(jié)點(diǎn)位置。步驟4. 3 獲取經(jīng)過標(biāo)記節(jié)點(diǎn)的所有路徑,稱之為可疑路徑。步驟五、對(duì)每條可疑路徑,利用改進(jìn)的Fuzzing測(cè)試方法進(jìn)行檢測(cè),得到待測(cè)試程序的檢測(cè)結(jié)果。所述改進(jìn)的Fuzzing測(cè)試方法與已有Fuzzing測(cè)試方法的區(qū)別在于對(duì)已有Fuzzing測(cè)試方法的第1步生成的測(cè)試用例采用遺傳算法,從中挑選出僅經(jīng)過可疑路徑的測(cè)試用例,并通過多次迭代不斷生成經(jīng)過可疑路徑的測(cè)試用例。其具體過程如下步驟5. 1 將迭代次數(shù)generation的初始值為0,并隨機(jī)生成一組測(cè)試用例X(generation) = Ix1, X2,……,xs} ;s為正整數(shù),表示生成的測(cè)試用例的數(shù)量。設(shè)置記錄X (generation)中的測(cè)試用例經(jīng)過節(jié)點(diǎn)i的次數(shù)Hii的初始值為0 ;表示節(jié)點(diǎn)i轉(zhuǎn)向節(jié)點(diǎn)h的次數(shù)Iiiih的初始值為0 ;節(jié)點(diǎn)i e N ;節(jié)點(diǎn)h e N。步驟5. 2 設(shè)置遺傳算法中使用到的參數(shù)值,包括交叉概率Crossover Rate、變異概率Mutation Rate和最大迭代次數(shù)Max的值。步驟5. 3 設(shè)置表示測(cè)試用例序號(hào)j (j為正整數(shù))的初始值為1。步驟5. 4 將待測(cè)試程序的控制流圖CFG中每個(gè)節(jié)點(diǎn)的狀態(tài)參數(shù)設(shè)置為0,表示測(cè)試用例未經(jīng)過該節(jié)點(diǎn)。步驟5. 5 輸入測(cè)試用例 并對(duì)測(cè)試用例\在執(zhí)行過程中所經(jīng)過每個(gè)節(jié)點(diǎn),作如下操作步驟5. 5. 1 在節(jié)點(diǎn)i,測(cè)試用例\是否使待測(cè)試程序出現(xiàn)異常退出或出錯(cuò)的情況,如果使待測(cè)試程序出現(xiàn)異常退出或出錯(cuò),則結(jié)束對(duì)該條可疑路徑的檢測(cè),開始對(duì)下一條可疑路徑的檢測(cè);否則,執(zhí)行步驟5. 5. 2的操作。步驟5. 5. 2 當(dāng)測(cè)試用例\使程序從節(jié)點(diǎn)i轉(zhuǎn)向下一節(jié)點(diǎn)時(shí),判斷下一節(jié)點(diǎn)的起始地址是否出現(xiàn)在步驟三中所述節(jié)點(diǎn)起始地址表中,如果出現(xiàn)在步驟三中所述節(jié)點(diǎn)起始地址表中,稱下一節(jié)點(diǎn)為節(jié)點(diǎn)h,同時(shí)Hli和Ili, h的值均增加1,并且如果節(jié)點(diǎn)h的狀態(tài)參數(shù)為0,則將其狀態(tài)更新為1 ;然后執(zhí)行步驟5. 6的操作;如果該節(jié)點(diǎn)的轉(zhuǎn)向地址不在步驟三中所述節(jié)點(diǎn)起始地址表中,結(jié)束對(duì)該條可疑路徑的檢測(cè),開始對(duì)下一條可疑路徑的檢測(cè)。步驟5. 6 :j的值增1,并判斷j > s是否成立,如果成立,則執(zhí)行步驟5. 7 ;否則,重復(fù)執(zhí)行步驟5. 4。步驟5. 7 判斷generation彡Max是否成立,如果成立,則認(rèn)為當(dāng)前可疑路徑上不存在潛在缺陷,結(jié)束對(duì)當(dāng)前路徑的檢測(cè);如果不成立,則執(zhí)行步驟5. 8。步驟5. 8 使用公式1,依次計(jì)算待測(cè)試程序的控制流圖CRi中的節(jié)點(diǎn)i到節(jié)點(diǎn)i的下一節(jié)點(diǎn)h的適應(yīng)度值f
權(quán)利要求
1. 一種針對(duì)軟件缺陷的檢測(cè)方法,其特征在于其具體操作步驟如下步驟一、收集包含已知缺陷的軟件源代碼程序;步驟二、獲取缺陷代碼表;對(duì)步驟一中所述的軟件程序進(jìn)行處理,確認(rèn)引發(fā)缺陷的相關(guān)代碼,并利用反匯編工具得到弓I發(fā)缺陷的相關(guān)代碼的匯編代碼,構(gòu)造缺陷代碼表;步驟三、獲取待測(cè)試程序的控制流圖CRi和匯編代碼;分析待測(cè)試程序的可執(zhí)行文件,利用反匯編工具可得到待測(cè)試程序的控制流圖CFG和匯編代碼;控制流圖CFG表示為G = <N,E>,其中N為控制流圖CFG中的節(jié)點(diǎn)的集合,E為控制流圖CFG中的邊的集合;控制流圖CRi中的每個(gè)節(jié)點(diǎn)對(duì)應(yīng)待測(cè)試程序的可執(zhí)行文件中的一個(gè)匯編代碼段;控制流圖CRi中的每條邊表示各節(jié)點(diǎn)之間的跳轉(zhuǎn)關(guān)系,并為集合N建立一張節(jié)點(diǎn)起始地址表,其記錄每個(gè)節(jié)點(diǎn)對(duì)應(yīng)的匯編代碼段的起始地址;步驟四、確定待測(cè)試程序匯編代碼中的重點(diǎn)分析代碼段并通過待測(cè)試程序的控制流圖CFG獲取經(jīng)過重點(diǎn)分析代碼段對(duì)應(yīng)的節(jié)點(diǎn)的所有路徑;具體為步驟4. 1 根據(jù)步驟二得到的缺陷代碼表,在步驟三得到的待測(cè)試程序的匯編代碼中查找缺陷代碼表中的代碼;如果在待測(cè)試程序的匯編代碼中出現(xiàn)缺陷代碼表中的代碼,則記錄其位置,確定其為重點(diǎn)分析代碼段;步驟4. 2 在待測(cè)試程序的控制流圖CFG中標(biāo)記該重點(diǎn)分析代碼段對(duì)應(yīng)的節(jié)點(diǎn)位置;步驟4. 3 獲取經(jīng)過標(biāo)記節(jié)點(diǎn)的所有路徑,稱之為可疑路徑;步驟五、對(duì)每條可疑路徑,利用改進(jìn)的Fuzzing測(cè)試方法進(jìn)行檢測(cè),得到待測(cè)試程序的檢測(cè)結(jié)果;所述改進(jìn)的Fuzzing測(cè)試方法與已有Fuzzing測(cè)試方法的區(qū)別在于對(duì)已有Fuzzing測(cè)試方法的第1步生成的測(cè)試用例采用遺傳算法,從中挑選出僅經(jīng)過可疑路徑的測(cè)試用例,并通過多次迭代不斷生成經(jīng)過可疑路徑的測(cè)試用例;其具體過程如下步驟5. 1 將迭代次數(shù)generation的初始值為0,并隨機(jī)生成一組測(cè)試用例X(generation) = Ix1, X2,……,xs} ;s為正整數(shù),表示生成的測(cè)試用例的數(shù)量;設(shè)置記錄X (generation)中的測(cè)試用例經(jīng)過節(jié)點(diǎn)i的次數(shù)Hii的初始值為0 ;表示節(jié)點(diǎn)i轉(zhuǎn)向節(jié)點(diǎn)h的次數(shù)Iiiih的初始值為0 ;節(jié)點(diǎn)i e N ;節(jié)點(diǎn)h e N ;步驟5. 2 設(shè)置遺傳算法中使用到的參數(shù)值,包括交叉概率Crossover Rate、變異概率Mutation Rate和最大迭代次數(shù)Max的值;步驟5. 3 設(shè)置表示測(cè)試用例序號(hào)j的初始值為1 ; j的取值范圍為正整數(shù);步驟5. 4 將待測(cè)試程序的控制流圖CFG中每個(gè)節(jié)點(diǎn)的狀態(tài)參數(shù)設(shè)置為0,表示測(cè)試用例未經(jīng)過該節(jié)點(diǎn);步驟5. 5 輸入測(cè)試用例~,并對(duì)測(cè)試用例\在執(zhí)行過程中所經(jīng)過每個(gè)節(jié)點(diǎn),作如下操作步驟5. 5. 1 在節(jié)點(diǎn)i,測(cè)試用例\是否使待測(cè)試程序出現(xiàn)異常退出或出錯(cuò)的情況,如果使待測(cè)試程序出現(xiàn)異常退出或出錯(cuò),則結(jié)束對(duì)該條可疑路徑的檢測(cè),開始對(duì)下一條可疑路徑的檢測(cè);否則,執(zhí)行步驟5. 5. 2的操作;步驟5. 5. 2 當(dāng)測(cè)試用例\使程序從節(jié)點(diǎn)i轉(zhuǎn)向下一節(jié)點(diǎn)時(shí),判斷下一節(jié)點(diǎn)的起始地址是否出現(xiàn)在步驟三中所述節(jié)點(diǎn)起始地址表中,如果出現(xiàn)在步驟三中所述節(jié)點(diǎn)起始地址表中,稱下一節(jié)點(diǎn)為節(jié)點(diǎn)h,同時(shí)Hli和Ili,h的值均增加1,并且如果節(jié)點(diǎn)h的狀態(tài)參數(shù)為0,則將其狀態(tài)更新為1 ;然后執(zhí)行步驟5. 6的操作;如果該節(jié)點(diǎn)的轉(zhuǎn)向地址不在步驟三中所述節(jié)點(diǎn)起始地址表中,結(jié)束對(duì)該條可疑路徑的檢測(cè),開始對(duì)下一條可疑路徑的檢測(cè);步驟5. 6 j的值增1,并判斷j > s是否成立,如果成立,則執(zhí)行步驟5. 7 ;否則,重復(fù)執(zhí)行步驟5. 4 ;步驟5. 7 判斷generation彡Max是否成立,如果成立,則認(rèn)為當(dāng)前可疑路徑上不存在潛在缺陷,結(jié)束對(duì)當(dāng)前路徑的檢測(cè);如果不成立,則執(zhí)行步驟5.8 ;步驟5. 8 使用公式1,依次計(jì)算待測(cè)試程序的控制流圖CRi中的節(jié)點(diǎn)i到節(jié)點(diǎn)i的下一節(jié)點(diǎn)h的適應(yīng)度值
全文摘要
本發(fā)明涉及一種針對(duì)軟件缺陷(software vulnerability)的檢測(cè)方法,屬于信息安全技術(shù)領(lǐng)域。其具體操作步驟如下①收集包含已知缺陷的軟件源代碼程序;②獲取缺陷代碼表;③獲取待測(cè)試程序的控制流圖CFG和匯編代碼;④確定待測(cè)試程序匯編代碼中的重點(diǎn)分析代碼段并通過待測(cè)試程序的控制流圖CFG獲取經(jīng)過重點(diǎn)分析代碼段對(duì)應(yīng)的節(jié)點(diǎn)的所有路徑;⑤對(duì)每條可疑路徑,利用改進(jìn)的Fuzzing測(cè)試方法進(jìn)行檢測(cè),得到待測(cè)試程序的檢測(cè)結(jié)果。本發(fā)明在確定適應(yīng)度函數(shù)時(shí),消除了對(duì)被測(cè)程序的源代碼的依賴,并保持了信息的可用性;消除了抽象語法樹中的冗余信息并保持有用信息的完整性因此具有更好的實(shí)用性和更高的效率。
文檔編號(hào)G06F11/36GK102385550SQ20101026680
公開日2012年3月21日 申請(qǐng)日期2010年8月30日 優(yōu)先權(quán)日2010年8月30日
發(fā)明者王崑聲, 秦強(qiáng), 胡昌振, 閆懷志 申請(qǐng)人:北京理工大學(xué)