国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      軟件源代碼安全漏洞的檢測(cè)方法及檢測(cè)裝置的制作方法

      文檔序號(hào):6466499閱讀:298來源:國(guó)知局

      專利名稱::軟件源代碼安全漏洞的檢測(cè)方法及檢測(cè)裝置的制作方法
      技術(shù)領(lǐng)域
      :本發(fā)明涉及軟件安全
      技術(shù)領(lǐng)域
      ,特別涉及一種軟件源代碼安全漏洞的檢測(cè)方法以及檢測(cè)裝置。
      背景技術(shù)
      :目前,軟件被越來越多的用于處理各種敏感信息和高價(jià)值信息,例如商業(yè)信息、財(cái)政信息等,這使得軟件日益成為企圖獲取這些信息的攻擊者的攻擊目標(biāo)。攻擊者企圖挖掘軟件中的安全漏洞,以干擾軟件運(yùn)行,實(shí)現(xiàn)對(duì)軟件的惡意操作。其中,源代碼編寫階段引入的安全漏洞是最常見的安全漏洞。因此,開發(fā)一種有效的安全漏洞檢測(cè)方法,以檢測(cè)存在于源代碼中的潛在安全漏洞是很有必要的。目前,可以采用自動(dòng)代碼安全審計(jì)技術(shù)從軟件源代碼中檢測(cè)出安全漏洞。自動(dòng)代碼安全審計(jì)是一種基于軟件源代碼分析的安全漏洞檢測(cè)技術(shù),它是靜態(tài)檢測(cè),屬于白盒(whitebox)測(cè)試技術(shù)。自動(dòng)代碼安全審計(jì)是在不運(yùn)行軟件的情況下,對(duì)軟件的源代碼進(jìn)行靜態(tài)分析,從而獲取軟件結(jié)構(gòu)。然后再根據(jù)分析結(jié)果找出軟件中的安全漏洞。但是,其缺點(diǎn)在于,靜態(tài)的源代碼分析僅僅適用于檢測(cè)與語法相關(guān)的安全漏洞,例如緩沖溢出、競(jìng)爭(zhēng)條件等,但是對(duì)于分析諸如命令注入和數(shù)據(jù)庫注入等與語義相關(guān)的安全漏洞,就顯得無能為力。從以上所述可見,目前的安全漏洞檢測(cè)方法雖然能夠檢測(cè)到存在于軟件中的一些安全漏洞,但是由于其檢測(cè)方式局限,檢測(cè)不夠全面,不能有效的檢測(cè)出存在于軟件源代碼中的各種安全漏洞。
      發(fā)明內(nèi)容為了解決以上問題,本發(fā)明一方面提供一種軟件源代碼安全漏洞的檢測(cè)方法,另一方面提供一種軟件源代碼安全漏洞的檢測(cè)裝置,以便能夠有效地檢測(cè)出存在于軟件源代碼中的安全漏洞。本發(fā)明所提供的軟件源代碼安全漏洞的檢測(cè)方法,包括-象語法樹AST;根據(jù)預(yù)先定義的可操縱點(diǎn)和風(fēng)險(xiǎn)點(diǎn),確定所建立的AST的各節(jié)點(diǎn)中的可操縱點(diǎn)和風(fēng)險(xiǎn)點(diǎn);搜索所述AST中的可操縱點(diǎn)到風(fēng)險(xiǎn)點(diǎn)之間的執(zhí)行路徑,如果所述執(zhí)行路徑上的風(fēng)險(xiǎn)點(diǎn)能夠被所述執(zhí)行路徑上的可操縱點(diǎn)控制,則將所述執(zhí)行路徑確定為可能導(dǎo)致安全漏洞的潛在風(fēng)險(xiǎn)執(zhí)行路徑。.根據(jù)本發(fā)明的方法,其中,所述可操縱點(diǎn)為輸入類函數(shù);所述風(fēng)險(xiǎn)點(diǎn)為執(zhí)行類函數(shù)和/或賦值語句。根據(jù)本發(fā)明的方法,其中,進(jìn)一步預(yù)先定義可操縱點(diǎn)中的可操縱參數(shù)和風(fēng)險(xiǎn)點(diǎn)中的風(fēng)險(xiǎn)參數(shù)。根據(jù)本發(fā)明的方法,其中,確定所述執(zhí)行路徑上的風(fēng)險(xiǎn)點(diǎn)能夠被所述執(zhí)行路徑上的可操縱點(diǎn)控制的方式為如果所述執(zhí)行路徑上的風(fēng)險(xiǎn)點(diǎn)中的風(fēng)險(xiǎn)參數(shù)被所述執(zhí)行路徑上的可操縱點(diǎn)中的可操縱參數(shù)污染,則確定所述執(zhí)行路徑上的風(fēng)險(xiǎn)點(diǎn)能夠被所述執(zhí)行路徑上的可操縱點(diǎn)控制。根據(jù)本發(fā)明的方法,其中,確定所述執(zhí)行路徑上的風(fēng)險(xiǎn)點(diǎn)中的風(fēng)險(xiǎn)參數(shù)被所述執(zhí)行路徑上的可操縱點(diǎn)中的可操縱參數(shù)污染的方式為將所述執(zhí)行路徑上的可操縱點(diǎn)中的可操縱參數(shù)作為初始潛在可操縱變量PEV;確定所述執(zhí)行路徑上被所述初始PEV污染的中間PEV;判斷所述執(zhí)行路徑上的風(fēng)險(xiǎn)點(diǎn)中的風(fēng)險(xiǎn)參數(shù)是否是所述初始PEV或中間PEV,如果是,則判定所述執(zhí)行路徑上的風(fēng)險(xiǎn)點(diǎn)中的風(fēng)險(xiǎn)參數(shù)被所述執(zhí)行路徑上的可操縱點(diǎn)中的可操縱參數(shù)污染。根據(jù)本發(fā)明的方法,其中,獲取所述執(zhí)行路徑上被所述初始PEV污染的中間PEV的方式為數(shù)據(jù)流分析方式。根據(jù)本發(fā)明的方法,其中,獲取所述執(zhí)行路徑上被所述初始PEV污染的中間PEV的方式進(jìn)一步包括控制流分析方式。根據(jù)本發(fā)明的方法,其中,該方法進(jìn)一步包括根據(jù)所確定的潛在風(fēng)險(xiǎn)執(zhí)行路徑生成測(cè)試報(bào)告。根據(jù)本發(fā)明的方法,其中,所述根據(jù)所確定的潛在風(fēng)險(xiǎn)執(zhí)行路徑生成測(cè)試報(bào)告包括如果所述潛在風(fēng)險(xiǎn)執(zhí)行路徑能夠直接用測(cè)試輸入和測(cè)試條件表示,則根據(jù)所述測(cè)試輸入和測(cè)試條件生成測(cè)試腳本,否則,生成記載所述潛在風(fēng)險(xiǎn)執(zhí)行路徑的測(cè)試報(bào)告。根據(jù)本發(fā)明的方法,其中,所述待檢測(cè)軟件的源代碼為高級(jí)編程語言源代碼,或者為將可執(zhí)行程序代碼進(jìn)行反編譯而得到的匯編語言源代碼。本發(fā)明所提供的軟件源代碼安全漏洞的檢測(cè)裝置,包括源代碼處理單元和路徑分析單元;其中,所述源代碼處理單元,用于建立待檢測(cè)軟件的源代碼對(duì)應(yīng)的AST,根據(jù)預(yù)先定義的可操縱點(diǎn)和風(fēng)險(xiǎn)點(diǎn),確定所建立的AST的各節(jié)點(diǎn)中的可操縱點(diǎn)和風(fēng)險(xiǎn)點(diǎn);所述路徑分析單元,用于在所述源代碼處理單元確定的AST的各節(jié)點(diǎn)中,確定可操縱點(diǎn)到風(fēng)險(xiǎn)點(diǎn)之間的執(zhí)行路徑,如果所述執(zhí)行路徑上的風(fēng)險(xiǎn)點(diǎn)能夠被所述執(zhí)行路徑上的可操縱點(diǎn)控制,則將所述執(zhí)行路徑確定為可能導(dǎo)致安全漏洞的潛在風(fēng)險(xiǎn)執(zhí)行路徑。根據(jù)本發(fā)明的裝置,其中,所述源代碼處理單元包括配置模塊、分析模塊,節(jié)點(diǎn)類型定位模塊和AST記錄模塊;所述配置模塊,用于記錄預(yù)先定義的可操縱點(diǎn)和風(fēng)險(xiǎn)點(diǎn);所述分析模塊,用于對(duì)待檢測(cè)軟件的源代碼進(jìn)行詞法、語法和語義分析,建立AST;所述節(jié)點(diǎn)類型定位模塊,用于根據(jù)所述配置模塊中記錄的預(yù)先定義的可操縱點(diǎn)和風(fēng)險(xiǎn)點(diǎn),確定所述分析模塊建立的AST的各節(jié)點(diǎn)中的可操縱點(diǎn)和風(fēng)險(xiǎn)點(diǎn),并將所述AST以及所確定的可操縱點(diǎn)和風(fēng)險(xiǎn)點(diǎn)記錄在AST記錄模塊中;所述AST記錄模塊,用于記錄所述AST以及所確定的可操縱點(diǎn)和風(fēng)險(xiǎn)點(diǎn),并提供給所述路徑分析單元。根據(jù)本發(fā)明的裝置,其中,所述源代碼處理單元進(jìn)一步包括反編譯模塊,用于將可執(zhí)行程序代碼反編譯為匯編語言源代碼,并發(fā)送給所述分析模塊。根據(jù)本發(fā)明的裝置,其中,所述路徑分析單元包括執(zhí)行路徑定位模塊和漏洞定位模塊;所述執(zhí)行路徑定位模塊,用于在所述AST中搜索可操縱點(diǎn)到風(fēng)險(xiǎn)點(diǎn)之間的執(zhí)行路徑,并將搜索到執(zhí)行路徑通知給所述漏洞定位模塊;所述漏洞定位模塊,用于在接收到所述執(zhí)行路徑定位模塊的通知后,確定所述執(zhí)行路徑上的風(fēng)險(xiǎn)點(diǎn)是否能夠被所述執(zhí)行路徑上的可操縱點(diǎn)控制,如果是,則將所述執(zhí)行路徑確定為潛在風(fēng)險(xiǎn)執(zhí)行路徑。根據(jù)本發(fā)明的裝置,其中,該裝置進(jìn)一步包括安全測(cè)試用例生成單元,用于根據(jù)所述路徑分析單元確定的潛在風(fēng)險(xiǎn)執(zhí)行路徑生成測(cè)試報(bào)告。從上述方案可以看出,本發(fā)明檢測(cè)安全漏洞的基礎(chǔ)是對(duì)源代碼進(jìn)行分析從而建立AST,由于建立AST的過程不僅限于靜態(tài)的詞法和語法分析,還包括語義分析,因此相對(duì)于自動(dòng)代碼安全審計(jì)技術(shù)來說,本發(fā)明對(duì)源代碼的分析過程更為全面。其次,本發(fā)明對(duì)建立的AST進(jìn)行路徑分析,找到能夠由可操縱點(diǎn)控制風(fēng)險(xiǎn)點(diǎn)的執(zhí)行路徑。由于利用這些執(zhí)行路徑,攻擊者能夠通過向可操縱點(diǎn)輸入精心設(shè)計(jì)的數(shù)據(jù)而控制風(fēng)險(xiǎn)點(diǎn),從而導(dǎo)致軟件執(zhí)行出現(xiàn)錯(cuò)誤甚至陷入癱瘓。因此,本發(fā)明找到的能夠由可操縱點(diǎn)控制風(fēng)險(xiǎn)點(diǎn)的執(zhí)行路徑就是安全漏洞??梢?,本發(fā)明通過在全面的源代碼分析而建立的AST中進(jìn)行路徑搜索從而得到各種安全漏洞,使得本發(fā)明可以更為有效的將軟件源代碼中的各種安全漏洞査找出來,并作為完善軟件的依據(jù),從而有效的避免了風(fēng)險(xiǎn)點(diǎn)被惡意操縱,增強(qiáng)了軟件源代碼的安全性。下面將通過參照附圖詳細(xì)描述本發(fā)明的示例性實(shí)施例,使本領(lǐng)域的普通技術(shù)人員更清楚本發(fā)明的上述及其他特征和優(yōu)點(diǎn),附圖中圖1為本發(fā)明實(shí)施例中軟件安全漏洞檢測(cè)方法的流程圖;圖2為本發(fā)明另一實(shí)施例中軟件安全漏洞檢測(cè)方法的流程圖;圖3為本發(fā)明實(shí)施例中一種AST的結(jié)構(gòu)示意圖;圖4為本發(fā)明實(shí)施例中軟件安全漏洞檢測(cè)裝置的結(jié)構(gòu)示意圖;圖5為圖4中源代碼處理單元1的結(jié)構(gòu)示意圖;圖6為圖4中路徑分析單元2的結(jié)構(gòu)示意圖。具體實(shí)施例方式為使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下參照附圖并舉實(shí)施例,對(duì)本發(fā)明進(jìn)一步詳細(xì)說明。在實(shí)際中,攻擊者通過輸入精心設(shè)計(jì)的特定數(shù)據(jù),使得軟件按照某種路徑執(zhí)行,最終導(dǎo)致緩沖溢出、代碼注入等安全問題。這些威脅軟件安全的執(zhí)行路徑稱為潛在風(fēng)險(xiǎn)執(zhí)行路徑(PVEP,PotentialvulnerableExecutionPath),是攻擊者挖掘的對(duì)象。因此本發(fā)明通過搜索軟件源代碼中的潛在風(fēng)險(xiǎn)執(zhí)行路徑達(dá)到檢測(cè)安全漏洞的目的?;谝陨峡紤],本發(fā)明提供了一種軟件安全漏洞的檢測(cè)方案,該方案通過分析軟件源代碼建立抽象語法樹(AST,AbstractSyntaxTree),根據(jù)預(yù)先定義的可操縱點(diǎn)(EP,ExploitablePoints)和風(fēng)險(xiǎn)點(diǎn)(VP,VulnerablePoints),確定所建立的AST的各節(jié)點(diǎn)中的EP和VP;然后通過對(duì)所述AST進(jìn)行路徑分析,確定EP到VP之間的執(zhí)行路徑,如果所述執(zhí)行路徑上的VP能夠被所述執(zhí)行路徑上的EP控制,則將查找到的執(zhí)行路徑確定為可能導(dǎo)致安全漏洞的PVEP。其中,EP是指軟件源代碼中的輸入點(diǎn)。通過EP,可以從軟件外部向軟件輸入命令或數(shù)據(jù),以控制軟件運(yùn)行狀態(tài),進(jìn)而完成各種預(yù)定任務(wù)。然而,如果EP被攻擊者利用,攻擊者可以通過EP輸入特定命令或數(shù)據(jù),實(shí)現(xiàn)對(duì)軟件的惡意操作。EP通常是以函數(shù)形式存在于軟件源代碼中的。以C語言源代碼為例,可以將動(dòng)態(tài)鏈接庫(DLL)、系統(tǒng)調(diào)用接口(SCI)、應(yīng)用程序編程接口(API)以及庫函數(shù)等提供的輸入類函數(shù)定義為EP。輸入類函數(shù)包括用戶輸入函數(shù)(如scanf())、系統(tǒng)環(huán)境輸入函數(shù)(如getenv())和網(wǎng)絡(luò)輸入函數(shù)(如read())等。在實(shí)際應(yīng)用中,EP也可以是用戶自定義的函數(shù)。VP是指軟件源代碼中的執(zhí)行點(diǎn)。通過VP,可以進(jìn)行多種處理以執(zhí)行各種預(yù)訂任務(wù)。然而,如果這些執(zhí)行點(diǎn)被攻擊者通過EP間接操縱,將可以導(dǎo)致軟件運(yùn)行錯(cuò)誤、崩潰等不良后果。VP通常包括函數(shù)和賦值語句。仍以C語言源代碼為例,可以將DLL、SCI、API以及庫函數(shù)等提供的執(zhí)行類函數(shù)和賦值語句定義為VP。執(zhí)行類函數(shù)包括訪問變量執(zhí)行函數(shù)(如execlp())、操作系統(tǒng)(OS,OperatingSystem)命令執(zhí)行函數(shù)(如system())、數(shù)據(jù)庫命令執(zhí)行函數(shù)(如嵌入式的數(shù)據(jù)庫査詢命令EXECSQL)等;賦值語句例如包括字符串拷貝函數(shù)strcpy()。以上所述的訪問變量執(zhí)行函數(shù)可能導(dǎo)致代碼注入漏洞,OS命令執(zhí)行函數(shù)可能導(dǎo)致代碼注入漏洞,數(shù)據(jù)庫命令執(zhí)行函數(shù)可能導(dǎo)致數(shù)據(jù)庫注入漏洞,賦值語句可能導(dǎo)致緩沖溢出漏洞。此外,當(dāng)對(duì)資源(文件、網(wǎng)絡(luò)等)所執(zhí)行的訪問次序異常,造成對(duì)同一資源的競(jìng)爭(zhēng)時(shí),可以導(dǎo)致競(jìng)爭(zhēng)條件漏洞,其后果是程序無法正常運(yùn)行。在實(shí)際應(yīng)用中,VP也可以為用戶自定義函數(shù)。由以上所述可見,本發(fā)明通過建立AST并對(duì)AST進(jìn)行路徑分析從而確定PEVP。由于建立AST的過程不僅限于靜態(tài)的詞法和語法分析,還包括語義分析,因此在建立的AST的基礎(chǔ)上進(jìn)行路徑分析所找到的PEVP可以系統(tǒng)、全面地反映軟件源代碼中的各種安全漏洞,實(shí)現(xiàn)了安全漏洞的有效檢測(cè)。其中,以上分析源代碼并建立AST的過程可以采用編譯器中的前端編譯器完成。編譯器的功能是讀取程序源代碼并翻譯為目標(biāo)語言?,F(xiàn)有的編譯器包括前端編譯器和后端編譯器,前端編譯器對(duì)源代碼進(jìn)行詞法、語法和語義分析,建立AST,同時(shí)還將源代碼轉(zhuǎn)換為編譯器的內(nèi)部表述(IR,Intermediate),即編譯器能夠識(shí)別的語言。后端編譯器分析并優(yōu)化內(nèi)部表述,最后生成目標(biāo)代碼。本發(fā)明應(yīng)用前端編譯器對(duì)源代碼進(jìn)行詞法、語法和語義分析,生成AST。圖1為本發(fā)明一個(gè)實(shí)施例中軟件安全漏洞檢測(cè)方法的流程圖。該實(shí)施例采用GNUC編譯器(GCC,GNUCCompiler)中的前端編譯器CC1作為分析并建立AST的模塊。Linux系統(tǒng)下的GCC是GNU推出的功能強(qiáng)大、性能優(yōu)越的多平臺(tái)編譯器。其中,GNU為"GNU'sNotUnix"的首字母縮寫語。如圖1所示,該方法包括以下步驟步驟101:讀取待檢測(cè)軟件的源代碼和預(yù)先定義的EP和VP。本步驟中,可以將預(yù)先定義的EP和VP分別記錄在EP配置文件和VP配置文件中。EP配置文件和VP配置文件也可以為同一個(gè)文件。其中,EP配置文件由多行組成,每行描述一個(gè)EP。EP配置文件的格式可以為函數(shù)名可操縱參數(shù)。這里,可操縱參數(shù)為函數(shù)的某個(gè)或某些輸入?yún)?shù)。由于一個(gè)函數(shù)可能具有多個(gè)輸入?yún)?shù),并不是每個(gè)參數(shù)都可能被攻擊者直接利用,因此可以根據(jù)需要具體定義EP中的哪個(gè)輸入?yún)?shù)為可操縱參數(shù)。以C語言中的字符串輸入函數(shù)gets()為例EP配置文件中記錄了gets:l,表示函數(shù)gets()為一個(gè)EP;gets()中只有一個(gè)輸入?yún)?shù),其第一個(gè)也是唯一一個(gè)輸入?yún)?shù)為可操縱參數(shù)。其中,gets()的輸入?yún)?shù)為輸入的字符串變量。以C語言源代碼為例,可以定義為EP的函數(shù)包括但不限于從文件中讀數(shù)據(jù)函數(shù)fread()、從文件句柄指示的文件中讀數(shù)據(jù)函數(shù)read()、從文件句柄指示的文件的指定偏移量處讀數(shù)據(jù)函數(shù)pread()、從文件中讀字符串函數(shù)fgets()、從標(biāo)準(zhǔn)輸入設(shè)備中輸入字符串函數(shù)gets()、從文件中讀寬字字符串函數(shù)fgetws()、從系統(tǒng)環(huán)境中取主機(jī)名函數(shù)gethostname()、從系統(tǒng)環(huán)境中取域名函數(shù)getdomainname()、從標(biāo)準(zhǔn)輸入設(shè)備中輸入數(shù)據(jù)函數(shù)scanf()、從字符串中讀數(shù)據(jù)函數(shù)sscanf()和從文件中讀數(shù)據(jù)函數(shù)fscanf(),等等。其中,VP配置文件由多行組成,每行描述一個(gè)VP。VP配置文件的格式可以為函數(shù)名風(fēng)險(xiǎn)參數(shù)。這里,風(fēng)險(xiǎn)參數(shù)為函數(shù)的某個(gè)或某些輸入?yún)?shù)。由于一個(gè)函數(shù)可能具有多個(gè)輸入?yún)?shù),并不是每個(gè)參數(shù)都會(huì)被攻擊者間接操縱并導(dǎo)致安全漏洞,因此可以根據(jù)需要具體定義VP中的哪個(gè)輸入?yún)?shù)為風(fēng)險(xiǎn)參數(shù)。當(dāng)風(fēng)險(xiǎn)參數(shù)被操縱時(shí),其所在函數(shù)將導(dǎo)致安全漏洞。以C語言中的命令執(zhí)行函數(shù)之一system()為例VP配置文件中記錄了system:l,表示函數(shù)system()為一個(gè)VP,其第一個(gè)輸入?yún)?shù)為風(fēng)險(xiǎn)參數(shù)。當(dāng)函數(shù)system()的第一個(gè)參數(shù)被污染(tainted),或者說被操縱時(shí),函數(shù)system()可以被攻擊者通過某個(gè)EP控制,從而造成代碼注入的安全漏洞。其中,systemO的第一個(gè)參數(shù)為被執(zhí)行的命令名。以C語言源代碼為例,可以定義為VP的函數(shù)包括但不限于執(zhí)行shell命令函數(shù)system()、執(zhí)行指定的程序函數(shù)execve()、執(zhí)行指定路徑下的程序函數(shù)execl()、執(zhí)行指定的程序文件函數(shù)exedp()、執(zhí)行指定路徑下的程序函數(shù)execle()、執(zhí)行指定路徑下的程序函數(shù)execv()、執(zhí)行指定的程序文件函數(shù)execvp()和創(chuàng)建一個(gè)進(jìn)程執(zhí)行命令函數(shù)popen(),等等。步驟102:對(duì)讀取的源代碼進(jìn)行詞法、語法和語義分析,建立AST,并根據(jù)預(yù)先定義的EP和VP,確定建立的AST中的EP和VP。本步驟中,通過對(duì)讀取的源代碼進(jìn)行詞法、語法和語義分析以建立AST的過程是現(xiàn)有技術(shù)。其中,詞法分析是將整個(gè)源代碼分解成多個(gè)詞元(tokens),每個(gè)詞元是一個(gè)單獨(dú)的語言原子單元(atomicunit),例如程序語句中的關(guān)鍵字(keyword)、標(biāo)識(shí)符(identifier)、符號(hào)名(symbolname),詞法分析是生成AST的第一步。語法分析是通過分析各個(gè)詞元的順序來識(shí)別程序的語法結(jié)構(gòu)。語法分析階段開始建立分析樹,即AST。AST是一種釆用形式化(formal)文法規(guī)則描述的樹結(jié)構(gòu),并采用這種樹結(jié)構(gòu)表示詞元順序。語義分析是在AST中添加語義信息,并執(zhí)行語義檢查。AST是在語法和語義分析的交替進(jìn)行過程中建立起來的。AST中的節(jié)點(diǎn)反映了源代碼中的程序語句。每個(gè)節(jié)點(diǎn)都可以有子節(jié)點(diǎn),每個(gè)子節(jié)點(diǎn)又可以有自己的子節(jié)點(diǎn)。每個(gè)節(jié)點(diǎn)都具有至少一個(gè)屬性,例如該節(jié)點(diǎn)所記錄的程序語句的位置(Location)、類型(Type)、有效范圍(Scope)等。在建立好AST之后,或在建立AST的過程中,逐一判斷AST上各節(jié)點(diǎn)是否為預(yù)先定義的EP或VP,如果AST上的某節(jié)點(diǎn)與預(yù)先定義的EP相同,則將該節(jié)點(diǎn)記錄為EP,如果AST上的某節(jié)點(diǎn)與預(yù)先定義的VP相同,則將該節(jié)點(diǎn)記錄為VP。本步驟在記錄EP和VP時(shí),可以采用將AST中的EP和VP記錄在表格中的方式,也可以采用為AST的各節(jié)點(diǎn)增加EP屬性和W屬性的方式。例如,當(dāng)某節(jié)點(diǎn)為EP時(shí),則將其EP/VP屬性值置為預(yù)設(shè)值,例如置l;當(dāng)某節(jié)點(diǎn)為VP時(shí),則將其EP/VP屬性值置為預(yù)設(shè)值,例如置0。當(dāng)然,還可以將EP屬性和VP屬性采用一個(gè)兩位的比特序列表示,該比特序列中的兩位比特分別表示EP屬性和VP屬性。步驟103:査找AST中EP到VP之間的執(zhí)行路徑,如果所述執(zhí)行路徑上的VP能夠被所述執(zhí)行路徑上的EP控制,則確定所述執(zhí)行路徑為PVEP。本步驟中,將AST中的各EP依次作為當(dāng)前EP,并針對(duì)當(dāng)前EP進(jìn)行如下處理al、將當(dāng)前EP中定義為可操縱參數(shù)的輸入變量作為初始PEV(PotentialExploitableVariable,潛在可操縱變量);其中,初始PEV可能為一個(gè)或多于一個(gè)變量;bl、從當(dāng)前EP開始,按預(yù)設(shè)搜索算法在AST中進(jìn)行路徑搜索,逐一確定當(dāng)前搜索節(jié)點(diǎn)是否為VP以及當(dāng)前搜索節(jié)點(diǎn)中出現(xiàn)的中間PEV;如果當(dāng)前搜索節(jié)點(diǎn)是VP,則確定該VP的風(fēng)險(xiǎn)參數(shù)是否為其所在執(zhí)行路徑上的初始PEV或中間PEV;如果該VP的風(fēng)險(xiǎn)參數(shù)是其所在執(zhí)行路徑上的初始PEV或中間PEV,則確定該VP與當(dāng)前EP之間的執(zhí)行路徑為一條PVEP。上述al與M步驟針對(duì)AST中的各EP重復(fù)進(jìn)行,直至針對(duì)所述各EP的路徑搜索全部完成。在所述步驟bl中,進(jìn)行路徑搜索時(shí)采用的搜索算法通常為深度優(yōu)先搜索(deep-firstsearching)法則,其搜索方式是從樹的根節(jié)點(diǎn)開始,優(yōu)先向縱深搜索,直至到達(dá)樹的最后一級(jí)節(jié)點(diǎn),在搜索中如果遇到樹的分叉,則可以根據(jù)預(yù)先設(shè)置的原則先搜索左分支,或先搜索右分支。以先搜索左分支為例,,再搜索左支子節(jié)點(diǎn)的左支子節(jié)點(diǎn),直到到達(dá)樹的最后一級(jí)節(jié)點(diǎn),然后,返回該最后一級(jí)節(jié)點(diǎn)的父節(jié)點(diǎn),判斷該父節(jié)點(diǎn)是否有右支子節(jié)點(diǎn),如果有,則繼續(xù)搜索該右支子節(jié)點(diǎn),再搜索該右支子節(jié)點(diǎn)的左支子節(jié)點(diǎn),直到到達(dá)樹的最后一級(jí)節(jié)點(diǎn);否則,返回再上一級(jí)節(jié)點(diǎn);如此類推,直到遍歷了由該根節(jié)點(diǎn)出發(fā)的所有路徑,至此,針對(duì)該根節(jié)點(diǎn)的路徑搜索結(jié)束。在所述步驟bl中,針對(duì)路徑搜索過程中的每一個(gè)當(dāng)前搜索節(jié)點(diǎn),都進(jìn)行該節(jié)點(diǎn)是否為W的判斷,如果是,則確定找到一條當(dāng)前EP到該VP之間的執(zhí)行路徑。所述步驟bl中,當(dāng)前搜索節(jié)點(diǎn)中出現(xiàn)的中間PEV可以通過數(shù)據(jù)流分析(dataflowanalysis)確定。此外,為了增加PEV分析的有效性,還可以在數(shù)據(jù)流分析的基礎(chǔ)上輔以控制流分析(controlflowanalysis)。數(shù)據(jù)流分析和控制流分析可以在搜索到每一個(gè)節(jié)點(diǎn)時(shí)進(jìn)行。其中,數(shù)據(jù)流分析是指對(duì)于變量的定義和使用進(jìn)行分析。例如,當(dāng)一個(gè)變量為PEV,可以理解為該變量會(huì)被污染,將該P(yáng)EV拷貝或賦值給另一個(gè)變量時(shí),則另一個(gè)變量也會(huì)被污染,成為另一個(gè)PEV,這個(gè)分析過程就是數(shù)據(jù)流分析。而當(dāng)程序在將一個(gè)變量拷貝或賦值給另一個(gè)變量之前,進(jìn)行了合法性檢査,例如判斷第一個(gè)變量的長(zhǎng)度是否超過合法的長(zhǎng)度,變量的取值中是否包括非法字符(例如"/"),如果判斷為是,則不執(zhí)行拷貝或賦值操作,或在進(jìn)行相應(yīng)處理后再進(jìn)行拷貝或賦值操作,那么,即使有拷貝或賦值語句,第二個(gè)變量也不會(huì)被污染。這種判斷程序中是否有合法性檢查語句的分析過程就屬于控制流分析的一種分析方式。步驟104:根據(jù)檢測(cè)到的PVEP,生成測(cè)試用例,并上報(bào)給測(cè)試人員。在實(shí)際中,如果一條PVEP的執(zhí)行過程比較簡(jiǎn)單,可以直接采用測(cè)試輸入和測(cè)試條件表示時(shí),將測(cè)試輸入和測(cè)試條件作為測(cè)試腳本內(nèi)容并上報(bào)。其中,測(cè)試輸入為用戶、測(cè)試環(huán)境或網(wǎng)絡(luò)輸入的參數(shù)值;測(cè)試條件是令該P(yáng)VEP上的VP能夠被EP控制的條件信息。當(dāng)PVEP的執(zhí)行過程比較復(fù)雜,因而測(cè)試PVEP的測(cè)試輸入和測(cè)試條件不能簡(jiǎn)單地確定,而需要人工設(shè)置時(shí),可以將PVEP的路徑描述記載在測(cè)試報(bào)告中并輸出給測(cè)試人員,由測(cè)試人員根據(jù)測(cè)試報(bào)告進(jìn)行后續(xù)測(cè)試。PVEP的路徑描述可以為該條執(zhí)行路徑上的各節(jié)點(diǎn)所記錄的程序語句的行號(hào),描述方式可以是表格方式,也可以是堆棧方式。下面,舉實(shí)例對(duì)PVEP的執(zhí)行過程比較簡(jiǎn)單,可以生成測(cè)試腳本的情況進(jìn)行描述。首先,舉一個(gè)采用測(cè)試輸入作為測(cè)試腳本的實(shí)例1。實(shí)例1中,VP中的風(fēng)險(xiǎn)參數(shù)是EP中的可操縱參數(shù),實(shí)例1中待檢測(cè)軟件程序的C語言源代碼如下voidmain()charstr[100];scanf("%s,,,str);system(str);CC1讀取該待檢測(cè)軟件的源代碼后,生成AST。其中,節(jié)點(diǎn)scanf()為EP,其輸入?yún)?shù)str為可操縱參數(shù),即變量str為初始PEV;system()為VP,其輸入?yún)?shù)str為風(fēng)險(xiǎn)參數(shù)。由于變量str為初始PEV,因此從scanf("%s",str)到system(str)之間的執(zhí)行路徑為PVEP。通過對(duì)該P(yáng)VEP的分析可以發(fā)現(xiàn),此PVEP直接由用戶輸入str,未做任何檢查就當(dāng)作操作系統(tǒng)命令執(zhí)行,將會(huì)導(dǎo)致代碼注入漏洞。因此,可以令stF"cat/etc/password",那么當(dāng)沿該P(yáng)VEP執(zhí)行時(shí),會(huì)顯示保存在/etc路徑下的password文件,即系統(tǒng)用戶名文件。由于當(dāng)黑客攻擊系統(tǒng)時(shí),首先需要獲取系統(tǒng)中合法用戶的名單,然后黑客才可能破解這些用戶的口令,所以保存合法用戶名單的用戶名文件是敏感信息,因此本實(shí)例將str="cat/etc/password"作為測(cè)試腳本的內(nèi)容。該str二"cat/etc/password"為測(cè)試輸入。根據(jù)PVEP的檢測(cè)結(jié)果,測(cè)試人員可以對(duì)軟件源代碼進(jìn)行完善,例如可以在system(str)函數(shù)調(diào)用之前增加判斷語句,判斷str的值是否為安全值,例如規(guī)定str不能是被禁止訪問的路徑名cat/etc/password;如果str值安全,則執(zhí)行system(str);否則,不執(zhí)行system(str)。然后重新采用上述測(cè)試腳本,對(duì)修改后的軟件源代碼進(jìn)行測(cè)試,如果不再顯示系統(tǒng)的用戶名文件,則證明原有的安全漏洞被成功彌補(bǔ)。可見,生成測(cè)試腳本可以實(shí)現(xiàn)自動(dòng)的軟件測(cè)試,減輕測(cè)試人員的負(fù)擔(dān),提高測(cè)試和效率。再舉一個(gè)采用測(cè)試輸入作為測(cè)試腳本的實(shí)例2。實(shí)例2中,VP中的風(fēng)險(xiǎn)參數(shù)并不是EP中的可操縱參數(shù),但是VP中的風(fēng)險(xiǎn)參數(shù)受到EP中的可操縱參數(shù)的污染,實(shí)例3的C語言源代碼為如下形式voidmain()charstr[100],*A;scanf("%s",str);A=str;system(A);其中,scanf()為EP,其輸入?yún)?shù)str為可操縱參數(shù),即變量str為初始PEV;system()為VP,其輸入?yún)?shù)A為風(fēng)險(xiǎn)參數(shù)。由于A被str賦值,則A是中間PEV,因此,從scanf("。/。s",str)到system(str)之間的執(zhí)行路徑為PVEP??梢姡?dāng)用戶為str賦值"cat/etc/password"時(shí),將顯示保存在/etc路徑下的password文件。因此,步驟105生成的測(cè)試腳本為str="cat/etc/password",該str="cat/etc/password"為測(cè)試輸入。再舉一個(gè)采用測(cè)試輸入和測(cè)試條件作為測(cè)試腳本的實(shí)例3。實(shí)例3中,C語言源代碼為如下形式-voidmainOcharstr[,;intX;scanf("%d%s",&X,str);if(X>0)thensystem(str);elsereturn^在實(shí)例3中,只有X大于零時(shí),才會(huì)執(zhí)行到system(str),那么,本實(shí)例中生成的測(cè)試腳本可以為str="cat/etc/password",X=l。其中,str="cat/etc/password"為測(cè)試輸入,X=l為測(cè)試條件。至此,本流程結(jié)束。以下結(jié)合圖2對(duì)圖1示出的實(shí)施例進(jìn)行詳細(xì)描述。如圖2所示,該方法包括步驟201:打開EP配置文件和VP配置文件,讀取文件中的EP和VP。步驟202:讀取并分析源代碼,建立AST;識(shí)別AST中所有出現(xiàn)的EP和VP,并標(biāo)記在AST中。本步驟中分析源代碼并建立AST的操作是已知技術(shù)手段,可以采用GCC中的前端編譯器CC1完成,這里就不再詳述。但是,所述識(shí)別AST中所有出現(xiàn)的EP和VP,并標(biāo)記在AST中的步驟是現(xiàn)有CC1不能完成的,需要對(duì)CC1進(jìn)行修改,添加用于識(shí)別EP和VP的功能。本步驟中,將識(shí)別出的EP和VP標(biāo)記在AST的具體方式為在建立AST過程中,根據(jù)EP配置文件査找AST上的節(jié)點(diǎn)是否為EP,在EP的節(jié)點(diǎn)描述中將EP屬性賦值為1,將VP屬性賦值為0,表示該節(jié)點(diǎn)只為EP;根據(jù)VP配置文件查找AST上的節(jié)點(diǎn)是否為VP,在VP的節(jié)點(diǎn)描述中將VP屬性賦值為l,將EP屬性賦值為O,表示該節(jié)點(diǎn)為只是VP。如果一個(gè)節(jié)點(diǎn)同時(shí)為EP和VP,則在該節(jié)點(diǎn)的節(jié)點(diǎn)描述中將EP屬性和VP屬性同時(shí)賦值為1。當(dāng)然,也可以采用將AST上的EP和VP記錄于表格的方式實(shí)現(xiàn)EP和VP的記錄。本實(shí)施例中,CC1在分析源代碼之前,必須讀取源代碼并轉(zhuǎn)換為編譯器能夠識(shí)別的語言。通常,當(dāng)源代碼為采用諸如C/C++,PASCAL,JAVA等高級(jí)程序語言編寫的程序代碼時(shí),CC1可以直接讀取,并完成轉(zhuǎn)換。但是,在實(shí)際中難于獲取程序的源代碼時(shí),本實(shí)施例中的CC1可以將可執(zhí)行程序(ExecutableSoftware)反編譯成匯編語言,此時(shí)CC1可以讀取匯編語言編寫的程序代碼,并完成轉(zhuǎn)換。無論是高級(jí)語言還是匯編語言都是具有數(shù)據(jù)結(jié)構(gòu)的編程語言,編譯器能夠識(shí)別這些編程語言并轉(zhuǎn)換為內(nèi)部表述,是利用用戶輸入的配置文件實(shí)現(xiàn)的。每種語言都具有各自的配置文件,配置文件中記載了語言的數(shù)據(jù)結(jié)構(gòu),是編譯器進(jìn)行轉(zhuǎn)換的依據(jù)。這些數(shù)據(jù)結(jié)構(gòu)是按詞法分析器(LEX)和語法分析器(YACC)的定義來描述的,這樣LEX就可以解析該語言的詞法,而YACC則可以解析該語言的語法。步驟203:選擇AST中的一個(gè)被標(biāo)記為EP的節(jié)點(diǎn)作為當(dāng)前EP。步驟204:記錄當(dāng)前EP的位置信息;將當(dāng)前EP的可操縱參數(shù)確定為初始PEV,并記錄在本輪路徑搜索的PEV檢查列表中,然后從當(dāng)前EP開始進(jìn)行搜索,將搜索到的下一個(gè)節(jié)點(diǎn)作為當(dāng)前搜索節(jié)點(diǎn)。本步驟中,將當(dāng)前EP所描述的程序語句在源代碼中的行號(hào)入棧,以記錄當(dāng)前EP的位置信息。每次從一個(gè)EP開始新一輪的路徑搜索時(shí),都建立新的PEV檢查列表。步驟205:記錄當(dāng)前搜索節(jié)點(diǎn)的位置信息,確定當(dāng)前搜索節(jié)點(diǎn)中出現(xiàn)的中間PEV,并記錄在本輪路徑搜索的PEV檢查列表中。本步驟中,將當(dāng)前搜索節(jié)點(diǎn)所描述的程序語句在源代碼中的行號(hào)入棧,并采用前述步驟103中描述的PEV確定方式確定當(dāng)前搜索節(jié)點(diǎn)中出現(xiàn)的中間PEV。需要說明的是,在記錄PEV時(shí),還可以進(jìn)一步考慮PEV的作用域,PEV的作用域是指PEV將會(huì)污染的節(jié)點(diǎn)的集合。PEV的作用域可以直接采用PEV所在節(jié)點(diǎn)的作用域。其中,前端編譯器CC1獲取節(jié)點(diǎn)作用域?yàn)橐阎夹g(shù)手段,其基本的工作方式如下首先,獲取一個(gè)節(jié)點(diǎn)的有效范圍(Scope)屬性值,如果Scope的屬性值為GLOBAL,則該節(jié)點(diǎn)為全局節(jié)點(diǎn),從該節(jié)點(diǎn)獲取的PEV為全局變量,該P(yáng)EV的作用域?yàn)锳ST中的所有節(jié)點(diǎn)。如果Scope的值為L(zhǎng)OCAL,則該節(jié)點(diǎn)為局部節(jié)點(diǎn),從該節(jié)點(diǎn)獲取的PEV為局部變量,那么,該P(yáng)EV的作用域就為AST中與其所在節(jié)點(diǎn)具有相同父節(jié)點(diǎn)的所有同級(jí)(兄弟)節(jié)點(diǎn);如果其中存在一個(gè)同級(jí)節(jié)點(diǎn)所描述的程序語句為一函數(shù),則該P(yáng)EV的作用域不包括該同級(jí)節(jié)點(diǎn)的子節(jié)點(diǎn);而對(duì)于其他情況,如一個(gè)同級(jí)節(jié)點(diǎn)所描述的程序語句為表達(dá)式等,則該P(yáng)EV的作用域包括該同級(jí)節(jié)點(diǎn)的子節(jié)點(diǎn)。因此本步驟205在記錄PEV時(shí),可以先判斷PEV檢査列表中的已有PEV的作用域是否包括當(dāng)前搜索節(jié)點(diǎn),并將作用域不包括當(dāng)前搜索節(jié)點(diǎn)的PEV從PEV檢查列表中刪除。可以理解,由于被刪除的PEV不會(huì)污染本輪路徑搜索中的后續(xù)搜索節(jié)點(diǎn)中的變量,因而在后續(xù)確定PEV的操作中不需再考慮這些被刪除的PEV。下面舉一個(gè)例子對(duì)PEV的作用域及其在記錄PEV時(shí)的作用進(jìn)行描述。圖3為一種AST的結(jié)構(gòu)示意圖。如圖3所示,圖中的圓形表示節(jié)點(diǎn),圓形中的N為節(jié)點(diǎn)(Node)的英文縮寫,圓形中的數(shù)字為節(jié)點(diǎn)編號(hào),兩個(gè)圓形中間的直線表示兩個(gè)節(jié)點(diǎn)之間的連接關(guān)系。各節(jié)點(diǎn)及其連接關(guān)系構(gòu)成了AST。在圖3示出的該AST中,Nl為根節(jié)點(diǎn)且為EP,N2為Nl的左支子節(jié)點(diǎn),N5為Nl的右支子節(jié)點(diǎn),N3和N4為N2的子節(jié)點(diǎn),N6為N5的子節(jié)點(diǎn)。在分析N3時(shí),確定了PEV2,由于N3的有效范圍為與其具有相同父節(jié)點(diǎn)的同級(jí)子節(jié)點(diǎn),即N2的子節(jié)點(diǎn)N4,那么當(dāng)分析N4時(shí),由于PEV2的作用域包括N4,因此如果N4中的變量被PEV2污染,則該變量為N4中出現(xiàn)的中間PEV。'但是,當(dāng)N2及其子節(jié)點(diǎn)分析完了,需要分析N5的時(shí)候,由于PEV2的作用域不包括N5,此時(shí),可以從PEV檢查列表中刪除PEV2,然后再根據(jù)PEV檢查列表中的PEV確定N5中是否出現(xiàn)中間PEV。步驟206:判斷當(dāng)前搜索節(jié)點(diǎn)是否為VP,如果是,則執(zhí)行步驟207;否則,執(zhí)行步驟209。本步驟中,判斷當(dāng)前搜索節(jié)點(diǎn)的VP屬性是否為1,如果是,則判定當(dāng)前處理節(jié)點(diǎn)為VP,執(zhí)行步驟207。步驟207:判斷所述VP的風(fēng)險(xiǎn)參數(shù)是否為PEV檢查列表中的PEV,如果是,則執(zhí)行步驟208,否則,執(zhí)行步驟209。本實(shí)施例中,在對(duì)當(dāng)前搜索節(jié)點(diǎn)進(jìn)行分析時(shí),先將當(dāng)前搜索節(jié)點(diǎn)中出現(xiàn)的中間PEV記錄在PEV檢查列表中,再判斷當(dāng)前搜索節(jié)點(diǎn)是否為VP,如果是,然后判斷該VP的風(fēng)險(xiǎn)參數(shù)是否為PEV檢査列表中的PEV。在實(shí)施中,也可以先判斷當(dāng)前搜索節(jié)點(diǎn)是否為VP,如果是,再判斷該VP中的風(fēng)險(xiǎn)參數(shù)是否受到PEV檢查列表中的PEV的污染,如果是,則將VP中受到污染的風(fēng)險(xiǎn)參數(shù)添加到PEV檢查列表中,并執(zhí)行步驟208。步驟208:將當(dāng)前EP到所述VP之間的路徑確定為PVEP,根據(jù)PVEP生成測(cè)試用例上報(bào)給測(cè)試人員。可見,確定AST中的PVEP有兩個(gè)條件,其一是當(dāng)前搜索節(jié)點(diǎn)為一個(gè)VP,其二是該節(jié)點(diǎn)的風(fēng)險(xiǎn)參數(shù)為PEV。步驟209:判斷當(dāng)前搜索節(jié)點(diǎn)是否為本輪路徑搜索中的最后一個(gè)節(jié)點(diǎn),如果是,則執(zhí)行步驟210;否則,執(zhí)行步驟212。步驟210:判斷是否遍歷了AST上的所有EP,如果是,則結(jié)束本流程;否則,執(zhí)行步驟211。步驟211:選擇AST中下一個(gè)被標(biāo)記為EP的節(jié)點(diǎn),作為當(dāng)前EP,返回執(zhí)行步驟204。步驟212:將本輪路徑搜索中的下一個(gè)節(jié)點(diǎn)作為當(dāng)前搜索節(jié)點(diǎn),返回執(zhí)行步驟205。步驟212中,下一個(gè)節(jié)點(diǎn)根據(jù)預(yù)定的搜索算法確定。至此,本流程結(jié)束。為了實(shí)現(xiàn)上述實(shí)施例描述的軟件安全漏洞檢測(cè)方法,本發(fā)明實(shí)施例還提供了一種軟件安全漏洞的檢測(cè)裝置。圖4為本發(fā)明實(shí)施例中軟件安全漏洞檢測(cè)裝置的結(jié)構(gòu)示意圖。如圖4所示,該裝置包括源代碼處理單元l、路徑分析單元2和安全測(cè)試用例生成單元3。以下分別對(duì)各組成模塊進(jìn)行詳細(xì)描述。首先,源代碼處理單元l,用于建立待檢測(cè)軟件的源代碼對(duì)應(yīng)的AST,根據(jù)預(yù)先定義的EP和VP,確定所建立的AST的各節(jié)點(diǎn)中的EP和VP。圖5為圖4中源代碼處理單元1的結(jié)構(gòu)示意圖。如圖5所示,該源代碼處理單元l可以具體包括配置模塊ll、分析模塊12,節(jié)點(diǎn)類型定位模塊13和AST記錄模塊14。其中,配置模塊ll,用于記錄預(yù)先定義的EP和VP。具體地,可以存儲(chǔ)EP配置文件和VP配置文件,配置文件的具體格式前面已經(jīng)具體描述。分析模塊12,用于對(duì)待檢測(cè)軟件的源代碼進(jìn)行詞法、語法和語義分析,建立AST。節(jié)點(diǎn)類型定位模塊13,用于根據(jù)配置模塊11中記錄的預(yù)先定義的EP和VP,確定分析模塊12建立的AST的各節(jié)點(diǎn)中的EP和VP,并將所述AST以及所確定的EP和VP記錄在AST記錄模塊14中。AST記錄模塊14,用于記錄AST以及該AST上的EP和VP,并提供給路徑分析單元2。具體地,可以保存AST和該AST中的EP和VP的表格,或者保存具有EP和VP標(biāo)記的AST。源代碼處理單元1還可以進(jìn)一步包括反編譯單元15,用于將可執(zhí)行程序代碼反編譯為匯編語言編寫的源代碼,發(fā)送給分析模塊12。如果源代碼為高級(jí)編程語言編寫的程序代碼,則可以直接由分析模塊12讀取。所述檢測(cè)裝置中的路徑分析單元2,用于在源代碼處理單元1確定的AST的各節(jié)點(diǎn)中,確定EP到VP之間的執(zhí)行路徑,如果所述執(zhí)行路徑上的VP能夠被所述執(zhí)行路徑上的EP控制,則將所述執(zhí)行路徑確定為可能導(dǎo)致安全漏洞的PVEP。圖6示出了圖4中路徑分析單元2的結(jié)構(gòu)示意圖。如圖6所示,該路徑分析單元2中可以具體包括執(zhí)行路徑定位模塊21和漏洞定位模塊22。其中,執(zhí)行路徑定位模塊21,用于采用預(yù)設(shè)搜索算法遍歷AST中的各節(jié)點(diǎn),搜索各EP到VP之間的執(zhí)行路徑,將搜索到執(zhí)行路徑通知給漏洞定位模塊22。其中,預(yù)設(shè)搜索算法如前所述可以為深度優(yōu)先搜索算法。漏洞定位模塊22,用于在接收到執(zhí)行路徑定位模塊21的上述通知后,確定所述執(zhí)行路徑上的VP是否能夠被所述執(zhí)行路徑上的EP控制,如果是,則將所述執(zhí)行路徑確定為PVEP。在預(yù)先定義的EP和VP中包括了可操縱參數(shù)和風(fēng)險(xiǎn)參數(shù)時(shí),執(zhí)行路徑定位模塊21還用于在搜索執(zhí)行路徑時(shí),以各EP中的可操縱參數(shù)為初始PEV,確定所述執(zhí)行路徑上被所述初始PEV污染的中間PEV,并將所確定的初始PEV和中間PEV發(fā)送給漏洞定位模塊22。其中,確定中間PEV的方式如前所述可以采用數(shù)據(jù)流分析方式,或者釆用數(shù)據(jù)流分析與控制流分析相結(jié)合的方式。相應(yīng)的,漏洞定位模塊22則具體用于在接收到執(zhí)行路徑定位模塊21的上述通知、初始PEV和中間PEV后,確定所述執(zhí)行路徑上的VP中的風(fēng)險(xiǎn)參數(shù)是否為所述初始PEV或中間PEV,如果是,則將所述執(zhí)行路徑確定為PVEP。具體地,該漏洞定位模塊22可以包括判斷子模塊61和定位子模塊62。其中,判斷子模塊61,用于接收?qǐng)?zhí)行路徑定位模塊21發(fā)來的所述通知、初始PEV和中間PEV,確定執(zhí)行路徑定位模塊21搜索到的執(zhí)行路徑上的VP中的風(fēng)險(xiǎn)參數(shù)是否為所述初始PEV或中間PEV,將判斷結(jié)果發(fā)送給定位子模塊62。定位子模塊62,用于在接收到的所述判斷結(jié)果為是時(shí),將執(zhí)行路徑定位模塊21搜索到的執(zhí)行路徑確定為PVEP。所述檢測(cè)裝置中的安全測(cè)試用例生成單元3,用于根據(jù)接收自執(zhí)行路徑分析單元2的PVEP生成測(cè)試用例。具體地,該安全測(cè)試用例生成單元3可以判斷所接收的EPVP是否可以采用測(cè)試輸入和測(cè)試條件表示,如果是,則根據(jù)測(cè)試輸入和測(cè)試條件生成測(cè)試腳本,并上報(bào)給測(cè)試人員;否則,則將EPVP的路徑記載在測(cè)試報(bào)告中上報(bào)給測(cè)試人員。由以上所述可見,本發(fā)明檢測(cè)安全漏洞的基礎(chǔ)是對(duì)源代碼進(jìn)行分析,而且分析并不局限于靜態(tài)的詞法和語法分析,還包括語義分析,以及能夠模擬軟件執(zhí)行過程的執(zhí)行路徑分析,因此能夠有效的檢測(cè)到各種潛在風(fēng)險(xiǎn)執(zhí)行路徑,從而有效地檢測(cè)出存在于軟件源代碼中的安全漏洞。以上所述僅為本發(fā)明的較佳實(shí)施例而已,并非用于限定本發(fā)明的保護(hù)范圍。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換以及改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。權(quán)利要求1、一種軟件源代碼安全漏洞的檢測(cè)方法,其特征在于,該方法包括建立待檢測(cè)軟件的源代碼對(duì)應(yīng)的抽象語法樹AST;根據(jù)預(yù)先定義的可操縱點(diǎn)和風(fēng)險(xiǎn)點(diǎn),確定所建立的AST的各節(jié)點(diǎn)中的可操縱點(diǎn)和風(fēng)險(xiǎn)點(diǎn);搜索所述AST中的可操縱點(diǎn)到風(fēng)險(xiǎn)點(diǎn)之間的執(zhí)行路徑,如果所述執(zhí)行路徑上的風(fēng)險(xiǎn)點(diǎn)能夠被所述執(zhí)行路徑上的可操縱點(diǎn)控制,則將所述執(zhí)行路徑確定為可能導(dǎo)致安全漏洞的潛在風(fēng)險(xiǎn)執(zhí)行路徑。2、根據(jù)權(quán)利要求1所述的方法,其特征在于,所述可操縱點(diǎn)為輸入類函數(shù);所述風(fēng)險(xiǎn)點(diǎn)為執(zhí)行類函數(shù)和/或賦值語句。3、根據(jù)權(quán)利要求2所述的方法,其特征在于,進(jìn)一步預(yù)先定義可操縱點(diǎn)中的可操縱參數(shù)和風(fēng)險(xiǎn)點(diǎn)中的風(fēng)險(xiǎn)參數(shù)。4、根據(jù)權(quán)利要求3所述的方法,其特征在于,確定所述執(zhí)行路徑上的風(fēng)險(xiǎn)點(diǎn)能夠被所述執(zhí)行路徑上的可操縱點(diǎn)控制的方式為如果所述執(zhí)行路徑上的風(fēng)險(xiǎn)點(diǎn)中的風(fēng)險(xiǎn)參數(shù)被所述執(zhí)行路徑上的可操縱點(diǎn)中的可操縱參數(shù)污染,則確定所述執(zhí)行路徑上的風(fēng)險(xiǎn)點(diǎn)能夠被所述執(zhí)行路徑上的可操縱點(diǎn)控制。5、根據(jù)權(quán)利要求4所述的方法,其特征在于,確定所述執(zhí)行路徑上的風(fēng)險(xiǎn)點(diǎn)中的風(fēng)險(xiǎn)參數(shù)被所述執(zhí)行路徑上的可操縱點(diǎn)中的可操縱參數(shù)污染的方式為將所述執(zhí)行路徑上的可操縱點(diǎn)中的可操縱參數(shù)作為初始潛在可操縱變量PEV;確定所述執(zhí)行路徑上被所述初始PEV污染的中間PEV;判斷所述執(zhí)行路徑上的風(fēng)險(xiǎn)點(diǎn)中的風(fēng)險(xiǎn)參數(shù)是否是所述初始PEV或中間PEV,如果是,則判定所述執(zhí)行路徑上的風(fēng)險(xiǎn)點(diǎn)中的風(fēng)險(xiǎn)參數(shù)被所述執(zhí)行路徑上的可操縱點(diǎn)中的可操縱參數(shù)污染。6、根據(jù)權(quán)利要求5所述的方法,其特征在于,獲取所述執(zhí)行路徑上被所述初始PEV污染的中間PEV的方式為數(shù)據(jù)流分析方式。7、根據(jù)權(quán)利要求6所述的方法,其特征在于,獲取所述執(zhí)行路徑上被所述初始PEV污染的中間PEV的方式進(jìn)一步包括控制流分析方式。8、根據(jù)權(quán)利要求1所述的方法,其特征在于,該方法進(jìn)一步包括根據(jù)所確定的潛在風(fēng)險(xiǎn)執(zhí)行路徑生成測(cè)試報(bào)告。9、根據(jù)權(quán)利要求8所述的方法,其特征在于,所述根據(jù)所確定的潛在風(fēng)險(xiǎn)執(zhí)行路徑生成測(cè)試報(bào)告包括如果所述潛在風(fēng)險(xiǎn)執(zhí)行路徑能夠直接用測(cè)試輸入和測(cè)試條件表示,則根據(jù)所述測(cè)試輸入和測(cè)試條件生成測(cè)試腳本,否則,生成記載所述潛在風(fēng)險(xiǎn)執(zhí)行路徑的測(cè)試報(bào)告。10、根據(jù)上述任一權(quán)利要求所述的方法,其特征在于,所述待檢測(cè)軟件的源代碼為高級(jí)編程語言源代碼,或者為將可執(zhí)行程序代碼進(jìn)行反編譯而得到的匯編語言源代碼。11、一種軟件源代碼安全漏洞的檢測(cè)裝置,其特征在于,該裝置包括源代碼處理單元(1)和路徑分析單元(2);所述源代碼處理單元(1),用于建立待檢測(cè)軟件的源代碼對(duì)應(yīng)的AST,根據(jù)預(yù)先定義的可操縱點(diǎn)和風(fēng)險(xiǎn)點(diǎn),確定所建立的AST的各節(jié)點(diǎn)中的可操縱點(diǎn)和風(fēng)險(xiǎn)點(diǎn);所述路徑分析單元(2),用于在所述源代碼處理單元(1)確定的AST的各節(jié)點(diǎn)中,確定可操縱點(diǎn)到風(fēng)險(xiǎn)點(diǎn)之間的執(zhí)行路徑,如果所述執(zhí)行路徑上的風(fēng)險(xiǎn)點(diǎn)能夠被所述執(zhí)行路徑上的可操縱點(diǎn)控制,則將所述執(zhí)行路徑確定為可能導(dǎo)致安全漏洞的潛在風(fēng)險(xiǎn)執(zhí)行路徑。12、根據(jù)權(quán)利要求11所述的檢測(cè)裝置,其特征在于,所述源代碼處理單元(1)包括配置模塊(11)、分析模塊(12),節(jié)點(diǎn)類型定位模塊(13)和AST記錄模塊(14);所述配置模塊(11),用于記錄預(yù)先定義的可操縱點(diǎn)和風(fēng)險(xiǎn)點(diǎn);所述分析模塊(12),用于對(duì)待檢測(cè)軟件的源代碼進(jìn)行詞法、語法和語義分析,建立AST;所述節(jié)點(diǎn)類型定位模塊(13),用于根據(jù)所述配置模塊(11)中記錄的預(yù)先定義的可操縱點(diǎn)和風(fēng)險(xiǎn)點(diǎn),確定所述分析模塊(12)建立的AST的各節(jié)點(diǎn)中的可操縱點(diǎn)和風(fēng)險(xiǎn)點(diǎn),并將所述AST以及所確定的可操縱點(diǎn)和風(fēng)險(xiǎn)點(diǎn)記錄在AST記錄模塊(14)中;所述AST記錄模塊(14),用于記錄所述AST以及所確定的可操縱點(diǎn)和風(fēng)險(xiǎn)點(diǎn),并提供給所述路徑分析單元(2)。13、根據(jù)權(quán)利要求12所述的檢測(cè)裝置,其特征在于,所述源代碼處理單元(1)進(jìn)一步包括反編譯模塊(15),用于將可執(zhí)行程序代碼反編譯為匯編語言源代碼,并發(fā)送給所述分析模塊(12)。14、根據(jù)權(quán)利要求11所述的檢測(cè)裝置,其特征在于,所述路徑分析單元(2)包括執(zhí)行路徑定位模塊(21)和漏洞定位模塊(22);所述執(zhí)行路徑定位模塊(21),用于在所述AST中搜索可操縱點(diǎn)到風(fēng)險(xiǎn)點(diǎn)之間的執(zhí)行路徑,并將搜索到執(zhí)行路徑通知給所述漏洞定位模塊(22);所述漏洞定位模塊(22),用于在接收到所述執(zhí)行路徑定位模塊(21)的通知后,確定所述執(zhí)行路徑上的風(fēng)險(xiǎn)點(diǎn)是否能夠被所述執(zhí)行路徑上的可操縱點(diǎn)控制,如果是,則將所述執(zhí)行路徑確定為潛在風(fēng)險(xiǎn)執(zhí)行路徑。15、根據(jù)權(quán)利要求11所述的檢測(cè)裝置,其特征在于,該裝置進(jìn)一步包括安全測(cè)試用例生成單元(3),用于根據(jù)所述路徑分析單元(2)確定的潛在風(fēng)險(xiǎn)執(zhí)行路徑生成測(cè)試報(bào)告。全文摘要本發(fā)明公開了一種軟件源代碼安全漏洞的檢測(cè)方法,該方法包括建立待檢測(cè)軟件的源代碼對(duì)應(yīng)的抽象語法樹AST;根據(jù)預(yù)先定義的可操縱點(diǎn)和風(fēng)險(xiǎn)點(diǎn),確定所建立的AST的各節(jié)點(diǎn)中的可操縱點(diǎn)和風(fēng)險(xiǎn)點(diǎn);搜索所述AST中的可操縱點(diǎn)到風(fēng)險(xiǎn)點(diǎn)之間的執(zhí)行路徑,如果所述執(zhí)行路徑上的風(fēng)險(xiǎn)點(diǎn)能夠被所述執(zhí)行路徑上的可操縱點(diǎn)控制,則將所述執(zhí)行路徑確定為可能導(dǎo)致安全漏洞的潛在風(fēng)險(xiǎn)執(zhí)行路徑。本發(fā)明還公開了一種軟件安全漏洞的檢測(cè)裝置。使用本發(fā)明能夠有效地檢測(cè)出存在于軟件源代碼中的安全漏洞。文檔編號(hào)G06F21/00GK101661543SQ20081014695公開日2010年3月3日申請(qǐng)日期2008年8月28日優(yōu)先權(quán)日2008年8月28日發(fā)明者文唐申請(qǐng)人:西門子(中國(guó))有限公司
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1