• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    基于特征依賴(lài)圖的源代碼漏洞檢測(cè)方法

    2023-02-20 13:37:14楊宏宇楊海云張良成翔
    通信學(xué)報(bào) 2023年1期
    關(guān)鍵詞:源代碼漏洞語(yǔ)句

    楊宏宇,楊海云,張良,成翔

    (1.中國(guó)民航大學(xué)安全科學(xué)與工程學(xué)院,天津 300300;2.中國(guó)民航大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,天津 300300;3.亞利桑那大學(xué)信息學(xué)院,圖森 AZ85721;4.揚(yáng)州大學(xué)信息工程學(xué)院,江蘇 揚(yáng)州 225127;5.江蘇省知識(shí)管理與智能服務(wù)工程研究中心,江蘇 揚(yáng)州 225127)

    0 引言

    計(jì)算機(jī)系統(tǒng)是構(gòu)建數(shù)字社會(huì)的基石,然而由軟件安全漏洞引發(fā)的數(shù)據(jù)泄露和安全攻擊時(shí)刻威脅著計(jì)算機(jī)系統(tǒng)的運(yùn)行安全[1-2]。為避免安全威脅事件的發(fā)生,大量源代碼漏洞檢測(cè)方法被提出,但大多數(shù)方法僅根據(jù)安全專(zhuān)家手動(dòng)定義的代碼漏洞特征或模板規(guī)則進(jìn)行漏洞檢測(cè),這些方法不僅誤報(bào)率高、漏洞覆蓋率低,而且模板規(guī)則需要伴隨新漏洞模式的出現(xiàn)動(dòng)態(tài)更新[3]。

    隨著深度學(xué)習(xí)在圖像識(shí)別和自然語(yǔ)言處理等領(lǐng)域取得顯著進(jìn)展,研究者嘗試采用深度學(xué)習(xí)方法自動(dòng)提取源代碼漏洞的隱式特征以進(jìn)行源代碼漏洞檢測(cè)[4-5]?;谏疃葘W(xué)習(xí)的源代碼漏洞檢測(cè)方法從大量訓(xùn)練樣本中學(xué)習(xí)易受攻擊的代碼模式,當(dāng)檢測(cè)新的源代碼樣本時(shí),將其輸入預(yù)訓(xùn)練的神經(jīng)網(wǎng)絡(luò),判斷是否包含易受攻擊的代碼模式[6],以確定代碼是否存在漏洞。最初,研究者采用卷積神經(jīng)網(wǎng)絡(luò)(CNN,convolutional neural network)和循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN,recurrent neural network)等傳統(tǒng)神經(jīng)網(wǎng)絡(luò)進(jìn)行源代碼漏洞檢測(cè)[7],但傳統(tǒng)神經(jīng)網(wǎng)絡(luò)較難學(xué)習(xí)到長(zhǎng)序列的代碼標(biāo)記特征。近年來(lái),部分研究者嘗試將源代碼建模為圖結(jié)構(gòu),采用圖神經(jīng)網(wǎng)絡(luò)進(jìn)行源代碼漏洞檢測(cè)。

    基于深度學(xué)習(xí)的源代碼漏洞檢測(cè)方法包括基于標(biāo)記的方法和基于圖結(jié)構(gòu)的方法[8]。其中,基于標(biāo)記的方法將源代碼視為標(biāo)記序列。文獻(xiàn)[9]通過(guò)CNN 提取源代碼的特征向量并使用隨機(jī)森林算法進(jìn)行源代碼漏洞檢測(cè)分類(lèi),但是該方法對(duì)較長(zhǎng)的標(biāo)記序列特征提取困難,且未考慮源代碼中豐富的語(yǔ)義信息。文獻(xiàn)[10]提出的VulDeePecker 方法使用容易引發(fā)安全漏洞的應(yīng)用程序接口(API)對(duì)源代碼進(jìn)行切片,選擇雙向長(zhǎng)短期記憶神經(jīng)網(wǎng)絡(luò)提取源代碼漏洞特征,但是該方法僅使用與數(shù)據(jù)依賴(lài)相關(guān)的語(yǔ)義信息,缺失源代碼中與控制依賴(lài)相關(guān)的語(yǔ)義信息,導(dǎo)致誤報(bào)率較高。文獻(xiàn)[3]提出的SySeVR 方法使用4 種漏洞語(yǔ)法特征獲得候選漏洞語(yǔ)句,并根據(jù)候選漏洞語(yǔ)句的數(shù)據(jù)依賴(lài)和控制依賴(lài)信息對(duì)源代碼進(jìn)行切片。同時(shí),SySeVR 選用雙向門(mén)控循環(huán)單元等神經(jīng)網(wǎng)絡(luò)進(jìn)行源代碼漏洞檢測(cè)。但是該方法未在源代碼切片中顯式維護(hù)與候選漏洞語(yǔ)句相關(guān)的依賴(lài)關(guān)系,導(dǎo)致神經(jīng)網(wǎng)絡(luò)難以對(duì)源代碼語(yǔ)義信息學(xué)習(xí)和推理。文獻(xiàn)[11]提出的μVulDeepecker 方法采用代碼注意力協(xié)助進(jìn)行漏洞檢測(cè),并使用改進(jìn)的長(zhǎng)短期記憶神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)了多分類(lèi)漏洞檢測(cè)系統(tǒng),但該模型只針對(duì)與函數(shù)調(diào)用相關(guān)的漏洞。文獻(xiàn)[12]提出的VulDeeLocator 通過(guò)定義-引用關(guān)系關(guān)聯(lián)一個(gè)項(xiàng)目下的多個(gè)文件,使用底層虛擬機(jī)(LLVM,low level virtual machine)將源代碼轉(zhuǎn)換為中間代碼表示,并通過(guò)改進(jìn)的雙向循環(huán)神經(jīng)網(wǎng)絡(luò)將漏洞出現(xiàn)位置限制在若干行之內(nèi)。但該方法需要將源代碼編譯為中間代碼,對(duì)無(wú)法編譯的源代碼較難適用。

    基于圖結(jié)構(gòu)的方法使用不同類(lèi)型的源代碼表示圖表征源代碼,采用圖神經(jīng)網(wǎng)絡(luò)進(jìn)行源代碼漏洞檢測(cè)。文獻(xiàn)[13]采用由抽象語(yǔ)法樹(shù)(AST,abstract syntax tree)、數(shù)據(jù)流圖(DFG,data flow graph)、控制流圖(CFG,control flow graph)和代碼執(zhí)行順序組成的聯(lián)合圖表征源代碼,并使用門(mén)控圖神經(jīng)網(wǎng)絡(luò)(GGNN,gated graph neural network)[14]學(xué)習(xí)并感知聯(lián)合圖中的語(yǔ)法語(yǔ)義信息,然后完成漏洞檢測(cè)。文獻(xiàn)[7]提出的Reveal 方法使用代碼屬性圖(CPG,code property graph)表示源代碼,并將代碼屬性圖的節(jié)點(diǎn)類(lèi)型編碼在節(jié)點(diǎn)的表示向量中,該方法使用GGNN 提取代碼屬性圖的特征以進(jìn)行源代碼漏洞檢測(cè)。上述基于圖結(jié)構(gòu)的方法僅簡(jiǎn)單使用源代碼的一種或多種表示圖表征源代碼,未深度分析表示圖中與漏洞語(yǔ)句相關(guān)的節(jié)點(diǎn)和邊,導(dǎo)致神經(jīng)網(wǎng)絡(luò)無(wú)法全面學(xué)習(xí)與推理漏洞語(yǔ)句的語(yǔ)義信息。

    針對(duì)上述方法的不足,本文提出一種基于特征依賴(lài)圖的源代碼漏洞檢測(cè)方法(FBLD),該方法包括3 個(gè)部分,分別是特征依賴(lài)圖(FDG,feature dependence graph)、FDG 生成算法和面向FDG 的檢測(cè)網(wǎng)絡(luò)(FDN,FDG detection network)。具體貢獻(xiàn)如下。

    1) 提出一種針對(duì)函數(shù)片的源代碼表征結(jié)構(gòu)——特征依賴(lài)圖。與現(xiàn)有漏洞檢測(cè)方法采用的源代碼表征結(jié)構(gòu)不同,F(xiàn)DG 不僅提取源代碼的全部控制依賴(lài)和數(shù)據(jù)依賴(lài)語(yǔ)義信息,而且深度分析了與潛在風(fēng)險(xiǎn)語(yǔ)句相關(guān)的控制依賴(lài)和數(shù)據(jù)依賴(lài),并在圖中顯式維護(hù)候選漏洞語(yǔ)句的兩類(lèi)語(yǔ)義信息,有助于漏洞檢測(cè)神經(jīng)網(wǎng)絡(luò)獲取源代碼包含的潛在漏洞信息,做出更準(zhǔn)確的判斷。

    2) 提出一種面向函數(shù)片的特征依賴(lài)圖生成算法。首先,根據(jù)漏洞語(yǔ)法特征獲得函數(shù)中的若干條候選漏洞語(yǔ)句。其次,分別分析控制依賴(lài)圖(CDG,control dependence graph)和數(shù)據(jù)依賴(lài)圖(DDG,data dependence graph)中候選漏洞語(yǔ)句的控制依賴(lài)鏈和數(shù)據(jù)依賴(lài)鏈。然后,在控制依賴(lài)圖和數(shù)據(jù)依賴(lài)圖上,分別標(biāo)注控制依賴(lài)鏈和數(shù)據(jù)依賴(lài)鏈,得到特征控制依賴(lài)圖(FCDG,feature control dependence graph)和特征數(shù)據(jù)依賴(lài)圖(FDDG,feature data dependence graph)。最后,將FCDG 和FDDG 融合為FDG。

    3) 提出一種面向FDG 的檢測(cè)網(wǎng)絡(luò)FDN,將對(duì)源代碼函數(shù)片的漏洞檢測(cè)工作轉(zhuǎn)化為函數(shù)片對(duì)應(yīng)的FDG 檢測(cè)。FDN 通過(guò)圖學(xué)習(xí)網(wǎng)絡(luò)獲取FDG 中的語(yǔ)義信息,可以動(dòng)態(tài)調(diào)整FDG 中不同邊類(lèi)型對(duì)于漏洞檢測(cè)目標(biāo)的重要性。同時(shí),為了便于高效實(shí)施漏洞檢測(cè),F(xiàn)DN 通過(guò)檢測(cè)網(wǎng)絡(luò)獲取FDG 的全局表示向量并提取全局特征。

    1 源代碼漏洞檢測(cè)方法設(shè)計(jì)

    基于特征依賴(lài)圖的源代碼漏洞檢測(cè)方法框架如圖1 所示,該方法由FDG 生成、節(jié)點(diǎn)嵌入和源代碼漏洞檢測(cè)3 個(gè)部分組成,各部分的主要操作設(shè)計(jì)如下。

    圖1 基于特征依賴(lài)圖的源代碼漏洞檢測(cè)方法框架

    1) FDG 生成。首先,使用代碼分析工具Joern生成函數(shù)片對(duì)應(yīng)的AST、CDG 和DDG。其次,在A(yíng)ST 上匹配漏洞語(yǔ)法特征獲取候選漏洞語(yǔ)句。然后,分析候選漏洞語(yǔ)句的控制依賴(lài)鏈和數(shù)據(jù)依賴(lài)鏈,修改控制依賴(lài)圖和數(shù)據(jù)依賴(lài)圖的節(jié)點(diǎn)屬性和邊屬性,分別得到FCDG 和FDDG。最后,將FCDG和FDDG 融合為FDG。

    2) 節(jié)點(diǎn)嵌入。首先,重命名函數(shù)片中的變量名和函數(shù)名,完成代碼標(biāo)記抽象化。然后,使用數(shù)據(jù)集中全部函數(shù)片的代碼標(biāo)記訓(xùn)練詞向量模型word2vec。最后,使用預(yù)訓(xùn)練的word2vec 模型生成FDG 的節(jié)點(diǎn)初始表示向量,得到具有節(jié)點(diǎn)初始表示向量的FDG。

    3) 源代碼漏洞檢測(cè)。首先將FDG 輸入預(yù)訓(xùn)練的源代碼漏洞檢測(cè)網(wǎng)絡(luò)FDN,由圖學(xué)習(xí)網(wǎng)絡(luò)部分學(xué)習(xí)并感知FDG 中包含的語(yǔ)義信息,并在學(xué)習(xí)感知過(guò)程中更新節(jié)點(diǎn)表示向量。由檢測(cè)網(wǎng)絡(luò)進(jìn)行全局池化并獲取FDG 的全局表示向量,然后對(duì)FDG 的全局向量進(jìn)行降維操作得到FDG 的低維表示向量,最后采用線(xiàn)性層檢測(cè)FDG 的低維向量并得到漏洞檢測(cè)結(jié)果。

    2 特征依賴(lài)圖

    2.1 方法分析

    基于序列的方法將源代碼視為標(biāo)記序列,這種表征方法容易忽略源代碼中包含的數(shù)據(jù)信息和控制信息,從而導(dǎo)致誤報(bào)的發(fā)生。以圖2 所示的函數(shù)片為例進(jìn)行分析,基于序列的方法認(rèn)為“free(data)”出現(xiàn)在“data”的使用之前,將忽略變量“flag1”的值為-1、“flag2”的值為1 以及存在控制語(yǔ)句“if”的情況,從而誤報(bào)該函數(shù)片存在內(nèi)存釋放重用漏洞,即“use_after_free”漏洞。實(shí)際上,因?yàn)椤癴lag2”值大于0,不會(huì)執(zhí)行“free”函數(shù),后續(xù)的輸出操作是合法的堆內(nèi)存訪(fǎng)問(wèn),但是序列方法難以感知此類(lèi)復(fù)雜的控制信息和數(shù)據(jù)信息?;谛蛄械姆椒╒ulDeePecker 和SySeVR 根據(jù)候選漏洞語(yǔ)句的數(shù)據(jù)依賴(lài)信息和控制依賴(lài)信息對(duì)源代碼進(jìn)行切片,盡管考慮了源代碼的控制依賴(lài)和數(shù)據(jù)依賴(lài)相關(guān)的語(yǔ)義信息,但是未將這些信息與候選漏洞語(yǔ)句直接關(guān)聯(lián),使神經(jīng)網(wǎng)絡(luò)很難學(xué)習(xí)并感知這些關(guān)鍵信息,從而使神經(jīng)網(wǎng)絡(luò)無(wú)法做出準(zhǔn)確判斷。

    圖2 函數(shù)片示例

    基于圖結(jié)構(gòu)的源代碼漏洞檢測(cè)方法使用邊連接代碼語(yǔ)句和其相關(guān)的數(shù)據(jù)依賴(lài)和控制依賴(lài)節(jié)點(diǎn),與基于序列的方法相比,該類(lèi)方法更容易獲取候選漏洞語(yǔ)句相關(guān)的語(yǔ)義信息。在現(xiàn)有基于圖結(jié)構(gòu)的方法中,一部分方法僅采用單一代碼表示圖來(lái)表示源代碼,一部分方法則組合多種代碼表示圖以表征源代碼。這些方法采用的代碼表示圖均未顯式維護(hù)與候選漏洞語(yǔ)句相關(guān)的邊或節(jié)點(diǎn)。

    為此,本文使用FDG 表征源代碼。首先,F(xiàn)DG作為一種基于圖的代碼表征結(jié)構(gòu),語(yǔ)句間的語(yǔ)義關(guān)系通過(guò)邊結(jié)構(gòu)維護(hù),使神經(jīng)網(wǎng)絡(luò)更容易捕獲語(yǔ)義信息。其次,F(xiàn)DG 通過(guò)漏洞語(yǔ)法特征獲取候選漏洞語(yǔ)句,在圖中顯式維護(hù)與候選漏洞語(yǔ)句相關(guān)的控制信息和數(shù)據(jù)信息,使神經(jīng)網(wǎng)絡(luò)可以充分獲取與候選漏洞語(yǔ)句相關(guān)的語(yǔ)義信息。最后,F(xiàn)DG 保留與候選漏洞語(yǔ)句的語(yǔ)義信息無(wú)關(guān)的邊和節(jié)點(diǎn),因?yàn)檫@些邊和節(jié)點(diǎn)共同構(gòu)成候選漏洞語(yǔ)句的上下文環(huán)境,從另一個(gè)角度反映了現(xiàn)實(shí)軟件源代碼中漏洞發(fā)生場(chǎng)景的復(fù)雜性,保留這些信息可以檢驗(yàn)源代碼漏洞檢測(cè)方法的穩(wěn)健性。

    2.2 相關(guān)定義

    FDG 是一種圖類(lèi)型的源代碼表征結(jié)構(gòu),對(duì)于函數(shù)片f生成的FDG,可以形式化記為ffdg=(V,E,X,D),其中,V表示節(jié)點(diǎn)集;E表示有向邊集合;X表示節(jié)點(diǎn)屬性集,用于保存節(jié)點(diǎn)的類(lèi)型屬性,節(jié)點(diǎn)類(lèi)型分為2 種,分別為候選漏洞語(yǔ)句對(duì)應(yīng)的節(jié)點(diǎn)和其他語(yǔ)句對(duì)應(yīng)的節(jié)點(diǎn);D保存邊的類(lèi)型屬性,F(xiàn)DG 中邊類(lèi)型分為4 種,分別為控制依賴(lài)邊(CDE,control dependence edge)、特征控制依賴(lài)邊(FCDE,feature control dependence edge)、特征數(shù)據(jù)依賴(lài)邊(FDDE,feature data dependence edge)、數(shù)據(jù)依賴(lài)邊(DDE,data dependence edge)。

    FCDG 是一種維護(hù)候選漏洞語(yǔ)句和其他語(yǔ)句控制依賴(lài)信息的圖結(jié)構(gòu),對(duì)于函數(shù)片f生成的FCDG,可以形式化記為ffcdg=(V,E,X,D),它的邊類(lèi)型分為2 種,與候選漏洞語(yǔ)句相關(guān)的控制依賴(lài)邊記為FCDE,其他語(yǔ)句對(duì)應(yīng)的控制依賴(lài)邊記為CDE。

    FDDG 是一種維護(hù)候選漏洞語(yǔ)句和其他語(yǔ)句數(shù)據(jù)依賴(lài)信息的圖結(jié)構(gòu),對(duì)于函數(shù)片f生成的FDDG,可以形式化記為ffddg=(V,E,X,D),它的邊類(lèi)型分為2種,與候選漏洞語(yǔ)句相關(guān)的數(shù)據(jù)依賴(lài)邊記為FDDE,其他語(yǔ)句對(duì)應(yīng)的數(shù)據(jù)依賴(lài)邊記為DDE。

    本文提出控制依賴(lài)鏈反映代碼語(yǔ)句的多級(jí)控制依賴(lài)關(guān)系。對(duì)于代碼語(yǔ)句而言,其直接控制依賴(lài)決定它的執(zhí)行流方向,其直接控制依賴(lài)的控制依賴(lài)也影響它的執(zhí)行。如圖3 所示,代碼語(yǔ)句b是a 的直接控制依賴(lài),c 是b 的直接控制依賴(lài),因此代碼語(yǔ)句c 的執(zhí)行效果也影響a 的執(zhí)行。對(duì)于源代碼漏洞檢測(cè)而言,使神經(jīng)網(wǎng)絡(luò)獲取候選漏洞語(yǔ)句的控制依賴(lài)鏈信息,有助于神經(jīng)網(wǎng)絡(luò)做出準(zhǔn)確判斷。

    圖3 控制依賴(lài)鏈?zhǔn)纠?/p>

    與控制依賴(lài)鏈同理,本文提出數(shù)據(jù)依賴(lài)鏈反映變量的初始化和更新過(guò)程。控制依賴(lài)鏈可以反映候選漏洞語(yǔ)句所涉及變量的處理過(guò)程,使神經(jīng)網(wǎng)絡(luò)捕獲更全面的數(shù)據(jù)信息,從而提高漏洞檢測(cè)準(zhǔn)確率。

    2.3 特征依賴(lài)圖生成過(guò)程

    本文提出一種函數(shù)片f到FDG 的生成算法——FDG 生成算法(如算法1 所示)。該算法包括獲取候選漏洞語(yǔ)句、生成特征控制依賴(lài)圖、生成特征數(shù)據(jù)依賴(lài)圖和生成特征依賴(lài)圖4 個(gè)步驟。

    算法1FDG 生成算法

    輸入函數(shù)片f

    輸出一個(gè)以FDG 為元素的集合S

    1) 獲取候選漏洞語(yǔ)句

    候選漏洞語(yǔ)句指具有漏洞語(yǔ)法特征的潛在漏洞語(yǔ)句。本步驟采用的漏洞語(yǔ)法特征由SySeVR[3]提出,包括函數(shù)調(diào)用、數(shù)組用法、指針用法和算法表達(dá)式4 種,其中,函數(shù)調(diào)用類(lèi)型的漏洞語(yǔ)法特征包括811 種C/C++的敏感API;SySeVR 提出的4 種漏洞語(yǔ)法特征對(duì)應(yīng)126 種CWE 類(lèi)型,覆蓋了常見(jiàn)漏洞類(lèi)型。本文方法旨在利用4 種漏洞語(yǔ)法特征更大程度地獲取候選漏洞語(yǔ)句相關(guān)的語(yǔ)義信息,從而提高漏洞檢測(cè)準(zhǔn)確率,降低誤報(bào)率。

    算法1的步驟1)~步驟2)獲取函數(shù)片f的候選漏洞語(yǔ)句。首先使用代碼分析工具Joern 生成函數(shù)片f對(duì)應(yīng)的抽象語(yǔ)法樹(shù)fast。然后在fast上匹配4 種漏洞語(yǔ)法特征,得到候選漏洞語(yǔ)句。具體而言,在遍歷fast節(jié)點(diǎn)過(guò)程中,若節(jié)點(diǎn)包含的代碼語(yǔ)句為函數(shù)調(diào)用且屬于811 種敏感API 之一,則該代碼語(yǔ)句為敏感函數(shù)調(diào)用;若節(jié)點(diǎn)包含的代碼語(yǔ)句包含"[]"字符,則為數(shù)組用法;同理,代碼語(yǔ)句包含"*"字符,視為指針用法,若包含"+-*/^"等運(yùn)算符,則將該代碼語(yǔ)句視為算法表達(dá)式。代碼語(yǔ)句符合以上4 種規(guī)則時(shí),將該語(yǔ)句視為候選漏洞語(yǔ)句,并將其加入Scvs。當(dāng)遍歷完fast的全部節(jié)點(diǎn)時(shí),得到函數(shù)片f對(duì)應(yīng)的候選漏洞語(yǔ)句集合Scvs。

    圖2 所示的函數(shù)片示例對(duì)應(yīng)的部分AST 如圖4所示,其中“free(data)”是庫(kù)函數(shù)調(diào)用,同“free”函數(shù)屬于811 種敏感API 之一,因此“free(data)”是一條候選漏洞語(yǔ)句。

    圖4 函數(shù)片示例對(duì)應(yīng)的部分AST

    2) 生成特征控制依賴(lài)圖

    生成特征控制依賴(lài)圖的本質(zhì)是在控制依賴(lài)圖上標(biāo)注候選漏洞語(yǔ)句對(duì)應(yīng)的控制依賴(lài)鏈。在FCDG中,候選漏洞語(yǔ)句的控制依賴(lài)鏈的每條邊被標(biāo)注為FCDE,與候選漏洞語(yǔ)句無(wú)關(guān)的控制依賴(lài)邊被標(biāo)注為CDE。算法1 的步驟6)~步驟22)為生成FCDG的過(guò)程。

    函數(shù)片f對(duì)應(yīng)的FCDG 記為ffcdg,ffcdg被初始化為函數(shù)片f對(duì)應(yīng)的控制依賴(lài)圖,然后在計(jì)算候選漏洞語(yǔ)句的控制依賴(lài)鏈過(guò)程中,修改原始控制依賴(lài)圖得到ffcdg,即特征控制依賴(lài)圖。在候選漏洞語(yǔ)句對(duì)應(yīng)的控制依賴(lài)節(jié)點(diǎn)集Sc初始化時(shí),Sc僅包含候選漏洞語(yǔ)句一個(gè)元素,算法1 從Sc中取出候選漏洞語(yǔ)句并開(kāi)始查找它的控制依賴(lài)節(jié)點(diǎn)。在遍歷ffcdg各邊的過(guò)程中,當(dāng)某條邊的目的節(jié)點(diǎn)是候選漏洞語(yǔ)句時(shí),將該邊的目的節(jié)點(diǎn)屬性設(shè)置為“bad”,表示此節(jié)點(diǎn)對(duì)應(yīng)候選漏洞語(yǔ)句;同時(shí),將該邊的屬性設(shè)置為特征控制依賴(lài)邊 FCDE,表示該邊為候選漏洞語(yǔ)句對(duì)應(yīng)控制依賴(lài)鏈的一部分。此外,將該邊對(duì)應(yīng)的源節(jié)點(diǎn)加入Sc中繼續(xù)計(jì)算其控制依賴(lài)節(jié)點(diǎn)。如果某條邊的目的節(jié)點(diǎn)不是候選漏洞語(yǔ)句,則將該邊的屬性設(shè)置為控制依賴(lài)邊CDE。除候選漏洞語(yǔ)句對(duì)應(yīng)的節(jié)點(diǎn)外,其余節(jié)點(diǎn)屬性設(shè)置為“good”,表示不包含候選漏洞語(yǔ)句。當(dāng)Sc為空時(shí),控制依賴(lài)鏈標(biāo)注完畢,得到當(dāng)前處理的候選漏洞語(yǔ)句的ffcdg。

    以圖4 中的候選漏洞語(yǔ)句“free(data)”為例,其對(duì)應(yīng)的 FCDG 如圖 5 所示。候選漏洞語(yǔ)句“free(data)”的控制依賴(lài)鏈由2 條FCDE 組成。

    圖5 候選漏洞語(yǔ)句“free(data)”對(duì)應(yīng)的FCDG

    3) 生成特征數(shù)據(jù)依賴(lài)圖

    生成特征數(shù)據(jù)依賴(lài)圖的本質(zhì)是在數(shù)據(jù)依賴(lài)圖上標(biāo)注候選漏洞語(yǔ)句對(duì)應(yīng)的數(shù)據(jù)依賴(lài)鏈。在FDDG中,候選漏洞語(yǔ)句對(duì)應(yīng)數(shù)據(jù)依賴(lài)鏈的每條邊被標(biāo)注為 FDDE,與候選漏洞語(yǔ)句無(wú)關(guān)的邊被標(biāo)注為DDE。FDDG 的生成過(guò)程如算法1 的步驟24)~步驟34)所示。

    與生成FCDG 的過(guò)程類(lèi)似,函數(shù)片f對(duì)應(yīng)的FDDG 記為ffddg,它被初始化為函數(shù)片f對(duì)應(yīng)的數(shù)據(jù)依賴(lài)圖。在遍歷ffddg的邊集時(shí),如果某條邊的目的節(jié)點(diǎn)是候選漏洞語(yǔ)句,則將該邊的屬性標(biāo)注為FDDE,表示源節(jié)點(diǎn)是候選漏洞語(yǔ)句的數(shù)據(jù)依賴(lài)節(jié)點(diǎn)。同時(shí)將源節(jié)點(diǎn)加入候選漏洞語(yǔ)句的數(shù)據(jù)依賴(lài)節(jié)點(diǎn)集合Sd。在下一輪循環(huán)時(shí),取出上一輪保存的源節(jié)點(diǎn),繼續(xù)查找其控制依賴(lài)節(jié)點(diǎn)。通過(guò)上面的遞歸過(guò)程,可以查找候選漏洞語(yǔ)句的數(shù)據(jù)依賴(lài)鏈,并修改邊屬性為FDDE,標(biāo)注候選漏洞語(yǔ)句的數(shù)據(jù)依賴(lài)鏈。當(dāng)Sd為空時(shí),候選漏洞語(yǔ)句的數(shù)據(jù)依賴(lài)鏈標(biāo)注完畢,得到特征數(shù)據(jù)依賴(lài)圖ffddg。

    以圖4 中的候選漏洞語(yǔ)句“free(data)”為例,其對(duì)應(yīng)的部分FDDG 如圖6 所示。候選漏洞語(yǔ)句“free(data)”的數(shù)據(jù)依賴(lài)鏈由2 條FDDE 組成。

    圖6 候選漏洞語(yǔ)句“free(data)”對(duì)應(yīng)的FDDG

    4) 生成特征依賴(lài)圖

    特征依賴(lài)圖由特征控制依賴(lài)圖和特征數(shù)據(jù)依賴(lài)圖融合而來(lái),融合過(guò)程如算法1 的步驟35)所示。在融合過(guò)程中,首先將FDG 的節(jié)點(diǎn)集設(shè)置為FCDG節(jié)點(diǎn)集和FDDG 節(jié)點(diǎn)集的并集,然后將FDG 的邊集設(shè)置為FCDG 邊集和FDDG 邊集的并集,最后將節(jié)點(diǎn)屬性和邊屬性合并。

    此外,每條候選漏洞語(yǔ)句對(duì)應(yīng)特有的FDG,因此一條候選漏洞語(yǔ)句處理完成時(shí),將生成的FDG 加入集合S。當(dāng)處理完畢函數(shù)片f的全部候選漏洞語(yǔ)句,得到集合S,S包含函數(shù)f對(duì)應(yīng)的全部FDG。

    以圖4 中的候選漏洞語(yǔ)句“free(data)”為例,經(jīng)過(guò)FCDG 和FDDG 融合過(guò)程,生成的部分FDG如圖7 所示。

    圖7 候選漏洞語(yǔ)句“free(data)”對(duì)應(yīng)的FDG

    2.4 算法復(fù)雜度分析

    對(duì)于每條候選漏洞語(yǔ)句,算法1 生成其對(duì)應(yīng)的FDG,算法1 處理控制依賴(lài)圖得到特征控制依賴(lài)圖,設(shè)控制依賴(lài)圖平均節(jié)點(diǎn)數(shù)量為n,n個(gè)節(jié)點(diǎn)最差情況下有n(n+1)條有向邊。在查找候選漏洞語(yǔ)句的控制依賴(lài)鏈時(shí),需要遍歷全部邊以計(jì)算下一個(gè)控制依賴(lài)節(jié)點(diǎn),最壞情況下,對(duì)全部邊進(jìn)行n次遍歷,因此時(shí)間復(fù)雜度為O(n3)。特征數(shù)據(jù)依賴(lài)圖生成的時(shí)間復(fù)雜度同理,因此算法的時(shí)間復(fù)雜度為O(n3)。算法執(zhí)行過(guò)程中,保存的主要數(shù)據(jù)是候選漏洞語(yǔ)句的控制依賴(lài)或數(shù)據(jù)依賴(lài)節(jié)點(diǎn)集,最壞情況下保存全部n個(gè)節(jié)點(diǎn),因此空間復(fù)雜度為O(n)。

    在實(shí)際的FDG 生成過(guò)程中,因?yàn)榭刂埔蕾?lài)圖或數(shù)據(jù)依賴(lài)圖為函數(shù)片的代碼表示結(jié)構(gòu),源代碼中控制依賴(lài)關(guān)系和數(shù)據(jù)依賴(lài)關(guān)系有限,因此大部分語(yǔ)句節(jié)點(diǎn)間均無(wú)連接邊。此外,在真實(shí)函數(shù)片中,控制語(yǔ)句的嵌套層數(shù)和數(shù)據(jù)依賴(lài)的層數(shù)有限,因此生成FDG 的實(shí)際執(zhí)行時(shí)間適中,具備可行性,5.5 節(jié)的實(shí)驗(yàn)數(shù)據(jù)證明了這一結(jié)論。

    3 節(jié)點(diǎn)嵌入

    節(jié)點(diǎn)嵌入指設(shè)置FDG 的節(jié)點(diǎn)初始表示向量。圖神經(jīng)網(wǎng)絡(luò)的本質(zhì)是通過(guò)節(jié)點(diǎn)間的信息交換和聚合鄰居信息以獲得新的節(jié)點(diǎn)表示向量[15-16],因此需要對(duì)輸入圖神經(jīng)網(wǎng)絡(luò)的FDG 節(jié)點(diǎn)設(shè)置初始表示向量。節(jié)點(diǎn)嵌入階段的輸入是FDG,輸出是具有節(jié)點(diǎn)初始表示向量的FDG。節(jié)點(diǎn)嵌入的處理過(guò)程包括以下3 個(gè)步驟。

    1) 代碼標(biāo)記抽象化。首先將函數(shù)片f拆分為單個(gè)代碼標(biāo)記的組合,記為fT={t1,t2,…,tn},其中ti為單個(gè)代碼標(biāo)記。然后依次遍歷ti(1≤i≤n),若ti為變量名,則將ti及其相同的變量標(biāo)記抽象化為vari,若ti為函數(shù)名,則將ti及其相同的函數(shù)標(biāo)記抽象化為funi,得到抽象化后的代碼標(biāo)記組合為。最后,遍歷FDG的節(jié)點(diǎn)集,修改經(jīng)過(guò)更新的變量名和函數(shù)名,得到不含具體變量名和函數(shù)名的FDG。經(jīng)過(guò)代碼標(biāo)記抽象化后,具體的變量名和函數(shù)名被抽象名稱(chēng)替代,使神經(jīng)網(wǎng)絡(luò)更易感知FDG 節(jié)點(diǎn)間語(yǔ)義關(guān)系的學(xué)習(xí),減小具體的變量名和函數(shù)名對(duì)神經(jīng)網(wǎng)絡(luò)感知過(guò)程的影響。

    2) word2vec 訓(xùn)練。此步驟僅在首次節(jié)點(diǎn)嵌入時(shí)執(zhí)行。word2vec 是一種詞嵌入模型,它的主要思想是構(gòu)造一個(gè)向量空間,使具有相似上下文的詞在向量空間中彼此接近,不同上下文的詞在向量空間中距離較大[17]。本文使用word2vec 模型生成單個(gè)代碼標(biāo)記的表示向量,首先將經(jīng)過(guò)標(biāo)記抽象化的函數(shù)片拆分為單個(gè)代碼標(biāo)記的組合,然后將全部代碼標(biāo)記組織為一個(gè)詞庫(kù)文件,最后以詞庫(kù)文件為word2vec 模型的輸入,訓(xùn)練word2vec 模型,獲得最佳模型參數(shù)。

    3) 節(jié)點(diǎn)初始表示向量生成。遍歷FDG 的每個(gè)節(jié)點(diǎn),將節(jié)點(diǎn)對(duì)應(yīng)的代碼語(yǔ)句拆分為單個(gè)代碼標(biāo)記的組合,對(duì)于每個(gè)代碼標(biāo)記,使用預(yù)訓(xùn)練的word2vec 生成其表示向量,將全部代碼標(biāo)記的表示向量相加得到節(jié)點(diǎn)初始表示向量。此外,為使初始表示向量包含節(jié)點(diǎn)的類(lèi)型信息,在節(jié)點(diǎn)初始表示向量起始處增加一個(gè)維度,候選漏洞語(yǔ)句對(duì)應(yīng)的節(jié)點(diǎn)此維度的值設(shè)置為1,其他節(jié)點(diǎn)此維度的值設(shè)置為0。因此節(jié)點(diǎn)n的初始表示向量可以記為={pn,a1,…,am},其中,pn表示節(jié)點(diǎn)n的類(lèi)型,即該節(jié)點(diǎn)是否為候選漏洞語(yǔ)句;ai(1≤i≤m)為表示向量的維度,本文設(shè)置m=128。

    4 源代碼漏洞檢測(cè)

    4.1 漏洞檢測(cè)網(wǎng)絡(luò)架構(gòu)

    本文所提的源代碼表征結(jié)構(gòu)FDG 是一種異構(gòu)圖,包含2 種不同的節(jié)點(diǎn)類(lèi)型和4 種不同的邊類(lèi)型,F(xiàn)DG 使漏洞檢測(cè)網(wǎng)絡(luò)更容易學(xué)習(xí)并感知源代碼中與候選漏洞語(yǔ)句相關(guān)的控制和依賴(lài)信息。對(duì)于源代碼漏洞檢測(cè)而言,F(xiàn)DG 中候選漏洞語(yǔ)句對(duì)應(yīng)的節(jié)點(diǎn)相比其他節(jié)點(diǎn)而言更重要,其對(duì)應(yīng)的控制依賴(lài)和數(shù)據(jù)依賴(lài)也比其他節(jié)點(diǎn)的語(yǔ)義信息更重要?,F(xiàn)有基于圖結(jié)構(gòu)的源代碼漏洞檢測(cè)方法基于GGNN 構(gòu)建漏洞檢測(cè)網(wǎng)絡(luò),GGNN 適合同構(gòu)圖的學(xué)習(xí)和感知,并未考慮不同類(lèi)型的節(jié)點(diǎn)和邊在圖表示方面的差異性。

    為克服以上問(wèn)題,本文提出一種針對(duì)FDG 的漏洞檢測(cè)網(wǎng)絡(luò)FDN。FDN 由圖學(xué)習(xí)網(wǎng)絡(luò)和檢測(cè)網(wǎng)絡(luò)組成,其網(wǎng)絡(luò)結(jié)構(gòu)如圖8 所示。FDN 使用函數(shù)片訓(xùn)練集最小化損失函數(shù),通過(guò)梯度下降算法獲得最優(yōu)網(wǎng)絡(luò)參數(shù),得到預(yù)訓(xùn)練的FDN。當(dāng)檢測(cè)新的函數(shù)樣本時(shí),首先生成函數(shù)片對(duì)應(yīng)的FDG,然后將FDG 輸入預(yù)訓(xùn)練的FDN,得到源代碼漏洞檢測(cè)結(jié)果。

    圖8 FDN 網(wǎng)絡(luò)結(jié)構(gòu)

    4.2 圖學(xué)習(xí)網(wǎng)絡(luò)

    圖學(xué)習(xí)網(wǎng)絡(luò)通過(guò)學(xué)習(xí)感知FDG 的鄰居節(jié)點(diǎn)信息,更新節(jié)點(diǎn)表示向量。圖學(xué)習(xí)網(wǎng)絡(luò)由異構(gòu)圖轉(zhuǎn)換器(HGT,heterogeneous graph transformer)[18]和線(xiàn)性整流函數(shù)——修正線(xiàn)性單元(ReLU,rectified linear unit)組成。HGT 通過(guò)異構(gòu)注意力機(jī)制學(xué)習(xí)并感知FDG 節(jié)點(diǎn)間的信息。ReLU 是一種高效的激活函數(shù),可以有效避免梯度消失和梯度爆炸問(wèn)題。對(duì)于FDG,HGT 的學(xué)習(xí)感知過(guò)程包括異構(gòu)注意力計(jì)算、鄰居信息傳遞和目標(biāo)節(jié)點(diǎn)聚合3 個(gè)步驟。

    1) 異構(gòu)注意力計(jì)算

    此步驟的目的是計(jì)算FDG 中每個(gè)節(jié)點(diǎn)t的全部鄰居節(jié)點(diǎn)相對(duì)于節(jié)點(diǎn)t的注意力頭分?jǐn)?shù)。s的全部鄰居節(jié)點(diǎn)集合為N(t),注意力頭數(shù)為h,t和s之間連接邊為e,層數(shù)為l,節(jié)點(diǎn)表示向量的維度為d。此外,定義函數(shù)τ(n),τ用于獲取節(jié)點(diǎn)n的類(lèi)型,值域?yàn)閧‘good’,‘bad’}。定義函數(shù)φ(e),φ用于獲取邊e的類(lèi)型,值域?yàn)閧‘cde’,‘fcde’,‘dde’,‘fdde’}。對(duì)于第i個(gè)注意力頭分?jǐn)?shù)的計(jì)算,首先使用式(1)計(jì)算源節(jié)點(diǎn)s的鍵向量K。

    其中,K i(s)為第i個(gè)注意力頭上節(jié)點(diǎn)s的鍵向量,K_Linear 為第i個(gè)注意力頭上和節(jié)點(diǎn)類(lèi)型相關(guān)的線(xiàn)性映射,H為節(jié)點(diǎn)的表示向量。對(duì)于不同類(lèi)型的節(jié)點(diǎn)使用不同的線(xiàn)性映射,這使候選漏洞語(yǔ)句節(jié)點(diǎn)和其他節(jié)點(diǎn)在計(jì)算鍵向量K時(shí)具有不同的特征表示空間,并且這些線(xiàn)性映射是可學(xué)習(xí)的,從而可以?xún)?yōu)化不同類(lèi)型的節(jié)點(diǎn)表示。然后,使用式(2)計(jì)算查詢(xún)向量Q。

    其中,Q i(t)為第i個(gè)注意力頭上節(jié)點(diǎn)t的查詢(xún)向量,Q_Linear為第i個(gè)注意力頭上和節(jié)點(diǎn)類(lèi)型相關(guān)的線(xiàn)性映射。使用式(3)計(jì)算目標(biāo)節(jié)點(diǎn)t與鄰居s注意力分?jǐn)?shù)。

    其中,μ為與源節(jié)點(diǎn)類(lèi)型、連接邊類(lèi)型和目的節(jié)點(diǎn)類(lèi)型相關(guān)的縮放因子,此外,式(3)在計(jì)算鍵向量K和查詢(xún)向量Q的相似度時(shí)引入與邊類(lèi)型相關(guān)轉(zhuǎn)換矩陣W,即在相似度計(jì)算時(shí),不同的邊類(lèi)型使用不同的W,這使注意力計(jì)算可以考慮源節(jié)點(diǎn)和目的節(jié)點(diǎn)間的連接關(guān)系。在漏洞檢測(cè)場(chǎng)景下,W作為FDN 的一類(lèi)網(wǎng)絡(luò)參數(shù),在訓(xùn)練過(guò)程中,因?yàn)镕CDE 和FDDE連接的節(jié)點(diǎn)語(yǔ)句包含更多與候選漏洞語(yǔ)句相關(guān)的信息,梯度下降算法將調(diào)整FCDE 和FDDE 的權(quán)重,以使FDN 網(wǎng)絡(luò)損失更小,漏洞檢測(cè)性能更高。

    對(duì)于每一個(gè)注意力頭,當(dāng)?shù)玫侥繕?biāo)節(jié)點(diǎn)t與鄰居s注意力分?jǐn)?shù)后,使用式(4)組合每個(gè)注意力頭上的注意力分?jǐn)?shù),并經(jīng)過(guò)Softmax 函數(shù)處理,將注意力分?jǐn)?shù)轉(zhuǎn)換為概率值。

    在FDG 上進(jìn)行異構(gòu)注意力計(jì)算的示意如圖9所示。圖9 中,中間節(jié)點(diǎn)是候選漏洞語(yǔ)句節(jié)點(diǎn),其他節(jié)點(diǎn)對(duì)應(yīng)良性語(yǔ)句。對(duì)于中間節(jié)點(diǎn)而言,每個(gè)鄰居節(jié)點(diǎn)對(duì)其產(chǎn)生不同程度的影響,異構(gòu)注意力計(jì)算旨在獲取其每個(gè)鄰接節(jié)點(diǎn)相對(duì)于中間節(jié)點(diǎn)的重要性分?jǐn)?shù)。因?yàn)镕CDE 和FDDE 分別連接候選漏洞語(yǔ)句的控制依賴(lài)節(jié)點(diǎn)和數(shù)據(jù)依賴(lài)節(jié)點(diǎn),這2 種語(yǔ)義信息相比于其他節(jié)點(diǎn)的語(yǔ)義信息更重要,所以FDN會(huì)自動(dòng)增加FCDE 和FDDE 的連接強(qiáng)度,以適應(yīng)漏洞檢測(cè)場(chǎng)景。

    圖9 異構(gòu)注意力計(jì)算示意

    2) 鄰居信息傳遞

    首先,在第i個(gè)注意力頭的計(jì)算消息頭

    其中,W為計(jì)算消息頭場(chǎng)景下與邊類(lèi)型相關(guān)的轉(zhuǎn)換矩陣,M_Lineari為第i個(gè)注意力頭和節(jié)點(diǎn)類(lèi)型相關(guān)的線(xiàn)性映射。然后組合h個(gè)消息頭,即

    3) 目標(biāo)節(jié)點(diǎn)聚合

    首先,通過(guò)將目標(biāo)節(jié)點(diǎn)t的鄰居與其對(duì)應(yīng)的注意力分?jǐn)?shù)加權(quán)求和,獲得聚合消息向量為

    然后,將聚合消息向量輸入激活函數(shù),通過(guò)針對(duì)特定節(jié)點(diǎn)類(lèi)型的線(xiàn)性映射將聚合消息向量映射到目標(biāo)節(jié)點(diǎn)類(lèi)型的特征空間,與上一層目標(biāo)節(jié)點(diǎn)的表示向量相加,得到更新后的目標(biāo)節(jié)點(diǎn)向量為

    其中,A_Linear 為與節(jié)點(diǎn)類(lèi)型相關(guān)的線(xiàn)性映射,σ為激活函數(shù)。

    4.3 漏洞檢測(cè)

    檢測(cè)網(wǎng)絡(luò)旨在進(jìn)行全局池化和全局表示向量降維,并進(jìn)行漏洞檢測(cè)。首先,將經(jīng)過(guò)信息交換的FDG 輸入檢測(cè)網(wǎng)絡(luò),經(jīng)過(guò)全局均值池化過(guò)程處理后,得到FDG 的全局表示向量Hfdg

    其中,N表示FDG 的節(jié)點(diǎn)個(gè)數(shù),x表示單個(gè)節(jié)點(diǎn)的表示向量。全局表示向量Hfdg不僅反映了此時(shí)全部節(jié)點(diǎn)的狀態(tài),而且蘊(yùn)含數(shù)據(jù)依賴(lài)和控制依賴(lài)關(guān)系,整體反映了FDG 的語(yǔ)義信息。

    為提取全局表示向量的有效特征,剔除與漏洞信息無(wú)關(guān)的冗余特征,采用線(xiàn)性層對(duì)全局表示向量進(jìn)行降維操作,得到FDG 的低維表示向量。在FDN中,該線(xiàn)性層的輸入維度為節(jié)點(diǎn)維度,輸出維度為原節(jié)點(diǎn)維度的。

    此時(shí),F(xiàn)DG 的低維表示向量蘊(yùn)含F(xiàn)DG 所包含的全部信息。于是采用線(xiàn)性層進(jìn)行漏洞檢測(cè)。該線(xiàn)性層的輸入是FDG 的低維表示向量,線(xiàn)性層內(nèi)部對(duì)FDG 的低維表示向量進(jìn)行加權(quán)計(jì)算后,得到線(xiàn)性層輸出維度的2 個(gè)神經(jīng)元激活值,它們分別代表FDG 有無(wú)漏洞的置信度,即源代碼漏洞檢測(cè)結(jié)果。最后,使用Softmax 函數(shù)將2 個(gè)神經(jīng)元的激活值轉(zhuǎn)換為概率值,得到漏洞檢測(cè)結(jié)果的概率表示。

    5 實(shí)驗(yàn)與結(jié)果

    5.1 數(shù)據(jù)集

    為驗(yàn)證本文所提方法的有效性,選取軟件保障參考數(shù)據(jù)集(SARD,software assurance reference dataset)和來(lái)源于真實(shí)軟件項(xiàng)目的Devign 數(shù)據(jù)集[13]、Reveal數(shù)據(jù)集[7]進(jìn)行驗(yàn)證實(shí)驗(yàn)。

    SARD 由美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究院提出,SARD 中的代碼一部分是生產(chǎn)環(huán)境中源程序的半合成代碼,一部分是用于學(xué)術(shù)研究的人工合成代碼。數(shù)據(jù)集中源代碼有3 種類(lèi)型,分別是有漏洞的源代碼、無(wú)漏洞的源代碼以及修補(bǔ)過(guò)漏洞的源代碼。

    SARD 包含118 種CWE 漏洞,本文選擇數(shù)據(jù)量較多的7 種漏洞類(lèi)型進(jìn)行驗(yàn)證。SARD 中源代碼并未以函數(shù)片形式存在,因此本文使用Ecplise CDT 來(lái)逐個(gè)解析源代碼文件的結(jié)構(gòu),獲取源代碼文件中的全部聲明,然后遍歷每個(gè)聲明判斷其是否為函數(shù)聲明。如果是,則獲取它的函數(shù)定義,另存為函數(shù)片。同時(shí),判斷函數(shù)聲明中是否包含“good”或者“bad”關(guān)鍵字,如果包含,則將對(duì)應(yīng)的標(biāo)簽值0 或1 寫(xiě)入函數(shù)片文件名,1 表示函數(shù)片存在漏洞,0 表示無(wú)漏洞。預(yù)處理后的SARD 數(shù)據(jù)集信息如表1 所示。

    表1 預(yù)處理后的SARD 信息

    Devign 數(shù)據(jù)集由Zhou 等[13]提出。該數(shù)據(jù)集從Linux Kernel、Qemu、Wireshark 和FFmpeg 項(xiàng)目中提取與安全問(wèn)題相關(guān)的代碼提交,通過(guò)比對(duì)提交前后函數(shù)片是否修改來(lái)確定是否存在漏洞。同時(shí),由安全研究人員人工確認(rèn)函數(shù)片的安全性,以保證數(shù)據(jù)集的質(zhì)量[13]。該數(shù)據(jù)集能夠反映現(xiàn)實(shí)軟件項(xiàng)目代碼的復(fù)雜性,可以較好地評(píng)估漏洞檢測(cè)方法的性能。Devign 數(shù)據(jù)集中存在漏洞的函數(shù)片為12 458 個(gè),無(wú)漏洞的函數(shù)片為14 855 個(gè),每個(gè)函數(shù)片已經(jīng)包含標(biāo)簽值。

    Reveal 數(shù)據(jù)集由Chakraborty 等[7]提出。該數(shù)據(jù)集通過(guò)跟蹤Linux Debian Kernel 和Chromium 這2 個(gè)開(kāi)源項(xiàng)目的歷史漏洞生成。這2 個(gè)軟件項(xiàng)目有長(zhǎng)期的更新歷史,分別代表了操作系統(tǒng)和瀏覽器這2 個(gè)重要的軟件領(lǐng)域,同時(shí)它們具有大量公開(kāi)可用的漏洞報(bào)告,適合源代碼漏洞檢測(cè)方法的驗(yàn)證[7]。Reveal 數(shù)據(jù)集中存在漏洞的函數(shù)片為2 238 個(gè),無(wú)漏洞的函數(shù)片為20 487 個(gè),每個(gè)函數(shù)片已經(jīng)包含標(biāo)簽值。經(jīng)過(guò)FDG 生成過(guò)程,Devign 數(shù)據(jù)集和Reveal數(shù)據(jù)集的信息如表2 所示。

    表2 預(yù)處理后的數(shù)據(jù)集信息

    5.2 實(shí)驗(yàn)環(huán)境配置

    實(shí)驗(yàn)使用的CPU 為Intel(R) Xeon(R) Gold 5215,內(nèi)存大小為48 GB,顯卡型號(hào)為T(mén)esla-V100。本文使用Pytorch 1.11.0 和Pytorch-geometric 2.0.4實(shí)現(xiàn)FBLD 方法,訓(xùn)練集與測(cè)試集的比例為7:3,訓(xùn)練輪次為100 輪,訓(xùn)練學(xué)習(xí)率設(shè)置為0.001,訓(xùn)練過(guò)程中學(xué)習(xí)率隨時(shí)間指數(shù)級(jí)衰減。圖學(xué)習(xí)網(wǎng)絡(luò)部分的HGT 的注意力頭數(shù)設(shè)置為2。

    5.3 評(píng)價(jià)標(biāo)準(zhǔn)

    實(shí)驗(yàn)采用的評(píng)價(jià)指標(biāo)包括準(zhǔn)確率、精確率、召回率和F1 分?jǐn)?shù)。每個(gè)指標(biāo)的計(jì)算方法為

    準(zhǔn)確率(A,accuracy)。準(zhǔn)確分類(lèi)的樣本占總樣本數(shù)量的比例,準(zhǔn)確率計(jì)算方法為

    精確率(P,precision)。在所有被判斷為存在漏洞的樣本中,判斷正確的樣本比例,精確率計(jì)算方法為

    召回率(R,recall)。被成功檢測(cè)出的漏洞樣本占所有漏洞樣本的比例,召回率計(jì)算方法為

    F1 分?jǐn)?shù)(F1,F1-score)。精確率和召回率的調(diào)和平均值,反映模型整體表現(xiàn)情況,F(xiàn)1 計(jì)算方法為

    在上述指標(biāo)計(jì)算式中,TP(true positive)為漏洞樣本檢測(cè)為漏洞樣本的樣例數(shù),TN(true negative)為良性樣本檢測(cè)為良性樣本的樣例數(shù),F(xiàn)P(false positive)為漏洞樣本檢測(cè)為良性樣本的樣例數(shù),F(xiàn)N(false negative)為良性樣本檢測(cè)為漏洞樣本的樣例數(shù)。

    5.4 漏洞檢測(cè)實(shí)驗(yàn)結(jié)果與分析

    為驗(yàn)證本文提出的FBLD 的源代碼漏洞檢測(cè)性能,在SARD 數(shù)據(jù)集、Devign 數(shù)據(jù)集和Reveal數(shù)據(jù)集上分別采用FBLD 和7 種源代碼漏洞檢測(cè)先進(jìn)方法(SySeVR 方法[3]、Reveal 方法[7]、Russell方法[9]、VulDeePecker 方法[10]、μVulDeePecker 方法[11]、VulDeeLocator 方法[12]和Devign 方法[13])進(jìn)行漏洞檢測(cè)。8 種方法在SRAD 上的漏洞檢測(cè)評(píng)價(jià)指標(biāo)如表3~表6 所示,在Devign 數(shù)據(jù)集和Reveal 數(shù)據(jù)集上的漏洞檢測(cè)評(píng)價(jià)指標(biāo)分別如圖10~圖13 所示。

    圖10 各方法在Devign 和Reveal 數(shù)據(jù)集上的準(zhǔn)確率對(duì)比

    圖11 各方法在Devign 和Reveal 數(shù)據(jù)集上的精確率對(duì)比

    圖12 各方法在Devign 和Reveal 數(shù)據(jù)集上的召回率對(duì)比

    圖13 各方法在Devign 和Reveal 數(shù)據(jù)集上的F1 分?jǐn)?shù)對(duì)比

    表3 SARD 數(shù)據(jù)集上各方法準(zhǔn)確率對(duì)比

    表4 SARD 數(shù)據(jù)集上各方法精確率對(duì)比

    表5 SARD 數(shù)據(jù)集上各方法召回率對(duì)比

    表6 SARD 數(shù)據(jù)集上各方法F1 分?jǐn)?shù)對(duì)比

    實(shí)驗(yàn)結(jié)果表明,F(xiàn)BLD 在3 個(gè)數(shù)據(jù)集上的關(guān)鍵評(píng)價(jià)指標(biāo)大多優(yōu)于其他方法,其中,準(zhǔn)確率比最優(yōu)方法提高 0.87%~7.39%,精確率提高2.22%~9.56%,召回率提高1.50%~22.32%,F(xiàn)1分?jǐn)?shù)提高1.86%~16.69%。在SARD 上的檢測(cè)實(shí)驗(yàn)主要針對(duì)7 種漏洞類(lèi)型(CWE20、CWE78、CWE129、CWE190、CWE400、CWE787、CWE789),針對(duì)CWE20、CWE129、CWE190、CWE789 漏洞類(lèi)型,F(xiàn)BLD 的4 個(gè)評(píng)價(jià)指標(biāo)(準(zhǔn)確率、精確率、召回率、F1 分?jǐn)?shù))均優(yōu)于其他方法。其原因如下。1) FDG 顯式維護(hù)候選漏洞語(yǔ)句的控制依賴(lài)鏈和數(shù)據(jù)依賴(lài)鏈,區(qū)分候選漏洞語(yǔ)句和其他語(yǔ)句的節(jié)點(diǎn)類(lèi)型,這使漏洞檢測(cè)網(wǎng)絡(luò)FDN 更容易捕獲與候選漏洞語(yǔ)句相關(guān)的語(yǔ)義信息。2) FDN能夠?qū)W習(xí)并感知FDG 中豐富的語(yǔ)義信息,并自動(dòng)調(diào)整不同邊類(lèi)型和節(jié)點(diǎn)類(lèi)型對(duì)于漏洞檢測(cè)的重要性,提高了FBLD 的漏洞檢測(cè)性能。

    以CWE787 越界寫(xiě)入漏洞為例,假設(shè)存在一個(gè)數(shù)組緩沖區(qū),判斷越界寫(xiě)入需要獲得緩沖區(qū)的大小、待寫(xiě)入數(shù)據(jù)的大小,同時(shí)需要獲取寫(xiě)入語(yǔ)句的控制信息,用于判斷程序執(zhí)行流是否會(huì)到達(dá)寫(xiě)入語(yǔ)句。在FDG 生成過(guò)程中,內(nèi)存寫(xiě)入函數(shù)符合敏感函數(shù)調(diào)用類(lèi)型的漏洞語(yǔ)法特征,因此該函數(shù)被視為候選漏洞語(yǔ)句。內(nèi)存寫(xiě)入函數(shù)的控制依賴(lài)鏈會(huì)被提取到FDG 表示中,并且它的數(shù)據(jù)依賴(lài)鏈也會(huì)被納入FDG,這些變量可能是緩沖區(qū)指針,也可能是寫(xiě)入數(shù)據(jù)的大小。將上述關(guān)鍵信息生成的FDG 輸入FDN 中進(jìn)行推理與學(xué)習(xí),F(xiàn)DN 就能對(duì)是否存在越界寫(xiě)入漏洞進(jìn)行準(zhǔn)確判斷。從表3~表6 可知,針對(duì)CWE400漏洞類(lèi)型,Reveal 方法的檢測(cè)準(zhǔn)確率為97.99%,精確率為93.35%,召回率為99.98%,F(xiàn)1分?jǐn)?shù)為96.55%;FBLD 的檢測(cè)準(zhǔn)確率為97.93%,精確率為93.33%,召回率為99.76%,F(xiàn)1 分?jǐn)?shù)為96.44%。FBLD 的4個(gè)指標(biāo)略低于Reveal,均排名第二。其原因是CWE400 為資源耗盡型漏洞,對(duì)此類(lèi)漏洞的檢查與判斷需要獲取資源數(shù)量、分配策略、回收策略等多種信息。FBLD 以控制依賴(lài)和數(shù)據(jù)依賴(lài)為主的信息獲取方式未完整地獲取這類(lèi)信息,從而導(dǎo)致部分樣本的誤報(bào)。而Reveal 使用CPG 表示源代碼,CPG 包含源代碼的AST、CFG、DFG 和DDG 等多種表示圖,盡管存在一些冗余信息,但較完整地包含了大部分語(yǔ)義信息。FBLD 為了顯式維護(hù)候選漏洞語(yǔ)句的控制依賴(lài)鏈和數(shù)據(jù)依賴(lài)鏈,損失了部分信息,這使Reveal 在CWE400 上略?xún)?yōu)于FBLD。

    從表4 可知,針對(duì)CWE78漏洞類(lèi)型,VulDeePecker的檢測(cè)精確率最高,為95.96%,F(xiàn)BLD 的精確率為94.31%,略低于VulDeePecker,排名第二。分析其原因如下,VulDeePecker 僅提取敏感API 一種漏洞語(yǔ)法特征,并根據(jù)敏感API 的數(shù)據(jù)依賴(lài)獲取與其相關(guān)的語(yǔ)義切片。CWE78 是命令注入型漏洞,這種漏洞與API調(diào)用緊密相關(guān)(如execve 等函數(shù)調(diào)用)。FBLD 提取包含敏感API 在內(nèi)的多種特征,多種特征的結(jié)合可能會(huì)使神經(jīng)網(wǎng)絡(luò)在部分情況下產(chǎn)生誤判,導(dǎo)致FBLD 對(duì)此類(lèi)漏洞的檢測(cè)精確率略低于VulDeePecker。

    不同于SARD 的合成代碼,Devign 和Reveal數(shù)據(jù)集來(lái)源于真實(shí)的開(kāi)源軟件項(xiàng)目,在對(duì)比檢測(cè)實(shí)驗(yàn)中,7 種方法的評(píng)價(jià)指標(biāo)均低于在SARD 上的評(píng)價(jià)指標(biāo)。由于Reveal 數(shù)據(jù)集存在數(shù)據(jù)不平衡問(wèn)題,導(dǎo)致7 種方法的準(zhǔn)確率相對(duì)于其他指標(biāo)偏高,但這種不平衡反映了源代碼漏洞檢測(cè)的真實(shí)環(huán)境。因?yàn)樵诖蠖鄶?shù)情況下,存在漏洞的樣本數(shù)量遠(yuǎn)小于良性樣本的數(shù)量。在Devign 和Reveal 數(shù)據(jù)集上,F(xiàn)BLD仍然表現(xiàn)良好,其重點(diǎn)指標(biāo)優(yōu)于其他方法。其中,F(xiàn)BLD 對(duì)漏洞樣本檢測(cè)的召回率最高提升22.32%,表明FBLD 可以發(fā)現(xiàn)更多存在漏洞的樣本;FBLD的F1 分?jǐn)?shù)最高提升16.69%,表明FBLD 提高了源代碼漏洞檢測(cè)的綜合性能。分析其原因如下。

    1) FBLD 提取源代碼函數(shù)片的全部候選漏洞語(yǔ)句后,對(duì)每個(gè)候選漏洞語(yǔ)句生成對(duì)應(yīng)的FDG,因而每個(gè)函數(shù)片對(duì)應(yīng)若干個(gè)FDG,當(dāng)函數(shù)片對(duì)應(yīng)的某個(gè)FDG 被源代碼漏洞檢測(cè)網(wǎng)絡(luò)確認(rèn)存在漏洞,則判定函數(shù)片存在漏洞。FBLD 依據(jù)4 種漏洞語(yǔ)法特征,可以覆蓋絕大部分CWE 漏洞類(lèi)型,與僅使用一種漏洞語(yǔ)法特征的μVulDeePecker 和VulDeePecker 相比,F(xiàn)BLD 方法在Devign 數(shù)據(jù)集上召回率分別提高163.12%和44.03%。此外,F(xiàn)BLD 采用的FDN 可以充分學(xué)習(xí)并感知候選漏洞語(yǔ)句的控制依賴(lài)信息和數(shù)據(jù)依賴(lài)信息,因而檢測(cè)關(guān)鍵指標(biāo)優(yōu)于其他7 種方法。

    2) Reveal 雖然使用CPG 表示源代碼,但是未重點(diǎn)分析與候選漏洞語(yǔ)句密切相關(guān)的數(shù)據(jù)流和控制流,存在較多冗余信息,因此性能低于FBLD。Devign 使用AST、CFG、DFG 以及自然代碼序列表示源代碼,在一定程度上可以反映源代碼特征,但是未在代碼表示圖中顯式保存與漏洞信息直接相關(guān)的數(shù)據(jù)和控制信息,從而使神經(jīng)網(wǎng)絡(luò)較難學(xué)習(xí)代碼表示圖的信息。

    3) VulDeeLocator 和SySeVR 使用4 種漏洞語(yǔ)法特征對(duì)源代碼進(jìn)行切片,最大程度獲取了源代碼的原始信息,因此在基于標(biāo)記序列的5 種方法(Russell方法、VulDeePecker、SySeVR、μVulDeePecker 和VulDeeLocator)中表現(xiàn)最佳,但是這2 種方法未顯式維護(hù)候選漏洞語(yǔ)句的數(shù)據(jù)依賴(lài)和數(shù)據(jù)依賴(lài)關(guān)系,增加了神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)控制依賴(lài)和數(shù)據(jù)依賴(lài)信息的難度,因此漏洞檢測(cè)性能整體略低于 FBLD、Devign、Reveal 等基于圖結(jié)構(gòu)的漏洞檢測(cè)方法。

    4) 與VulDeeLocator 和SySeVR 相比,μVulDee-Pecker 和VulDeePecker 因僅使用敏感API 一種漏洞語(yǔ)法特征進(jìn)行函數(shù)切片,忽略了大量數(shù)組、指針和表達(dá)式相關(guān)的漏洞信息,因此性能低于SySeVR 和VulDeePecker。此外,μVulDeePecker 使用由控制依賴(lài)和數(shù)據(jù)依賴(lài)引起的語(yǔ)義信息,而VulDeePecker 僅使用由數(shù)據(jù)依賴(lài)引起的語(yǔ)義信息,從而其漏洞檢測(cè)性能低于μVulDeePecker。與VulDeePecker 使用雙向長(zhǎng)短期記憶神經(jīng)網(wǎng)絡(luò)處理語(yǔ)句的長(zhǎng)距離上下文關(guān)系相比,Russell 方法使用RNN 構(gòu)建漏洞檢測(cè)網(wǎng)絡(luò),RNN 處理長(zhǎng)距離信息關(guān)聯(lián)時(shí)依賴(lài)極易出現(xiàn)梯度消失現(xiàn)象,在一定程度上影響了漏洞檢測(cè)性能。

    上述實(shí)驗(yàn)結(jié)果表明,與其他7 種方法相比,本文提出的FBLD 方法在源代碼漏洞檢測(cè)方面的綜合性能更好。

    5.5 算法時(shí)間復(fù)雜性驗(yàn)證

    本文在Reveal 數(shù)據(jù)集上驗(yàn)證FDG 生成算法的時(shí)間復(fù)雜性,Reveal 數(shù)據(jù)集中全部函數(shù)片生成的FDG 共20 109 個(gè),表7 記錄了Reveal 數(shù)據(jù)集生成的FDG 的節(jié)點(diǎn)數(shù)量、邊數(shù)量和消耗時(shí)間三類(lèi)信息。數(shù)據(jù)表明,生成FDG 的最大時(shí)間消耗為78.96 s,消耗時(shí)間的中位數(shù)為2.53 s,證明FDG 生成算法的時(shí)間復(fù)雜度可控,具備實(shí)際可行性。

    表7 FDG 生成算法時(shí)間復(fù)雜性驗(yàn)證結(jié)果

    本文在Reveal 數(shù)據(jù)集上通過(guò)訓(xùn)練時(shí)間和檢測(cè)時(shí)間對(duì)比了不同方法的漏洞檢測(cè)模型時(shí)間復(fù)雜度,對(duì)比結(jié)果如表8 所示,表8 中各方法的訓(xùn)練輪數(shù)均為100。實(shí)驗(yàn)結(jié)果表明,本文所提方法的訓(xùn)練時(shí)間和平均檢測(cè)時(shí)間分別為87 min 和4.89 s,分析其原因?yàn)镕DN 包含2 個(gè)HGT 層和多個(gè)線(xiàn)性層,圖神經(jīng)網(wǎng)絡(luò)的訓(xùn)練與計(jì)算消耗了較多時(shí)間。盡管本文的漏洞檢測(cè)模型訓(xùn)練時(shí)間較長(zhǎng),但對(duì)于新樣本的平均檢測(cè)時(shí)間可控,且訓(xùn)練過(guò)程僅需一次,故本文方法具備一定的實(shí)際意義。

    表8 漏洞檢測(cè)模型時(shí)間消耗對(duì)比

    6 結(jié)束語(yǔ)

    針對(duì)現(xiàn)有源代碼漏洞檢測(cè)方法無(wú)法全面獲取漏洞語(yǔ)句的相關(guān)信息,導(dǎo)致漏洞檢測(cè)誤報(bào)率高等問(wèn)題,本文提出一種基于特征依賴(lài)圖的源代碼漏洞檢測(cè)方法。采用一種新穎的源代碼表示結(jié)構(gòu)FDG 分析候選漏洞語(yǔ)句的控制依賴(lài)鏈和數(shù)據(jù)依賴(lài)鏈,并在FDG 中顯式維護(hù)候選漏洞語(yǔ)句的控制依賴(lài)鏈和數(shù)據(jù)依賴(lài)鏈,更容易捕獲候選漏洞語(yǔ)句的語(yǔ)義信息。本文提出的面向FDG 的漏洞檢測(cè)網(wǎng)絡(luò)FDN,可以有效推理并感知FDG 包含的語(yǔ)義信息,同時(shí)可以動(dòng)態(tài)調(diào)整漏洞語(yǔ)句相關(guān)的邊和節(jié)點(diǎn)的重要性。在3 個(gè)數(shù)據(jù)集上的實(shí)驗(yàn)結(jié)果表明,本文方法的源代碼漏洞檢測(cè)性能優(yōu)于其他現(xiàn)有方法。

    在未來(lái)研究中,將嘗試設(shè)計(jì)漏洞語(yǔ)法特征更新機(jī)制以檢測(cè)未知漏洞,同時(shí),嘗試更高效的代碼表示結(jié)構(gòu)和漏洞檢測(cè)神經(jīng)網(wǎng)絡(luò),進(jìn)一步提高準(zhǔn)確率并降低誤報(bào)率,提升源代碼漏洞檢測(cè)方法的性能。

    猜你喜歡
    源代碼漏洞語(yǔ)句
    人工智能下復(fù)雜軟件源代碼缺陷精準(zhǔn)校正
    漏洞
    基于TXL的源代碼插樁技術(shù)研究
    重點(diǎn):語(yǔ)句銜接
    軟件源代碼非公知性司法鑒定方法探析
    精彩語(yǔ)句
    三明:“兩票制”堵住加價(jià)漏洞
    漏洞在哪兒
    揭秘龍湖產(chǎn)品“源代碼”
    高鐵急救應(yīng)補(bǔ)齊三漏洞
    石嘴山市| 图们市| 临夏县| 当涂县| 涪陵区| 丰城市| 临沂市| 当阳市| 阆中市| 喀什市| 行唐县| 高邮市| 宿松县| 特克斯县| 淳安县| 灵璧县| 竹山县| 措美县| 横山县| 定安县| 石台县| 江阴市| 兰西县| 龙江县| 浦城县| 虹口区| 收藏| 岳池县| 伊春市| 乌鲁木齐县| 河南省| 绥芬河市| 桃园县| 丰都县| 肇源县| 连平县| 桐乡市| 沙雅县| 出国| 广西| 洪泽县|