• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于代碼序列與圖結(jié)構(gòu)的源代碼漏洞檢測(cè)方案

      2024-01-04 06:26:28王守梁
      關(guān)鍵詞:源代碼集上漏洞

      王守梁

      (中北大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,山西 太原 030051)

      0 引 言

      軟件源代碼漏洞檢測(cè)一直是軟件安全領(lǐng)域的一個(gè)重要挑戰(zhàn)[1-3]。隨著大數(shù)據(jù)時(shí)代的來(lái)臨,軟件代碼數(shù)量以量級(jí)攀升,軟件更加復(fù)雜與多樣,任何微小的漏洞都可能導(dǎo)致整個(gè)系統(tǒng)的崩潰。據(jù)統(tǒng)計(jì),2022年,缺陷名錄網(wǎng)站(NVD)全年的漏洞總數(shù)為6 515個(gè),預(yù)期年增長(zhǎng)率提升了170%; 公共漏洞披露平臺(tái)(CVE)全年的漏洞總數(shù)為10 703個(gè),預(yù)期年增長(zhǎng)率為70%。政府單位、銀行以及科技企業(yè)已成為漏洞攻擊的重點(diǎn)[4],為了維護(hù)網(wǎng)絡(luò)安全,需對(duì)軟件源代碼漏洞檢測(cè)相關(guān)工作提出更高的要求。

      傳統(tǒng)的漏洞檢測(cè)主要使用3種技術(shù):靜態(tài)分析技術(shù)[5]、動(dòng)態(tài)分析技術(shù)[6]及機(jī)器學(xué)習(xí)技術(shù)[7]。靜態(tài)分析指在不執(zhí)行程序的情況下,通過(guò)掃描源代碼,分析代碼詞法、語(yǔ)法、數(shù)據(jù)流及控制流等信息來(lái)篩選漏洞,耗時(shí)耗力。動(dòng)態(tài)分析指在執(zhí)行程序的情況下,通過(guò)聚焦執(zhí)行路徑、程序狀態(tài)等信息來(lái)篩選漏洞,可擴(kuò)展性差。機(jī)器學(xué)習(xí)技術(shù)借助預(yù)設(shè)特征的機(jī)器學(xué)習(xí)算法來(lái)檢測(cè)漏洞,在復(fù)雜數(shù)據(jù)集上效果較差。

      近年來(lái),該領(lǐng)域研究方向有所轉(zhuǎn)變,由被動(dòng)檢測(cè)轉(zhuǎn)向漏洞代碼的主動(dòng)預(yù)測(cè)。同時(shí),深度學(xué)習(xí)與漏洞檢測(cè)的結(jié)合成為研究熱點(diǎn)?,F(xiàn)有的基于深度學(xué)習(xí)的漏洞檢測(cè)成果表明,深度學(xué)習(xí)較傳統(tǒng)技術(shù)檢測(cè)具有更優(yōu)越的檢測(cè)性能。現(xiàn)有的檢測(cè)方案亦存在一定的局限性。一類研究[8-11]將源代碼看作特殊的自然語(yǔ)言,使用自然語(yǔ)言處理領(lǐng)域的成熟模型解決漏洞檢測(cè)任務(wù),未考慮代碼的結(jié)構(gòu)信息; 另一類研究[12-13]抽取代碼對(duì)應(yīng)的圖表示并借助圖神經(jīng)網(wǎng)絡(luò)解決漏洞檢測(cè)任務(wù),現(xiàn)有的相關(guān)方案一方面未考慮異類邊的處理,另一方面忽略了節(jié)點(diǎn)內(nèi)語(yǔ)句的局部語(yǔ)義信息。此外,現(xiàn)有研究多使用以word2vec[14]、glove[15]、fasttext[16]及doc2vec[17]為代表的傳統(tǒng)詞向量模型為標(biāo)記生成固定的向量表示,未考慮代碼上下文差異。

      為解決以上問(wèn)題,本文提出了一種函數(shù)級(jí)源代碼漏洞檢測(cè)方案,綜合考慮源代碼基于圖的中間表示與基于序列的中間表示來(lái)輔助漏洞檢測(cè)。

      本文方案的實(shí)現(xiàn)步驟過(guò)程如下:1) 對(duì)源代碼進(jìn)行預(yù)處理,并抽取其代碼屬性圖(Code Property Graph,CPG)[18]。受文獻(xiàn)[19-20]中方法的啟發(fā),通過(guò)增加自定義類型的邊對(duì)CPG圖進(jìn)行擴(kuò)展,得到CPG’,其中,代碼語(yǔ)句被解析為圖節(jié)點(diǎn),語(yǔ)句之間的關(guān)系被解析為圖邊。對(duì)于節(jié)點(diǎn),分別對(duì)其類型與語(yǔ)句進(jìn)行編碼; 對(duì)于邊,分別對(duì)其類型與方向進(jìn)行編碼。同時(shí),采用關(guān)系圖卷積神經(jīng)網(wǎng)絡(luò)(RGCN)聚合信息來(lái)生成最終圖表示。2) 切分預(yù)處理后的源代碼得到對(duì)應(yīng)的標(biāo)記序列,并使用基于程序語(yǔ)言的預(yù)訓(xùn)練模型CodBert[21]編碼器,生成源代碼對(duì)應(yīng)的詞向量矩陣。3) 集成以上兩種表示并采用由全連接神經(jīng)網(wǎng)絡(luò)(FCNN)與sigmoid層組成的分類器實(shí)現(xiàn)漏洞檢測(cè)。

      1 相關(guān)工作

      在源代碼漏洞檢測(cè)領(lǐng)域,現(xiàn)有的綜述已從不同的角度對(duì)漏洞檢測(cè)領(lǐng)域的研究進(jìn)行了全面的總結(jié)[22-26]。本節(jié)將聚焦本文研究工作的三個(gè)關(guān)鍵方面:源代碼中間表示、詞向量技術(shù)與神經(jīng)網(wǎng)絡(luò)模型,并從以上三個(gè)角度對(duì)已有的漏洞檢測(cè)工作分別進(jìn)行總結(jié)回顧。

      1) 源代碼中間表示形式主要分為兩類:一是序列形式,即將源代碼轉(zhuǎn)換成線性標(biāo)記序列。Wang[27]、Russell[28]及Li[29]等在源代碼序列基礎(chǔ)上借助不同的神經(jīng)網(wǎng)絡(luò)模型實(shí)現(xiàn)了漏洞檢測(cè)。二是圖形式,即將源代碼轉(zhuǎn)換成結(jié)構(gòu)圖。Chakraborty[30]、Li[31]及Dong[32]等將源代碼轉(zhuǎn)換成CPG圖,Li等[33]將源代碼轉(zhuǎn)換成PDG圖,Fan等[19]將源代碼轉(zhuǎn)換成AST、CFG、DFG及NCS四種圖。成果匯總見(jiàn)表1。本文按照?qǐng)D種類與所抽取的信息類型,對(duì)現(xiàn)有研究進(jìn)行梳理,成果如表2 所示。其中,CPG圖因其含有更多類型的邊關(guān)系,能反映更豐富的程序結(jié)構(gòu)信息而被多數(shù)研究采用。

      表1 漏洞檢測(cè)源代碼中間表示研究匯總

      表2 基于圖表示的漏洞檢測(cè)研究匯總

      2) 詞向量技術(shù)用于生成神經(jīng)網(wǎng)絡(luò)可處理的實(shí)值向量,其選取決定著漏洞代碼的上下文信息的提取,進(jìn)而影響模型的檢測(cè)性能。Pradel和Sen[37]使用Word2Vec生成代碼向量,用于訓(xùn)練深度學(xué)習(xí)模型,以檢測(cè)JavaScript代碼中的漏洞。Henkel等[38]應(yīng)用GloVe從C程序的抽象符號(hào)軌跡中學(xué)習(xí)向量表示。Fang等[39]應(yīng)用FastText進(jìn)行基于集成機(jī)器學(xué)習(xí)模型的漏洞預(yù)測(cè)。Kanade等[40]提出了CuBERT,它通過(guò)在軟件源代碼上訓(xùn)練BERT模型來(lái)生成上下文嵌入。Karampatsis和Sutton[41]提出了一個(gè)名為SCELMo的模型來(lái)生成上下文代碼向量。詳細(xì)成果匯總見(jiàn)表3。

      表3 詞向量轉(zhuǎn)化技術(shù)研究匯總

      3) 神經(jīng)網(wǎng)絡(luò)模型主要分為兩類,分別對(duì)應(yīng)兩種中間表示形式。包括卷積神經(jīng)網(wǎng)絡(luò)(CNN)、多層感知器(MLP)、深度置信網(wǎng)絡(luò)(DBN)、長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)及門控單元網(wǎng)絡(luò)(GRU)等在內(nèi)的多種神經(jīng)網(wǎng)絡(luò)模型被應(yīng)用在基于序列的漏洞檢測(cè)中并取得了良好的檢測(cè)效果; 包括門控圖神經(jīng)網(wǎng)絡(luò)(GGNN)、圖卷積神經(jīng)網(wǎng)絡(luò)(GCN)等在內(nèi)的多種圖神經(jīng)網(wǎng)絡(luò)模型被應(yīng)用在基于圖的漏洞檢測(cè)中,用于生成圖向量。成果匯總見(jiàn)表4。

      表4 漏洞檢測(cè)神經(jīng)網(wǎng)絡(luò)模型匯總

      2 模型設(shè)計(jì)

      2.1 問(wèn)題定義與整體架構(gòu)

      2.1.1 問(wèn)題定義

      2.1.2 整體架構(gòu)

      如圖1 所示,該漏洞檢測(cè)方案將函數(shù)級(jí)源程序樣本作為輸入,包括以下兩大模塊:特征抽取與特征學(xué)習(xí)。特征抽取階段,使用兩種方式對(duì)源代碼進(jìn)行處理:① 抽取函數(shù)源代碼對(duì)應(yīng)的多類型邊結(jié)構(gòu)圖。② 抽取函數(shù)源代碼對(duì)應(yīng)標(biāo)記序列。特征學(xué)習(xí)階段,分別生成以上兩種形式的中間表示對(duì)應(yīng)的實(shí)值向量,并將二者集成拼接。最后,使用全連接網(wǎng)絡(luò)輸出漏洞檢測(cè)結(jié)果。詳細(xì)原理將在后續(xù)章節(jié)中進(jìn)行闡述。

      圖1 本研究漏洞檢測(cè)方案的整體架構(gòu)

      2.2 基于圖的特征學(xué)習(xí)

      2.2.1 圖的生成

      為學(xué)習(xí)源代碼中的結(jié)構(gòu)信息并提取漏洞特征,需要將其轉(zhuǎn)換成合適的結(jié)構(gòu)圖。結(jié)構(gòu)圖的質(zhì)量在很大程度上決定了從訓(xùn)練數(shù)據(jù)中學(xué)習(xí)到的特征數(shù)量,進(jìn)而影響模型的漏洞檢測(cè)性能。代碼屬性圖(簡(jiǎn)稱CPG) 提供了控制流圖(簡(jiǎn)稱CFG)和數(shù)據(jù)流圖(簡(jiǎn)稱DFG)中的元素以及抽象語(yǔ)法樹(shù)(簡(jiǎn)稱AST)和程序依賴圖(簡(jiǎn)稱PDG)的代碼組合,是現(xiàn)存最綜合全面的程序圖表示,本文選擇其作為源代碼的初始結(jié)構(gòu)圖。

      源代碼函數(shù)對(duì)應(yīng)的CPG按照以下流程生成:① 解析源代碼函數(shù)生成AST。② 應(yīng)用控制流分析生成CFG。③ 應(yīng)用依賴性分析生成PDG。④ 在AST中添加CFG與PDG邊生成CPG。以上過(guò)程使用工具Joern實(shí)現(xiàn)。

      CPG在富含多種結(jié)構(gòu)信息的同時(shí),缺失了語(yǔ)句中的順序信息,為解決此問(wèn)題,本文在初始結(jié)構(gòu)圖CPG基礎(chǔ)上增加自然代碼序列邊(NCS)[50]并對(duì)其進(jìn)行了擴(kuò)展,通過(guò)在AST中的相鄰葉節(jié)點(diǎn)之間從左到右添加有向邊,增加了代碼編輯的時(shí)序信息,輔助漏洞檢測(cè)。本文將最終得到的結(jié)構(gòu)圖記為CPG’=〈V,E〉,其中,V={v|v∈ASTnode}表示圖中的節(jié)點(diǎn)集合,ASTnode表示函數(shù)的AST中的節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)包含節(jié)點(diǎn)類型與節(jié)點(diǎn)代碼兩種元素;E={e|e∈CFGedge或e∈DDGedge或e∈CDGedge或e∈ASTedge或e∈NCSedge}表示圖中的邊集合,這些邊分別反映了節(jié)點(diǎn)之間的控制流、數(shù)據(jù)依賴、控制依賴、語(yǔ)法結(jié)構(gòu)與時(shí)序信息。圖2對(duì)應(yīng)一個(gè)緩沖區(qū)溢出漏洞的簡(jiǎn)單樣例,其main函數(shù)對(duì)應(yīng)的CPG’如圖3 所示。

      圖2 緩沖區(qū)溢出漏洞代碼樣例

      圖3 CPG’

      后續(xù)任務(wù)中基于CPG’生成神經(jīng)網(wǎng)絡(luò)能處理的實(shí)值向量至關(guān)重要,本文將綜合考慮結(jié)構(gòu)圖中的節(jié)點(diǎn)及邊。

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

      節(jié)點(diǎn)嵌入模塊分別對(duì)節(jié)點(diǎn)類型與節(jié)點(diǎn)代碼采用不同嵌入方法來(lái)生成初始向量:① 對(duì)于節(jié)點(diǎn)類型,采用獨(dú)熱編碼(one-hot)生成對(duì)應(yīng)向量xi。② 對(duì)于節(jié)點(diǎn)代碼,首先,完成標(biāo)準(zhǔn)化處理,將源代碼中用戶自定義的變量名稱與函數(shù)名稱采用統(tǒng)一標(biāo)準(zhǔn)進(jìn)行重命名,用VAR與序號(hào)的組合替代自定義變量名,用FUN與序號(hào)的組合替代自定義函數(shù)名,如“VAR1”和“FUN1”,減少語(yǔ)料庫(kù)規(guī)模與噪聲干擾,提升向量生成的質(zhì)量; 其次,使用基于編程語(yǔ)言的預(yù)訓(xùn)練模型CodeBert訓(xùn)練的單詞嵌入權(quán)重初始化嵌入層權(quán)重,CodeBert模型使用的字節(jié)對(duì)編碼(BPE)標(biāo)記器[51]能在很大程度上緩解Out-Of-Vocabulary(OOV)問(wèn)題; 最后,連接雙向長(zhǎng)短期記憶網(wǎng)絡(luò)(Bi-LSTM)聚合局部語(yǔ)義信息,獲得最終向量表示yi。最終,連接xi,yi得到節(jié)點(diǎn)vi對(duì)應(yīng)的向量表示gi。

      上述過(guò)程的形式化表述如下:

      對(duì)于節(jié)點(diǎn)類型v[type,i],有

      xi=one-hot(v[type,i])。

      (1)

      對(duì)于源代碼S={s1,s2,s3,…,sn},其中,si對(duì)應(yīng)節(jié)點(diǎn)vi中的代碼。首先,進(jìn)行標(biāo)準(zhǔn)化處理

      S′=normalization(S)。

      (2)

      其次,通過(guò)CodeBert預(yù)訓(xùn)練的BPE標(biāo)記器進(jìn)行標(biāo)記并使用CodeBert嵌入層權(quán)重來(lái)初始化自嵌入權(quán)重,以獲得每個(gè)標(biāo)記的向量表示eij∈Ei={ei1,ei2,ei3,…,ein}。

      (3)

      Ei=Codebert(tokensi)。

      (4)

      最后,連接Bi-LSTM獲取與節(jié)點(diǎn)vi對(duì)應(yīng)的語(yǔ)句si的向量表示yi。

      (5)

      (6)

      最終,連接xi,yi得到節(jié)點(diǎn)vi的最終向量表示

      gi=CONCAT(xi,yi)。

      (7)

      2.2.3 邊嵌入

      邊嵌入模塊分別對(duì)邊方向與邊類型采用不同嵌入方法來(lái)生成初始向量:① 對(duì)于邊方向,采用深度優(yōu)先遍歷(DFS)將節(jié)點(diǎn)排序并從0開(kāi)始編號(hào),以節(jié)點(diǎn)編號(hào)數(shù)對(duì)的形式編碼邊方向; ② 對(duì)于邊類型,采用標(biāo)簽編碼(label encoding)將有限邊類型進(jìn)行編碼。

      上述過(guò)程的形式化表述如下:函數(shù)源代碼對(duì)應(yīng)的結(jié)構(gòu)圖記為CPG’=〈V,E〉,其中,V代表節(jié)點(diǎn)集合,E代表邊集合。

      對(duì)于邊方向,有

      IE={〈vi.order,vj.order〉|e=

      〈vi,vj〉,e∈E}。

      (8)

      對(duì)于邊類型,有

      TE={te|e∈E},

      (9)

      (10)

      圖4 為一個(gè)函數(shù)源代碼對(duì)應(yīng)的邊嵌入過(guò)程的示例。

      圖4 邊嵌入策略實(shí)例說(shuō)明

      圖4 中,節(jié)點(diǎn)按照深度優(yōu)先遍歷算法進(jìn)行編號(hào),5條有向邊分別對(duì)應(yīng)5種不同的邊類型,還給出了邊方向與邊類型對(duì)應(yīng)的向量形式。

      2.2.4 圖神經(jīng)網(wǎng)絡(luò)

      上述環(huán)節(jié)孤立考慮每個(gè)節(jié)點(diǎn),僅根據(jù)單個(gè)節(jié)點(diǎn)包含的元素進(jìn)行向量初始化,缺乏相鄰節(jié)點(diǎn)的狀態(tài)信息,無(wú)法較好地反映源代碼的結(jié)構(gòu)信息。本研究采用關(guān)系圖卷積網(wǎng)絡(luò)(RGCN)完成鄰域聚合,進(jìn)而更新節(jié)點(diǎn)狀態(tài)。

      圖卷積網(wǎng)絡(luò)(GCN)是CNN在圖結(jié)構(gòu)上的擴(kuò)展,是在給定圖上應(yīng)用圖卷積運(yùn)算后,通過(guò)聚合其相鄰節(jié)點(diǎn)的所有特征來(lái)更新節(jié)點(diǎn)。與連續(xù)計(jì)算節(jié)點(diǎn)狀態(tài)的遞歸圖神經(jīng)網(wǎng)絡(luò)(如GGNN)相比,GCN是每層更新一次節(jié)點(diǎn)向量,因此效率更高,可擴(kuò)展性更強(qiáng)。RGCN是在GCN的基礎(chǔ)上進(jìn)行了增量改進(jìn),其通過(guò)在每種關(guān)系類型下用相鄰節(jié)點(diǎn)更新節(jié)點(diǎn)來(lái)區(qū)別對(duì)待不同類型的邊,更適合處理本文所抽取的多類型邊異構(gòu)圖CPG’。如圖5 所示,在每個(gè)RGCN層中,更新單個(gè)節(jié)點(diǎn)需要按邊類型積累其所有相鄰節(jié)點(diǎn)的信息,這些信息隨后與該節(jié)點(diǎn)本身的特征相結(jié)合,通過(guò)激活函數(shù)(本文采用ReLU)傳遞,得到最終表示。

      圖5 節(jié)點(diǎn)更新過(guò)程

      上述過(guò)程的形式化表述如下:

      函數(shù)源代碼對(duì)應(yīng)的結(jié)構(gòu)圖記為CPG’=〈V,E〉,其中,V代表節(jié)點(diǎn)集合,E代表邊集合。單個(gè)節(jié)點(diǎn)向量的更新公式為

      (11)

      2.2.5 圖嵌入

      圖嵌入模塊為基于圖的特征學(xué)習(xí)的最后一步,目標(biāo)是得到最終的圖向量表示。本文通過(guò)聚合所有更新后的節(jié)點(diǎn)向量生成代表整個(gè)CPG’的單個(gè)向量,即

      (12)

      2.3 基于序列的特征學(xué)習(xí)

      基于序列的特征學(xué)習(xí)是本方案理解源代碼全局語(yǔ)義信息的關(guān)鍵過(guò)程?,F(xiàn)有研究普遍采用以Word2vec,GloVe及FastText為代表的詞向量模型生成源代碼對(duì)應(yīng)的實(shí)值向量,這些模型無(wú)法基于不同的代碼上下文為相同標(biāo)記生成不同向量,即僅為相同標(biāo)記生成唯一向量,不考慮標(biāo)記對(duì)應(yīng)變量值的變化,忽略了上下文信息在漏洞檢測(cè)工作中的關(guān)鍵作用。

      本研究采用基于代碼語(yǔ)言的預(yù)訓(xùn)練模型CodeBert來(lái)生成源代碼的特征向量,充分考慮了上下文信息。相較傳統(tǒng)詞向量模型,CodeBert的模型結(jié)構(gòu)要更復(fù)雜,其結(jié)構(gòu)繼承了BERT的架構(gòu),基于一個(gè)12層雙向transformer,每層包含12個(gè)自注意頭,每個(gè)自注意頭的大小設(shè)為64,隱藏維度設(shè)為768,transformer的多頭注意力機(jī)制能夠集中數(shù)據(jù)流的多個(gè)關(guān)鍵變量,有助于分析和跟蹤潛在的漏洞代碼數(shù)據(jù),幫助學(xué)習(xí)需長(zhǎng)期依賴性分析的漏洞代碼模式。此外,其內(nèi)置字節(jié)對(duì)編碼(BPE)標(biāo)記器在很大程度上緩解了OOV問(wèn)題,預(yù)訓(xùn)練技術(shù)也克服了數(shù)據(jù)集中漏洞樣本過(guò)少或漏洞樣本與非漏洞樣本的不平衡所帶來(lái)的過(guò)擬合問(wèn)題。最后,對(duì)于每一個(gè)函數(shù)級(jí)源代碼樣本,CodeBert編碼器生成對(duì)應(yīng)的向量矩陣,并封裝其語(yǔ)義含義。

      上述過(guò)程的形式化表述如下:fi代表一個(gè)函數(shù)級(jí)源代碼樣本輸入,其向量矩陣為

      Pi=CodeBert(fi)。

      (13)

      2.4 特征融合

      基于以上流程,分別獲得了所有函數(shù)級(jí)源代碼樣本fi的基于結(jié)構(gòu)圖生成的向量表示G與基于序列生成的向量表示Pi。本研究采用連接操作組合二者,進(jìn)而集成兩種特征,生成所有源代碼函數(shù)對(duì)應(yīng)的最終向量表示Hi,其公式為

      Hi=CONCAT(G,Pi)。

      (14)

      2.5 分類器

      鑒于全連接神經(jīng)網(wǎng)絡(luò)(FCNN)的卓越性能和在頂級(jí)分類器中的主導(dǎo)地位,本文使用全連接網(wǎng)絡(luò)作為漏洞檢測(cè)分類器,其由輸入層、隱藏層與輸出層三部分組成。

      上述特征融合模塊的輸出被作為輸入層,最終,輸出層將利用隱藏層特征進(jìn)行漏洞預(yù)測(cè)。

      (15)

      (16)

      式中:σ代表隱層激活函數(shù);W1,W2,b1與b2代表可學(xué)習(xí)的參數(shù)。

      3 實(shí)驗(yàn)設(shè)計(jì)

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

      本文基于7個(gè)不同的c/c++源代碼數(shù)據(jù)集開(kāi)展實(shí)驗(yàn)。其中,4個(gè)為簡(jiǎn)單數(shù)據(jù)集,它們分別為CWE-362,CWE-476,CWE-754與CWE-758,其從代碼結(jié)構(gòu)和功能相對(duì)簡(jiǎn)單的軟件中收集,包含可能更容易識(shí)別的漏洞模式; 剩余3個(gè)為復(fù)雜數(shù)據(jù)集,分別為Big-Vul[52],Reveal[30]與FFMPeg+Qemu[50],而Fan等[52]數(shù)據(jù)集涵蓋了2002年至2019年的CWE。在函數(shù)粒度上,數(shù)據(jù)集包含超過(guò)10 000個(gè)漏洞函數(shù)。Reveal[30]數(shù)據(jù)集包含超過(guò)18 000個(gè)函數(shù),其中9.16%是漏洞函數(shù)。FFMPeg+Qemu[50]數(shù)據(jù)集包含超過(guò)22 000個(gè)函數(shù),其中45.0%的為漏洞函數(shù)。表5 展示了數(shù)據(jù)集的相關(guān)細(xì)節(jié)。

      表5 7個(gè)數(shù)據(jù)集

      3.2 研究問(wèn)題

      實(shí)驗(yàn)結(jié)果將以回答以下研究問(wèn)題的形式呈現(xiàn):

      研究問(wèn)題1:本文提出的漏洞檢測(cè)方案與現(xiàn)有軟件漏洞檢測(cè)工具相比性能如何?

      對(duì)照組1:AVDetect[28],VulDeePecker[29],Codebert[21];

      對(duì)照組2:Devign[50],Reveal[30],IVDetect[33],FUNDED[20];

      對(duì)照組3:DeepVulSeeker[34]。

      以上實(shí)驗(yàn)方案均采用基于深度學(xué)習(xí)的漏洞檢測(cè)技術(shù),其中對(duì)照組1中的模型采用基于序列的方法,對(duì)照組2中的模型采用基于圖的方法,而對(duì)照組3中的模型采用基于圖與序列相結(jié)合的方法。

      研究問(wèn)題2:綜合考慮圖與序列信息是否有助于提升模型的漏洞檢測(cè)性能?

      本研究的漏洞檢測(cè)方案抽取的信息類型包括圖節(jié)點(diǎn)(節(jié)點(diǎn)類型與節(jié)點(diǎn)元素)、圖邊(邊類型與邊方向及序列信息),為驗(yàn)證綜合考慮多類型信息對(duì)漏洞檢測(cè)模型的有效性,采取控制變量的方法,減少對(duì)照組中抽取的信息類型。

      對(duì)照組1:僅抽取圖信息; 對(duì)照組2:僅抽取序列信息。

      研究問(wèn)題3:不同的節(jié)點(diǎn)初始化嵌入方法是否影響方案的漏洞檢測(cè)性能?

      本文漏洞檢測(cè)方案采用預(yù)訓(xùn)練模型CodeBert對(duì)節(jié)點(diǎn)元素進(jìn)行初始化,并通過(guò)再次訓(xùn)練微調(diào)嵌入權(quán)重。通過(guò)設(shè)計(jì)對(duì)照實(shí)驗(yàn)與其他圖節(jié)點(diǎn)向量化方法進(jìn)行比較,具體對(duì)照組設(shè)置如下:

      對(duì)照組1:Word2vec; 對(duì)照組2:Dov2vec。

      研究問(wèn)題4:不同的序列初始化嵌入方法是否影響方案的漏洞檢測(cè)性能?

      本文漏洞檢測(cè)方案采用預(yù)訓(xùn)練模型CodeBert對(duì)序列標(biāo)記進(jìn)行初始化,并通過(guò)再次訓(xùn)練微調(diào)嵌入權(quán)重。通過(guò)設(shè)計(jì)對(duì)照實(shí)驗(yàn)與傳統(tǒng)的詞向量模型進(jìn)行比較,具體對(duì)照組設(shè)置如下:

      對(duì)照組1:Word2vec; 對(duì)照組2:GloVe; 對(duì)照組3:Fasttext。

      3.3 實(shí)驗(yàn)環(huán)境

      本文漏洞檢測(cè)系統(tǒng)開(kāi)發(fā)環(huán)境為L(zhǎng)inux操作系統(tǒng),使用Python語(yǔ)言進(jìn)行開(kāi)發(fā),深度學(xué)習(xí)庫(kù)選擇以Tensorflow-gpu為后端的Keras框架開(kāi)發(fā),其具體內(nèi)置版本信息如表6 所示。

      表6 實(shí)驗(yàn)環(huán)境參數(shù)

      3.4 評(píng)估指標(biāo)

      本文采用4個(gè)指標(biāo)對(duì)模型進(jìn)行評(píng)估,即漏報(bào)率(FNR)、誤報(bào)率(FPR)、準(zhǔn)確率(Accuracy)及F1指數(shù)(F1_score),具體計(jì)算公式分別為

      其中,

      式中:NTP表示將正樣本預(yù)測(cè)為正樣本的數(shù)量;NTN表示將正樣本預(yù)測(cè)為負(fù)樣本的數(shù)量;NFP表示將負(fù)樣本預(yù)測(cè)為正樣本的數(shù)量,即誤報(bào);NFN表示將正樣本預(yù)測(cè)為負(fù)樣本的數(shù)量,即漏報(bào)。因此,漏報(bào)率(FNR)表示漏報(bào)的樣本占正樣本數(shù)量的比例,誤報(bào)率(FPR)表示誤報(bào)的樣本占負(fù)樣本數(shù)量的比例,準(zhǔn)確率(Accuracy)表示預(yù)測(cè)正確的數(shù)據(jù)占總樣本的比例,F1指數(shù)(F1_score)是根據(jù)準(zhǔn)確率(Precision)與召回率(Recall)給出的一種綜合評(píng)價(jià),是二者的調(diào)和平均值。

      具有高準(zhǔn)確率(Accuracy)、高F1指數(shù)(F1_score)和低漏報(bào)率(FNR)、低誤報(bào)率(FPR)的模型被認(rèn)為是高效的。

      4 實(shí)驗(yàn)結(jié)果及分析

      4.1 研究問(wèn)題1的實(shí)驗(yàn)結(jié)果

      表7 與表8 展示了問(wèn)題1所涉及的對(duì)照組1的實(shí)驗(yàn)結(jié)果??梢钥闯?在簡(jiǎn)單數(shù)據(jù)集上,本研究模型在 4個(gè)數(shù)據(jù)集上的平均準(zhǔn)確率與F1值均高于對(duì)照組所有模型; 在真實(shí)世界數(shù)據(jù)集上,實(shí)驗(yàn)組除在FFMPeg+Qemu上的F1值略低于VulDeePecker[29]與codebert[21]以外,其他各項(xiàng)結(jié)果均高于對(duì)照組結(jié)果。

      表7 對(duì)照組1的實(shí)驗(yàn)結(jié)果1

      表8 對(duì)照組1的實(shí)驗(yàn)結(jié)果2

      表9 與表10 展示了問(wèn)題1所涉及的對(duì)照組2的實(shí)驗(yàn)結(jié)果??梢钥闯?在簡(jiǎn)單數(shù)據(jù)集上,本研究模型在4個(gè)數(shù)據(jù)集上的平均準(zhǔn)確率與F1值均高于對(duì)照組所有模型; 在真實(shí)世界數(shù)據(jù)集上,實(shí)驗(yàn)組除在FFMPeg+Qemu數(shù)據(jù)集上的F1值略低于IVDetect[33]與FUNDED[20]以外,其他各項(xiàng)結(jié)果均高于對(duì)照組結(jié)果。

      表9 對(duì)照組2的實(shí)驗(yàn)結(jié)果1

      表10 對(duì)照組2的實(shí)驗(yàn)結(jié)果2

      表11 與表12 展示了問(wèn)題1所涉及的對(duì)照組3 的實(shí)驗(yàn)結(jié)果??梢钥闯?在簡(jiǎn)單數(shù)據(jù)集上,本研究模型在CWE-362與CWE-476上的兩項(xiàng)指標(biāo)均高于對(duì)照組模型,在CWE-754與CWE-758上的兩項(xiàng)指標(biāo)雖然相對(duì)略低,但兩項(xiàng)指標(biāo)均值仍分別達(dá)到0.980 8與0.972 4; 在真實(shí)世界數(shù)據(jù)集上,實(shí)驗(yàn)組除在FFMPeg+Qemu上的F1值略低以外,其他各項(xiàng)結(jié)果均高于對(duì)照組結(jié)果。

      表11 對(duì)照組3的實(shí)驗(yàn)結(jié)果1

      表12 對(duì)照組3的實(shí)驗(yàn)結(jié)果2

      綜上所述,可以得出

      結(jié)論1:與現(xiàn)有方案相比,在兩類數(shù)據(jù)集上,本研究的漏洞檢測(cè)方案都有更卓越的性能。

      4.2 研究問(wèn)題2的實(shí)驗(yàn)結(jié)果

      表13 與表14 展示了問(wèn)題2對(duì)應(yīng)的實(shí)驗(yàn)結(jié)果??梢钥闯?對(duì)照組1(即單獨(dú)抽取圖表示)的整體性能比對(duì)照組2(即單獨(dú)抽取序列表示)更好,但實(shí)驗(yàn)組在兩類數(shù)據(jù)集上的準(zhǔn)確率與F1值均有更明顯的提高。以上差距驗(yàn)證了圖結(jié)構(gòu)信息與序列語(yǔ)義信息對(duì)漏洞檢測(cè)的重要性。

      表13 研究問(wèn)題2的實(shí)驗(yàn)結(jié)果1

      表14 研究問(wèn)題2的實(shí)驗(yàn)結(jié)果2

      基于以上分析,可以得出

      結(jié)論2:較單獨(dú)考慮圖或單獨(dú)考慮序列,綜合考慮二者的漏洞檢測(cè)方案有著更好的檢測(cè)性能。

      4.3 研究問(wèn)題3的實(shí)驗(yàn)結(jié)果

      表15 與表16 展示了問(wèn)題3對(duì)應(yīng)的實(shí)驗(yàn)結(jié)果??梢钥闯?在兩類數(shù)據(jù)集上,實(shí)驗(yàn)組都具有更高的準(zhǔn)確率與F1值,其中,較對(duì)照組1,在簡(jiǎn)單數(shù)據(jù)集上,準(zhǔn)確率差異的平均值達(dá)到0.172 3,F1值差異的平均值達(dá)到0.174 4; 在復(fù)雜數(shù)據(jù)集上,準(zhǔn)確率差異的平均值達(dá)到0.139 4,F1值差異的平均值達(dá)到0.116 5。較對(duì)照組2,在簡(jiǎn)單數(shù)據(jù)集上,準(zhǔn)確率差異的平均值達(dá)到0.130 1,F1值差異的平均值達(dá)到0.133 7; 在復(fù)雜數(shù)據(jù)集上,準(zhǔn)確率差異的平均值達(dá)到0.110 1,F1值的差異的平均值達(dá)到0.091 5。以上差距驗(yàn)證了本文所使用的節(jié)點(diǎn)嵌入方式能有效替代傳統(tǒng)的詞向量方法,具有一定的合理性。

      表15 研究問(wèn)題3的實(shí)驗(yàn)結(jié)果1

      表16 研究問(wèn)題3的實(shí)驗(yàn)結(jié)果2

      基于以上分析,可以得出

      結(jié)論3:與傳統(tǒng)的節(jié)點(diǎn)源代碼初始化嵌入方式相比,本研究所采用的方法能更好地提取局部語(yǔ)義信息,進(jìn)而提升方案的漏洞檢測(cè)性能。

      4.4 研究問(wèn)題4的實(shí)驗(yàn)結(jié)果

      表17 與表18 展示了問(wèn)題4對(duì)應(yīng)的實(shí)驗(yàn)結(jié)果??梢钥闯?所有對(duì)照組中,對(duì)照組2(即使用GloVe模型)的整體性能最好,然而,實(shí)驗(yàn)組的結(jié)果顯示,在簡(jiǎn)單數(shù)據(jù)集上,準(zhǔn)確率平均提高了0.061 1,F1值平均提高了0.070 7; 在真實(shí)世界數(shù)據(jù)集上,準(zhǔn)確率平均提高了0.065 8,F1值平均提高了0.066 3。以上差距驗(yàn)證了預(yù)訓(xùn)練模型的引入較傳統(tǒng)詞向量模型對(duì)序列的嵌入有更好的效果,具有一定的合理性。

      表17 研究問(wèn)題4的實(shí)驗(yàn)結(jié)果1

      表18 研究問(wèn)題4的實(shí)驗(yàn)結(jié)果2

      基于以上分析,可以得出

      結(jié)論4:與傳統(tǒng)的源代碼序列初始化嵌入方式相比,本研究所采用的針對(duì)代碼的預(yù)訓(xùn)練模型能更好地提取抽取代碼全局語(yǔ)義信息,進(jìn)而提升模型的整體漏洞檢測(cè)性能。

      5 結(jié) 論

      本文主要結(jié)論如下:1) 提出了一個(gè)函數(shù)級(jí)源代碼漏洞檢測(cè)方案,綜合學(xué)習(xí)程序語(yǔ)義和結(jié)構(gòu)信息來(lái)識(shí)別漏洞。本方案以自動(dòng)化的方式捕獲了比現(xiàn)有方法更綜合的特征。2) 在多環(huán)節(jié)引入基于代碼的預(yù)訓(xùn)練語(yǔ)言模型來(lái)代替?zhèn)鹘y(tǒng)的詞向量模型進(jìn)行信息編碼。使用CodeBert生成源代碼序列的詞向量矩陣,使用CodeBert進(jìn)行節(jié)點(diǎn)元素初始化并用BiLSTM聚合節(jié)點(diǎn)內(nèi)部的局部語(yǔ)義信息。3) 分別在簡(jiǎn)單與復(fù)雜兩類數(shù)據(jù)集上與現(xiàn)有檢測(cè)方案進(jìn)行了對(duì)照實(shí)驗(yàn)。實(shí)驗(yàn)結(jié)果表明,該方案在多個(gè)評(píng)估指標(biāo)上顯著優(yōu)于現(xiàn)有的漏洞檢測(cè)方法。此外,對(duì)照實(shí)驗(yàn)也驗(yàn)證了各環(huán)節(jié)的有效性,并且表明本研究對(duì)節(jié)點(diǎn)、邊以及序列信息的處理策略優(yōu)于現(xiàn)有其他方案。

      本研究尚存在以下三點(diǎn)局限性:1) 預(yù)訓(xùn)練模型CodeBert含12個(gè)編碼器層,參數(shù)多達(dá)1.1億,訓(xùn)練與部署成本高昂。2) 數(shù)據(jù)集均為C/C++語(yǔ)言書寫,語(yǔ)言類型單一。3) 僅關(guān)注漏洞識(shí)別,為二分類探究,無(wú)法準(zhǔn)確區(qū)分漏洞類型。未來(lái)研究工作需要完善以上局限:1) 提出一個(gè)輕量級(jí)預(yù)訓(xùn)練模型。2) 擴(kuò)展數(shù)據(jù)集以適應(yīng)更多種類的程序設(shè)計(jì)語(yǔ)言。3) 擴(kuò)展本方案以適應(yīng)多類型的漏洞檢測(cè)。

      猜你喜歡
      源代碼集上漏洞
      人工智能下復(fù)雜軟件源代碼缺陷精準(zhǔn)校正
      漏洞
      基于TXL的源代碼插樁技術(shù)研究
      Cookie-Cutter集上的Gibbs測(cè)度
      鏈完備偏序集上廣義向量均衡問(wèn)題解映射的保序性
      軟件源代碼非公知性司法鑒定方法探析
      復(fù)扇形指標(biāo)集上的分布混沌
      三明:“兩票制”堵住加價(jià)漏洞
      漏洞在哪兒
      揭秘龍湖產(chǎn)品“源代碼”
      丰顺县| 蒲城县| 小金县| 麟游县| 宁城县| 余江县| 罗源县| 谢通门县| 安多县| 彭阳县| 师宗县| 镇远县| 横山县| 左贡县| 大厂| 皋兰县| 通城县| 许昌县| 宜春市| 罗源县| 斗六市| 观塘区| 沿河| 合江县| 吉安县| 青田县| 根河市| 繁峙县| 板桥市| 长宁县| 绵阳市| 和田县| 武鸣县| 滨海县| 宣化县| 永仁县| 晋江市| 咸丰县| 锦屏县| 新疆| 奉化市|