一種檢測(cè)源代碼漏洞的方法和裝置的制造方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及一種檢測(cè)源代碼漏洞的方法和裝置。
【背景技術(shù)】
[0002] 互聯(lián)網(wǎng)的發(fā)展給人們帶來了方便而豐富的體驗(yàn),然而隨之而來的安全問題也越來 越顯著。Web網(wǎng)站的漏洞檢測(cè)是預(yù)防安全問題的重要手段,其主要分為動(dòng)態(tài)和靜態(tài)分析兩種 方法,動(dòng)態(tài)檢測(cè)雖然具有準(zhǔn)確率高、誤報(bào)低的優(yōu)點(diǎn),然而由于其構(gòu)造模擬攻擊的局限,必然 有著高漏報(bào)的風(fēng)險(xiǎn)。
[0003] 靜態(tài)分析是通過剖析代碼而發(fā)現(xiàn)網(wǎng)頁中所隱藏的安全漏洞,雖然不能保證所檢測(cè) 的漏洞的誤報(bào)率,但是會(huì)大大降低漏報(bào)。雖然當(dāng)前靜態(tài)分析已作為一項(xiàng)有力的工具在網(wǎng)站 的漏洞檢測(cè)方面發(fā)揮作用,但是現(xiàn)有技術(shù)的靜態(tài)分析方法仍然存在誤報(bào)率高、無法處理過 程間調(diào)用等問題。
[0004] 現(xiàn)有技術(shù)中所采用的靜態(tài)分析主要包括兩種方式:一種是運(yùn)用單純的正則匹配的 方法,匹配程序中的用戶可控輸入點(diǎn)或者危險(xiǎn)函數(shù)點(diǎn),從而得出漏洞所在位置;該方式由于 無法追蹤用戶所傳變量的路徑,誤報(bào)極高。另一種是先用編譯的手段將代碼進(jìn)行詞法、語 法分析,繼而匹配危險(xiǎn)函數(shù),再回溯程序中的敏感變量,一直到遇見用戶可控輸入點(diǎn)。而這 種方式由于沒有進(jìn)行相關(guān)的數(shù)據(jù)依賴處理,導(dǎo)致該方法的回溯過程僅僅是對(duì)變量的簡單識(shí) 另IJ,而沒有對(duì)其是否是賦值、條件、循環(huán)或者函數(shù)調(diào)用進(jìn)行具體的分析,導(dǎo)致較高的誤報(bào)率。
【發(fā)明內(nèi)容】
[0005] 本發(fā)明的目的是提供一種檢測(cè)源代碼漏洞的方法和裝置。
[0006] 根據(jù)本發(fā)明的一個(gè)方面,提供了一種檢測(cè)源代碼漏洞的方法,其中,所述方法包 括以下步驟:
[0007] X基于與所述源代碼對(duì)應(yīng)的抽象語法樹,確定所述抽象語法樹中的一個(gè)或多個(gè)敏 感節(jié)點(diǎn),其中,所述敏感節(jié)點(diǎn)對(duì)應(yīng)于所述源代碼中的敏感函數(shù)的參數(shù)信息;
[0008] 其中,將敏感節(jié)點(diǎn)作為初始節(jié)點(diǎn),所述方法還包括以下步驟:
[0009] a基于所述抽象語法樹,查找與所述初始節(jié)點(diǎn)對(duì)應(yīng)的參數(shù)信息具有依賴關(guān)系的依 賴節(jié)點(diǎn),以將所述依賴節(jié)點(diǎn)作為所述初始節(jié)點(diǎn)的子節(jié)點(diǎn);
[0010] b當(dāng)所述依賴節(jié)點(diǎn)不對(duì)應(yīng)用戶輸入信息時(shí),將該依賴節(jié)點(diǎn)作為新的初始節(jié)點(diǎn),并重 復(fù)前述步驟a和b。
[0011] 根據(jù)本發(fā)明的一個(gè)方面,提供了一種檢測(cè)源代碼漏洞的檢測(cè)裝置,其中,所述檢測(cè) 裝置包括:
[0012] 第一確定裝置,用于基于與所述源代碼對(duì)應(yīng)的抽象語法樹,確定所述抽象語法樹 中的一個(gè)或多個(gè)敏感節(jié)點(diǎn),其中,所述敏感節(jié)點(diǎn)對(duì)應(yīng)于所述源代碼中的敏感函數(shù)的參數(shù)信 息;
[0013] 其中,將敏感節(jié)點(diǎn)作為初始節(jié)點(diǎn),所述檢測(cè)裝置還包括:
[0014] 查找裝置,用于基于所述抽象語法樹,查找與所述初始節(jié)點(diǎn)對(duì)應(yīng)的參數(shù)信息具有 依賴關(guān)系的依賴節(jié)點(diǎn),并將所述依賴節(jié)點(diǎn)作為所述初始節(jié)點(diǎn)的子節(jié)點(diǎn);
[0015] 第一控制裝置,用于當(dāng)所述依賴節(jié)點(diǎn)不對(duì)應(yīng)用戶輸入信息時(shí),將所述子節(jié)點(diǎn)作為 新的初始節(jié)點(diǎn),并重復(fù)查找裝置和第一控制裝置的操作。
[0016] 與現(xiàn)有技術(shù)相比,本發(fā)明具有以下優(yōu)點(diǎn):1)根據(jù)本發(fā)明的方法,通過基于賦值操 作等方式的分析,來建立基于數(shù)據(jù)的依賴關(guān)系的敏感路徑信息,從而能夠降低對(duì)于漏洞的 誤報(bào)率,并且能夠提升所獲得的敏感路徑的完整度,提高漏洞檢測(cè)的全面性;2)通過對(duì)于 分支、循環(huán)等語句的處理,能夠盡可能全面地獲得參數(shù)在各個(gè)語句中的依賴關(guān)系,進(jìn)而記錄 更加完整的敏感路徑信息;3)基于該種方案,通過追蹤函數(shù)間、類之間的敏感變量傳遞調(diào) 用,進(jìn)一步提升了所獲取的危險(xiǎn)函數(shù)信息的完整性,從而降低了漏報(bào)率,使得漏洞檢測(cè)更加 全面準(zhǔn)確。
【附圖說明】
[0017] 通過閱讀參照以下附圖所作的對(duì)非限制性實(shí)施例所作的詳細(xì)描述,本發(fā)明的其它 特征、目的和優(yōu)點(diǎn)將會(huì)變得更明顯:
[0018] 圖1示意出了根據(jù)本發(fā)明的一種檢測(cè)源代碼漏洞的方法流程圖;
[0019] 圖2示意出了根據(jù)本發(fā)明的一種用于檢測(cè)源代碼漏洞的檢測(cè)裝置的結(jié)構(gòu)示意圖; [0020] 附圖中相同或相似的附圖標(biāo)記代表相同或相似的部件。
【具體實(shí)施方式】
[0021] 下面結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步詳細(xì)描述。
[0022] 圖1示意出了根據(jù)本發(fā)明的一種用于檢測(cè)源代碼漏洞的方法流程圖。根據(jù)本發(fā)明 的方法包括步驟S1、步驟S2和步驟S3。
[0023] 其中,根據(jù)本發(fā)明的方法通過包含于計(jì)算機(jī)設(shè)備中的檢測(cè)裝置來實(shí)現(xiàn)。優(yōu)選地,所 述源代碼為網(wǎng)站源代碼。
[0024] 所述計(jì)算機(jī)設(shè)備包括一種能夠按照事先設(shè)定或存儲(chǔ)的指令,自動(dòng)進(jìn)行數(shù)值計(jì)算和 /或信息處理的電子設(shè)備,其硬件包括但不限于微處理器、專用集成電路(ASIC)、可編程門 陣列(FPGA)、數(shù)字處理器(DSP)、嵌入式設(shè)備等。
[0025] 其中,所述計(jì)算機(jī)設(shè)備包括網(wǎng)絡(luò)設(shè)備和用戶設(shè)備。
[0026] 所述網(wǎng)絡(luò)設(shè)備包括但不限于單個(gè)網(wǎng)絡(luò)服務(wù)器、多個(gè)網(wǎng)絡(luò)服務(wù)器組成的服務(wù)器組或 基于云計(jì)算(Cloud Computing)的由大量主機(jī)或網(wǎng)絡(luò)服務(wù)器構(gòu)成的云,其中,云計(jì)算是分布 式計(jì)算的一種,由一群松散耦合的計(jì)算機(jī)集組成的一個(gè)超級(jí)虛擬計(jì)算機(jī)。
[0027] 所述用戶設(shè)備包括但不限于任何一種可與用戶通過鍵盤、鼠標(biāo)、遙控器、觸摸板、 或聲控設(shè)備等方式進(jìn)行人機(jī)交互的電子產(chǎn)品。例如,手提電腦、平板電腦、智能手機(jī)、PDA、掌 上游戲機(jī)以及智能導(dǎo)航設(shè)備等。
[0028] 其中,所述計(jì)算機(jī)設(shè)備可處于網(wǎng)絡(luò)中,該計(jì)算機(jī)設(shè)備所處的網(wǎng)絡(luò)包括但不限于互 聯(lián)網(wǎng)、廣域網(wǎng)、城域網(wǎng)、局域網(wǎng)、VPN網(wǎng)絡(luò)等。
[0029] 需要說明的是,所述計(jì)算機(jī)設(shè)備以及網(wǎng)絡(luò)僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn) 的計(jì)算機(jī)設(shè)備以及網(wǎng)絡(luò)如可適用于本發(fā)明,也應(yīng)包含在本發(fā)明保護(hù)范圍以內(nèi),并以引用方 式包含于此。
[0030]在步驟S1中,檢測(cè)裝置基于與所述源代碼對(duì)應(yīng)的抽象語法樹,確定所述抽象語法 樹中的一個(gè)或多個(gè)敏感節(jié)點(diǎn)。
[0031] 其中,所述敏感節(jié)點(diǎn)對(duì)應(yīng)于所述源代碼中的敏感函數(shù)的參數(shù)信息。其中,所述敏感 函數(shù)為包含于預(yù)定的危險(xiǎn)函數(shù)列表中的函數(shù);或者,與所述危險(xiǎn)函數(shù)列表中的函數(shù)相似或 相近的函數(shù)。
[0032] 具體地,檢測(cè)裝置基于預(yù)定的危險(xiǎn)函數(shù)列表,以及所述抽象語法樹中的各個(gè)節(jié)點(diǎn), 來確定該抽象語法樹中的各個(gè)節(jié)點(diǎn)是否為與所述危險(xiǎn)函數(shù)列表中的危險(xiǎn)函數(shù)對(duì)應(yīng)的敏感 函數(shù)的節(jié)點(diǎn)信息。
[0033] 更優(yōu)選地,檢測(cè)裝置基于該預(yù)定的危險(xiǎn)函數(shù)列表的函數(shù)信息,與抽象語法樹中的 各個(gè)節(jié)點(diǎn)進(jìn)行正則運(yùn)算,以確定所述抽象語法樹中各個(gè)節(jié)點(diǎn)是否為敏感函數(shù)的敏感節(jié)點(diǎn), 將所確定的敏感節(jié)點(diǎn)作為初始節(jié)點(diǎn)。
[0034] 其中,本領(lǐng)域技術(shù)人員應(yīng)能了解基于源代碼建立抽象語法樹的過程,此處不再贅 述。
[0035] 在步驟S2中,檢測(cè)裝置基于所述抽象語法樹,查找與所述初始節(jié)點(diǎn)對(duì)應(yīng)的參數(shù)信 息具有依賴關(guān)系的依賴節(jié)點(diǎn),以將所述依賴節(jié)點(diǎn)作為所述初始節(jié)點(diǎn)的子節(jié)點(diǎn)。
[0036] 其中,當(dāng)一個(gè)參數(shù)的需要依賴于另一個(gè)參數(shù)來確定時(shí),說明該兩個(gè)參數(shù)之間具有 依賴關(guān)系。
[0037] 例如,當(dāng)參數(shù)A需要通過將參數(shù)B的計(jì)算結(jié)果后對(duì)A進(jìn)行賦值得到,則可認(rèn)為參數(shù) A與B之間具有依賴關(guān)系。
[0038] 優(yōu)選地,檢測(cè)裝置基于所述抽象語法樹,查找用于對(duì)所述初始節(jié)點(diǎn)對(duì)應(yīng)的參數(shù)信 息進(jìn)行賦值的賦值信息,以將所述賦值信息對(duì)應(yīng)的節(jié)點(diǎn)作為依賴節(jié)點(diǎn),并將該依賴節(jié)點(diǎn)作 為所述初始節(jié)點(diǎn)的子節(jié)點(diǎn)。
[0039] 接著,在步驟S3中,當(dāng)所述依賴節(jié)點(diǎn)不對(duì)應(yīng)用戶輸入信息時(shí),檢測(cè)裝置將該依賴 節(jié)點(diǎn)作為新的初始節(jié)點(diǎn),并重復(fù)步驟S2和步驟S3的操作。
[0040] 根據(jù)本發(fā)明的第一示例,檢測(cè)裝置在步驟S1中,通過正則匹配,確定參數(shù)var_l 為敏感函數(shù)的參數(shù),進(jìn)而確定參數(shù)var_l對(duì)應(yīng)的節(jié)點(diǎn)node_var_l為敏感節(jié)點(diǎn),則檢測(cè)裝置 將該節(jié)點(diǎn)node_var_l作為初始節(jié)點(diǎn),接著,在步驟S2中,檢測(cè)裝置沿著所述抽象語法樹,將 獲得的用于對(duì)該參數(shù)var_l進(jìn)行賦值的賦值信息參數(shù)var_2對(duì)應(yīng)的節(jié)點(diǎn)node_var_2作為 依賴節(jié)點(diǎn),并將該依賴節(jié)點(diǎn)node_var_2作為初始節(jié)點(diǎn)node_var_l的子節(jié)點(diǎn)。
[0041] 并且,檢測(cè)裝置判斷該依賴節(jié)點(diǎn)n〇de_Var_2對(duì)應(yīng)的參數(shù)信息var_2并非用戶輸入 信息,則在步驟S3中,檢測(cè)裝置將該依賴節(jié)點(diǎn)node_var_2作為新的初始節(jié)點(diǎn),并重新執(zhí)行 步驟S2,沿著抽象語法樹,查找到用于對(duì)參數(shù)信息var_2進(jìn)行賦值的參數(shù)var_3,并將var_3 對(duì)應(yīng)的節(jié)點(diǎn)node_var_3作為當(dāng)前的初始節(jié)點(diǎn)node_var_2的子節(jié)點(diǎn)。接著,檢測(cè)裝置根據(jù) 參數(shù)var_3是通過語句$_GET來獲得的,從而判斷var_3為用戶輸入信息,進(jìn)而停止繼續(xù)查 找該依賴節(jié)點(diǎn)的子節(jié)點(diǎn)。
[0042] 優(yōu)選地,根據(jù)本發(fā)明的方法還包括步驟S4(圖未示)。
[0043] 在步驟S4中,當(dāng)所述依賴節(jié)點(diǎn)對(duì)應(yīng)于用戶輸入信息時(shí),檢測(cè)裝置記錄該依賴節(jié)點(diǎn) 到其對(duì)應(yīng)的敏感節(jié)點(diǎn)的敏感路徑信息。
[0044] 繼續(xù)對(duì)前述第一示例進(jìn)行說明,當(dāng)依賴節(jié)點(diǎn)node_var_3對(duì)應(yīng)于用戶輸入信 息時(shí),檢測(cè)裝置記錄node_var_3至敏感節(jié)點(diǎn)node_var_l對(duì)應(yīng)的敏感路徑信息:node_ var_l - node_var_2 - node_var_3〇
[0045] 優(yōu)選地,檢測(cè)裝置基于所記錄的敏感路徑信息,來提示所述源代碼的漏洞信息。
[0046] 繼續(xù)對(duì)前述第一示例進(jìn)行說明,檢測(cè)裝置根據(jù)記錄的敏感路徑信息:node_ var_l - node_var_2 - node_var_3,提示程序員:發(fā)現(xiàn)漏洞信息node_var_3,其對(duì)應(yīng)的路 徑信息包括以敏感節(jié)點(diǎn)作為根節(jié)點(diǎn)的路徑信息node_var_l - no