999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于特征依賴圖的源代碼漏洞檢測方法

2023-02-20 13:37:14楊宏宇楊海云張良成翔
通信學報 2023年1期
關鍵詞:檢測方法

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

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

0 引言

計算機系統是構建數字社會的基石,然而由軟件安全漏洞引發的數據泄露和安全攻擊時刻威脅著計算機系統的運行安全[1-2]。為避免安全威脅事件的發生,大量源代碼漏洞檢測方法被提出,但大多數方法僅根據安全專家手動定義的代碼漏洞特征或模板規則進行漏洞檢測,這些方法不僅誤報率高、漏洞覆蓋率低,而且模板規則需要伴隨新漏洞模式的出現動態更新[3]。

隨著深度學習在圖像識別和自然語言處理等領域取得顯著進展,研究者嘗試采用深度學習方法自動提取源代碼漏洞的隱式特征以進行源代碼漏洞檢測[4-5]。基于深度學習的源代碼漏洞檢測方法從大量訓練樣本中學習易受攻擊的代碼模式,當檢測新的源代碼樣本時,將其輸入預訓練的神經網絡,判斷是否包含易受攻擊的代碼模式[6],以確定代碼是否存在漏洞。最初,研究者采用卷積神經網絡(CNN,convolutional neural network)和循環神經網絡(RNN,recurrent neural network)等傳統神經網絡進行源代碼漏洞檢測[7],但傳統神經網絡較難學習到長序列的代碼標記特征。近年來,部分研究者嘗試將源代碼建模為圖結構,采用圖神經網絡進行源代碼漏洞檢測。

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

基于圖結構的方法使用不同類型的源代碼表示圖表征源代碼,采用圖神經網絡進行源代碼漏洞檢測。文獻[13]采用由抽象語法樹(AST,abstract syntax tree)、數據流圖(DFG,data flow graph)、控制流圖(CFG,control flow graph)和代碼執行順序組成的聯合圖表征源代碼,并使用門控圖神經網絡(GGNN,gated graph neural network)[14]學習并感知聯合圖中的語法語義信息,然后完成漏洞檢測。文獻[7]提出的Reveal 方法使用代碼屬性圖(CPG,code property graph)表示源代碼,并將代碼屬性圖的節點類型編碼在節點的表示向量中,該方法使用GGNN 提取代碼屬性圖的特征以進行源代碼漏洞檢測。上述基于圖結構的方法僅簡單使用源代碼的一種或多種表示圖表征源代碼,未深度分析表示圖中與漏洞語句相關的節點和邊,導致神經網絡無法全面學習與推理漏洞語句的語義信息。

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

1) 提出一種針對函數片的源代碼表征結構——特征依賴圖。與現有漏洞檢測方法采用的源代碼表征結構不同,FDG 不僅提取源代碼的全部控制依賴和數據依賴語義信息,而且深度分析了與潛在風險語句相關的控制依賴和數據依賴,并在圖中顯式維護候選漏洞語句的兩類語義信息,有助于漏洞檢測神經網絡獲取源代碼包含的潛在漏洞信息,做出更準確的判斷。

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

3) 提出一種面向FDG 的檢測網絡FDN,將對源代碼函數片的漏洞檢測工作轉化為函數片對應的FDG 檢測。FDN 通過圖學習網絡獲取FDG 中的語義信息,可以動態調整FDG 中不同邊類型對于漏洞檢測目標的重要性。同時,為了便于高效實施漏洞檢測,FDN 通過檢測網絡獲取FDG 的全局表示向量并提取全局特征。

1 源代碼漏洞檢測方法設計

基于特征依賴圖的源代碼漏洞檢測方法框架如圖1 所示,該方法由FDG 生成、節點嵌入和源代碼漏洞檢測3 個部分組成,各部分的主要操作設計如下。

圖1 基于特征依賴圖的源代碼漏洞檢測方法框架

1) FDG 生成。首先,使用代碼分析工具Joern生成函數片對應的AST、CDG 和DDG。其次,在AST 上匹配漏洞語法特征獲取候選漏洞語句。然后,分析候選漏洞語句的控制依賴鏈和數據依賴鏈,修改控制依賴圖和數據依賴圖的節點屬性和邊屬性,分別得到FCDG 和FDDG。最后,將FCDG和FDDG 融合為FDG。

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

3) 源代碼漏洞檢測。首先將FDG 輸入預訓練的源代碼漏洞檢測網絡FDN,由圖學習網絡部分學習并感知FDG 中包含的語義信息,并在學習感知過程中更新節點表示向量。由檢測網絡進行全局池化并獲取FDG 的全局表示向量,然后對FDG 的全局向量進行降維操作得到FDG 的低維表示向量,最后采用線性層檢測FDG 的低維向量并得到漏洞檢測結果。

2 特征依賴圖

2.1 方法分析

基于序列的方法將源代碼視為標記序列,這種表征方法容易忽略源代碼中包含的數據信息和控制信息,從而導致誤報的發生。以圖2 所示的函數片為例進行分析,基于序列的方法認為“free(data)”出現在“data”的使用之前,將忽略變量“flag1”的值為-1、“flag2”的值為1 以及存在控制語句“if”的情況,從而誤報該函數片存在內存釋放重用漏洞,即“use_after_free”漏洞。實際上,因為“flag2”值大于0,不會執行“free”函數,后續的輸出操作是合法的堆內存訪問,但是序列方法難以感知此類復雜的控制信息和數據信息。基于序列的方法VulDeePecker 和SySeVR 根據候選漏洞語句的數據依賴信息和控制依賴信息對源代碼進行切片,盡管考慮了源代碼的控制依賴和數據依賴相關的語義信息,但是未將這些信息與候選漏洞語句直接關聯,使神經網絡很難學習并感知這些關鍵信息,從而使神經網絡無法做出準確判斷。

圖2 函數片示例

基于圖結構的源代碼漏洞檢測方法使用邊連接代碼語句和其相關的數據依賴和控制依賴節點,與基于序列的方法相比,該類方法更容易獲取候選漏洞語句相關的語義信息。在現有基于圖結構的方法中,一部分方法僅采用單一代碼表示圖來表示源代碼,一部分方法則組合多種代碼表示圖以表征源代碼。這些方法采用的代碼表示圖均未顯式維護與候選漏洞語句相關的邊或節點。

為此,本文使用FDG 表征源代碼。首先,FDG作為一種基于圖的代碼表征結構,語句間的語義關系通過邊結構維護,使神經網絡更容易捕獲語義信息。其次,FDG 通過漏洞語法特征獲取候選漏洞語句,在圖中顯式維護與候選漏洞語句相關的控制信息和數據信息,使神經網絡可以充分獲取與候選漏洞語句相關的語義信息。最后,FDG 保留與候選漏洞語句的語義信息無關的邊和節點,因為這些邊和節點共同構成候選漏洞語句的上下文環境,從另一個角度反映了現實軟件源代碼中漏洞發生場景的復雜性,保留這些信息可以檢驗源代碼漏洞檢測方法的穩健性。

2.2 相關定義

FDG 是一種圖類型的源代碼表征結構,對于函數片f生成的FDG,可以形式化記為ffdg=(V,E,X,D),其中,V表示節點集;E表示有向邊集合;X表示節點屬性集,用于保存節點的類型屬性,節點類型分為2 種,分別為候選漏洞語句對應的節點和其他語句對應的節點;D保存邊的類型屬性,FDG 中邊類型分為4 種,分別為控制依賴邊(CDE,control dependence edge)、特征控制依賴邊(FCDE,feature control dependence edge)、特征數據依賴邊(FDDE,feature data dependence edge)、數據依賴邊(DDE,data dependence edge)。

FCDG 是一種維護候選漏洞語句和其他語句控制依賴信息的圖結構,對于函數片f生成的FCDG,可以形式化記為ffcdg=(V,E,X,D),它的邊類型分為2 種,與候選漏洞語句相關的控制依賴邊記為FCDE,其他語句對應的控制依賴邊記為CDE。

FDDG 是一種維護候選漏洞語句和其他語句數據依賴信息的圖結構,對于函數片f生成的FDDG,可以形式化記為ffddg=(V,E,X,D),它的邊類型分為2種,與候選漏洞語句相關的數據依賴邊記為FDDE,其他語句對應的數據依賴邊記為DDE。

本文提出控制依賴鏈反映代碼語句的多級控制依賴關系。對于代碼語句而言,其直接控制依賴決定它的執行流方向,其直接控制依賴的控制依賴也影響它的執行。如圖3 所示,代碼語句b是a 的直接控制依賴,c 是b 的直接控制依賴,因此代碼語句c 的執行效果也影響a 的執行。對于源代碼漏洞檢測而言,使神經網絡獲取候選漏洞語句的控制依賴鏈信息,有助于神經網絡做出準確判斷。

圖3 控制依賴鏈示例

與控制依賴鏈同理,本文提出數據依賴鏈反映變量的初始化和更新過程。控制依賴鏈可以反映候選漏洞語句所涉及變量的處理過程,使神經網絡捕獲更全面的數據信息,從而提高漏洞檢測準確率。

2.3 特征依賴圖生成過程

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

算法1FDG 生成算法

輸入函數片f

輸出一個以FDG 為元素的集合S

1) 獲取候選漏洞語句

候選漏洞語句指具有漏洞語法特征的潛在漏洞語句。本步驟采用的漏洞語法特征由SySeVR[3]提出,包括函數調用、數組用法、指針用法和算法表達式4 種,其中,函數調用類型的漏洞語法特征包括811 種C/C++的敏感API;SySeVR 提出的4 種漏洞語法特征對應126 種CWE 類型,覆蓋了常見漏洞類型。本文方法旨在利用4 種漏洞語法特征更大程度地獲取候選漏洞語句相關的語義信息,從而提高漏洞檢測準確率,降低誤報率。

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

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

圖4 函數片示例對應的部分AST

2) 生成特征控制依賴圖

生成特征控制依賴圖的本質是在控制依賴圖上標注候選漏洞語句對應的控制依賴鏈。在FCDG中,候選漏洞語句的控制依賴鏈的每條邊被標注為FCDE,與候選漏洞語句無關的控制依賴邊被標注為CDE。算法1 的步驟6)~步驟22)為生成FCDG的過程。

函數片f對應的FCDG 記為ffcdg,ffcdg被初始化為函數片f對應的控制依賴圖,然后在計算候選漏洞語句的控制依賴鏈過程中,修改原始控制依賴圖得到ffcdg,即特征控制依賴圖。在候選漏洞語句對應的控制依賴節點集Sc初始化時,Sc僅包含候選漏洞語句一個元素,算法1 從Sc中取出候選漏洞語句并開始查找它的控制依賴節點。在遍歷ffcdg各邊的過程中,當某條邊的目的節點是候選漏洞語句時,將該邊的目的節點屬性設置為“bad”,表示此節點對應候選漏洞語句;同時,將該邊的屬性設置為特征控制依賴邊 FCDE,表示該邊為候選漏洞語句對應控制依賴鏈的一部分。此外,將該邊對應的源節點加入Sc中繼續計算其控制依賴節點。如果某條邊的目的節點不是候選漏洞語句,則將該邊的屬性設置為控制依賴邊CDE。除候選漏洞語句對應的節點外,其余節點屬性設置為“good”,表示不包含候選漏洞語句。當Sc為空時,控制依賴鏈標注完畢,得到當前處理的候選漏洞語句的ffcdg。

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

圖5 候選漏洞語句“free(data)”對應的FCDG

3) 生成特征數據依賴圖

生成特征數據依賴圖的本質是在數據依賴圖上標注候選漏洞語句對應的數據依賴鏈。在FDDG中,候選漏洞語句對應數據依賴鏈的每條邊被標注為 FDDE,與候選漏洞語句無關的邊被標注為DDE。FDDG 的生成過程如算法1 的步驟24)~步驟34)所示。

與生成FCDG 的過程類似,函數片f對應的FDDG 記為ffddg,它被初始化為函數片f對應的數據依賴圖。在遍歷ffddg的邊集時,如果某條邊的目的節點是候選漏洞語句,則將該邊的屬性標注為FDDE,表示源節點是候選漏洞語句的數據依賴節點。同時將源節點加入候選漏洞語句的數據依賴節點集合Sd。在下一輪循環時,取出上一輪保存的源節點,繼續查找其控制依賴節點。通過上面的遞歸過程,可以查找候選漏洞語句的數據依賴鏈,并修改邊屬性為FDDE,標注候選漏洞語句的數據依賴鏈。當Sd為空時,候選漏洞語句的數據依賴鏈標注完畢,得到特征數據依賴圖ffddg。

以圖4 中的候選漏洞語句“free(data)”為例,其對應的部分FDDG 如圖6 所示。候選漏洞語句“free(data)”的數據依賴鏈由2 條FDDE 組成。

圖6 候選漏洞語句“free(data)”對應的FDDG

4) 生成特征依賴圖

特征依賴圖由特征控制依賴圖和特征數據依賴圖融合而來,融合過程如算法1 的步驟35)所示。在融合過程中,首先將FDG 的節點集設置為FCDG節點集和FDDG 節點集的并集,然后將FDG 的邊集設置為FCDG 邊集和FDDG 邊集的并集,最后將節點屬性和邊屬性合并。

此外,每條候選漏洞語句對應特有的FDG,因此一條候選漏洞語句處理完成時,將生成的FDG 加入集合S。當處理完畢函數片f的全部候選漏洞語句,得到集合S,S包含函數f對應的全部FDG。

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

圖7 候選漏洞語句“free(data)”對應的FDG

2.4 算法復雜度分析

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

在實際的FDG 生成過程中,因為控制依賴圖或數據依賴圖為函數片的代碼表示結構,源代碼中控制依賴關系和數據依賴關系有限,因此大部分語句節點間均無連接邊。此外,在真實函數片中,控制語句的嵌套層數和數據依賴的層數有限,因此生成FDG 的實際執行時間適中,具備可行性,5.5 節的實驗數據證明了這一結論。

3 節點嵌入

節點嵌入指設置FDG 的節點初始表示向量。圖神經網絡的本質是通過節點間的信息交換和聚合鄰居信息以獲得新的節點表示向量[15-16],因此需要對輸入圖神經網絡的FDG 節點設置初始表示向量。節點嵌入階段的輸入是FDG,輸出是具有節點初始表示向量的FDG。節點嵌入的處理過程包括以下3 個步驟。

1) 代碼標記抽象化。首先將函數片f拆分為單個代碼標記的組合,記為fT={t1,t2,…,tn},其中ti為單個代碼標記。然后依次遍歷ti(1≤i≤n),若ti為變量名,則將ti及其相同的變量標記抽象化為vari,若ti為函數名,則將ti及其相同的函數標記抽象化為funi,得到抽象化后的代碼標記組合為。最后,遍歷FDG的節點集,修改經過更新的變量名和函數名,得到不含具體變量名和函數名的FDG。經過代碼標記抽象化后,具體的變量名和函數名被抽象名稱替代,使神經網絡更易感知FDG 節點間語義關系的學習,減小具體的變量名和函數名對神經網絡感知過程的影響。

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

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

4 源代碼漏洞檢測

4.1 漏洞檢測網絡架構

本文所提的源代碼表征結構FDG 是一種異構圖,包含2 種不同的節點類型和4 種不同的邊類型,FDG 使漏洞檢測網絡更容易學習并感知源代碼中與候選漏洞語句相關的控制和依賴信息。對于源代碼漏洞檢測而言,FDG 中候選漏洞語句對應的節點相比其他節點而言更重要,其對應的控制依賴和數據依賴也比其他節點的語義信息更重要。現有基于圖結構的源代碼漏洞檢測方法基于GGNN 構建漏洞檢測網絡,GGNN 適合同構圖的學習和感知,并未考慮不同類型的節點和邊在圖表示方面的差異性。

為克服以上問題,本文提出一種針對FDG 的漏洞檢測網絡FDN。FDN 由圖學習網絡和檢測網絡組成,其網絡結構如圖8 所示。FDN 使用函數片訓練集最小化損失函數,通過梯度下降算法獲得最優網絡參數,得到預訓練的FDN。當檢測新的函數樣本時,首先生成函數片對應的FDG,然后將FDG 輸入預訓練的FDN,得到源代碼漏洞檢測結果。

圖8 FDN 網絡結構

4.2 圖學習網絡

圖學習網絡通過學習感知FDG 的鄰居節點信息,更新節點表示向量。圖學習網絡由異構圖轉換器(HGT,heterogeneous graph transformer)[18]和線性整流函數——修正線性單元(ReLU,rectified linear unit)組成。HGT 通過異構注意力機制學習并感知FDG 節點間的信息。ReLU 是一種高效的激活函數,可以有效避免梯度消失和梯度爆炸問題。對于FDG,HGT 的學習感知過程包括異構注意力計算、鄰居信息傳遞和目標節點聚合3 個步驟。

1) 異構注意力計算

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

其中,K i(s)為第i個注意力頭上節點s的鍵向量,K_Linear 為第i個注意力頭上和節點類型相關的線性映射,H為節點的表示向量。對于不同類型的節點使用不同的線性映射,這使候選漏洞語句節點和其他節點在計算鍵向量K時具有不同的特征表示空間,并且這些線性映射是可學習的,從而可以優化不同類型的節點表示。然后,使用式(2)計算查詢向量Q。

其中,Q i(t)為第i個注意力頭上節點t的查詢向量,Q_Linear為第i個注意力頭上和節點類型相關的線性映射。使用式(3)計算目標節點t與鄰居s注意力分數。

其中,μ為與源節點類型、連接邊類型和目的節點類型相關的縮放因子,此外,式(3)在計算鍵向量K和查詢向量Q的相似度時引入與邊類型相關轉換矩陣W,即在相似度計算時,不同的邊類型使用不同的W,這使注意力計算可以考慮源節點和目的節點間的連接關系。在漏洞檢測場景下,W作為FDN 的一類網絡參數,在訓練過程中,因為FCDE 和FDDE連接的節點語句包含更多與候選漏洞語句相關的信息,梯度下降算法將調整FCDE 和FDDE 的權重,以使FDN 網絡損失更小,漏洞檢測性能更高。

對于每一個注意力頭,當得到目標節點t與鄰居s注意力分數后,使用式(4)組合每個注意力頭上的注意力分數,并經過Softmax 函數處理,將注意力分數轉換為概率值。

在FDG 上進行異構注意力計算的示意如圖9所示。圖9 中,中間節點是候選漏洞語句節點,其他節點對應良性語句。對于中間節點而言,每個鄰居節點對其產生不同程度的影響,異構注意力計算旨在獲取其每個鄰接節點相對于中間節點的重要性分數。因為FCDE 和FDDE 分別連接候選漏洞語句的控制依賴節點和數據依賴節點,這2 種語義信息相比于其他節點的語義信息更重要,所以FDN會自動增加FCDE 和FDDE 的連接強度,以適應漏洞檢測場景。

圖9 異構注意力計算示意

2) 鄰居信息傳遞

首先,在第i個注意力頭的計算消息頭

其中,W為計算消息頭場景下與邊類型相關的轉換矩陣,M_Lineari為第i個注意力頭和節點類型相關的線性映射。然后組合h個消息頭,即

3) 目標節點聚合

首先,通過將目標節點t的鄰居與其對應的注意力分數加權求和,獲得聚合消息向量為

然后,將聚合消息向量輸入激活函數,通過針對特定節點類型的線性映射將聚合消息向量映射到目標節點類型的特征空間,與上一層目標節點的表示向量相加,得到更新后的目標節點向量為

其中,A_Linear 為與節點類型相關的線性映射,σ為激活函數。

4.3 漏洞檢測

檢測網絡旨在進行全局池化和全局表示向量降維,并進行漏洞檢測。首先,將經過信息交換的FDG 輸入檢測網絡,經過全局均值池化過程處理后,得到FDG 的全局表示向量Hfdg

其中,N表示FDG 的節點個數,x表示單個節點的表示向量。全局表示向量Hfdg不僅反映了此時全部節點的狀態,而且蘊含數據依賴和控制依賴關系,整體反映了FDG 的語義信息。

為提取全局表示向量的有效特征,剔除與漏洞信息無關的冗余特征,采用線性層對全局表示向量進行降維操作,得到FDG 的低維表示向量。在FDN中,該線性層的輸入維度為節點維度,輸出維度為原節點維度的。

此時,FDG 的低維表示向量蘊含FDG 所包含的全部信息。于是采用線性層進行漏洞檢測。該線性層的輸入是FDG 的低維表示向量,線性層內部對FDG 的低維表示向量進行加權計算后,得到線性層輸出維度的2 個神經元激活值,它們分別代表FDG 有無漏洞的置信度,即源代碼漏洞檢測結果。最后,使用Softmax 函數將2 個神經元的激活值轉換為概率值,得到漏洞檢測結果的概率表示。

5 實驗與結果

5.1 數據集

為驗證本文所提方法的有效性,選取軟件保障參考數據集(SARD,software assurance reference dataset)和來源于真實軟件項目的Devign 數據集[13]、Reveal數據集[7]進行驗證實驗。

SARD 由美國國家標準與技術研究院提出,SARD 中的代碼一部分是生產環境中源程序的半合成代碼,一部分是用于學術研究的人工合成代碼。數據集中源代碼有3 種類型,分別是有漏洞的源代碼、無漏洞的源代碼以及修補過漏洞的源代碼。

SARD 包含118 種CWE 漏洞,本文選擇數據量較多的7 種漏洞類型進行驗證。SARD 中源代碼并未以函數片形式存在,因此本文使用Ecplise CDT 來逐個解析源代碼文件的結構,獲取源代碼文件中的全部聲明,然后遍歷每個聲明判斷其是否為函數聲明。如果是,則獲取它的函數定義,另存為函數片。同時,判斷函數聲明中是否包含“good”或者“bad”關鍵字,如果包含,則將對應的標簽值0 或1 寫入函數片文件名,1 表示函數片存在漏洞,0 表示無漏洞。預處理后的SARD 數據集信息如表1 所示。

表1 預處理后的SARD 信息

Devign 數據集由Zhou 等[13]提出。該數據集從Linux Kernel、Qemu、Wireshark 和FFmpeg 項目中提取與安全問題相關的代碼提交,通過比對提交前后函數片是否修改來確定是否存在漏洞。同時,由安全研究人員人工確認函數片的安全性,以保證數據集的質量[13]。該數據集能夠反映現實軟件項目代碼的復雜性,可以較好地評估漏洞檢測方法的性能。Devign 數據集中存在漏洞的函數片為12 458 個,無漏洞的函數片為14 855 個,每個函數片已經包含標簽值。

Reveal 數據集由Chakraborty 等[7]提出。該數據集通過跟蹤Linux Debian Kernel 和Chromium 這2 個開源項目的歷史漏洞生成。這2 個軟件項目有長期的更新歷史,分別代表了操作系統和瀏覽器這2 個重要的軟件領域,同時它們具有大量公開可用的漏洞報告,適合源代碼漏洞檢測方法的驗證[7]。Reveal 數據集中存在漏洞的函數片為2 238 個,無漏洞的函數片為20 487 個,每個函數片已經包含標簽值。經過FDG 生成過程,Devign 數據集和Reveal數據集的信息如表2 所示。

表2 預處理后的數據集信息

5.2 實驗環境配置

實驗使用的CPU 為Intel(R) Xeon(R) Gold 5215,內存大小為48 GB,顯卡型號為Tesla-V100。本文使用Pytorch 1.11.0 和Pytorch-geometric 2.0.4實現FBLD 方法,訓練集與測試集的比例為7:3,訓練輪次為100 輪,訓練學習率設置為0.001,訓練過程中學習率隨時間指數級衰減。圖學習網絡部分的HGT 的注意力頭數設置為2。

5.3 評價標準

實驗采用的評價指標包括準確率、精確率、召回率和F1 分數。每個指標的計算方法為

準確率(A,accuracy)。準確分類的樣本占總樣本數量的比例,準確率計算方法為

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

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

F1 分數(F1,F1-score)。精確率和召回率的調和平均值,反映模型整體表現情況,F1 計算方法為

在上述指標計算式中,TP(true positive)為漏洞樣本檢測為漏洞樣本的樣例數,TN(true negative)為良性樣本檢測為良性樣本的樣例數,FP(false positive)為漏洞樣本檢測為良性樣本的樣例數,FN(false negative)為良性樣本檢測為漏洞樣本的樣例數。

5.4 漏洞檢測實驗結果與分析

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

圖10 各方法在Devign 和Reveal 數據集上的準確率對比

圖11 各方法在Devign 和Reveal 數據集上的精確率對比

圖12 各方法在Devign 和Reveal 數據集上的召回率對比

圖13 各方法在Devign 和Reveal 數據集上的F1 分數對比

表3 SARD 數據集上各方法準確率對比

表4 SARD 數據集上各方法精確率對比

表5 SARD 數據集上各方法召回率對比

表6 SARD 數據集上各方法F1 分數對比

實驗結果表明,FBLD 在3 個數據集上的關鍵評價指標大多優于其他方法,其中,準確率比最優方法提高 0.87%~7.39%,精確率提高2.22%~9.56%,召回率提高1.50%~22.32%,F1分數提高1.86%~16.69%。在SARD 上的檢測實驗主要針對7 種漏洞類型(CWE20、CWE78、CWE129、CWE190、CWE400、CWE787、CWE789),針對CWE20、CWE129、CWE190、CWE789 漏洞類型,FBLD 的4 個評價指標(準確率、精確率、召回率、F1 分數)均優于其他方法。其原因如下。1) FDG 顯式維護候選漏洞語句的控制依賴鏈和數據依賴鏈,區分候選漏洞語句和其他語句的節點類型,這使漏洞檢測網絡FDN 更容易捕獲與候選漏洞語句相關的語義信息。2) FDN能夠學習并感知FDG 中豐富的語義信息,并自動調整不同邊類型和節點類型對于漏洞檢測的重要性,提高了FBLD 的漏洞檢測性能。

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

從表4 可知,針對CWE78漏洞類型,VulDeePecker的檢測精確率最高,為95.96%,FBLD 的精確率為94.31%,略低于VulDeePecker,排名第二。分析其原因如下,VulDeePecker 僅提取敏感API 一種漏洞語法特征,并根據敏感API 的數據依賴獲取與其相關的語義切片。CWE78 是命令注入型漏洞,這種漏洞與API調用緊密相關(如execve 等函數調用)。FBLD 提取包含敏感API 在內的多種特征,多種特征的結合可能會使神經網絡在部分情況下產生誤判,導致FBLD 對此類漏洞的檢測精確率略低于VulDeePecker。

不同于SARD 的合成代碼,Devign 和Reveal數據集來源于真實的開源軟件項目,在對比檢測實驗中,7 種方法的評價指標均低于在SARD 上的評價指標。由于Reveal 數據集存在數據不平衡問題,導致7 種方法的準確率相對于其他指標偏高,但這種不平衡反映了源代碼漏洞檢測的真實環境。因為在大多數情況下,存在漏洞的樣本數量遠小于良性樣本的數量。在Devign 和Reveal 數據集上,FBLD仍然表現良好,其重點指標優于其他方法。其中,FBLD 對漏洞樣本檢測的召回率最高提升22.32%,表明FBLD 可以發現更多存在漏洞的樣本;FBLD的F1 分數最高提升16.69%,表明FBLD 提高了源代碼漏洞檢測的綜合性能。分析其原因如下。

1) FBLD 提取源代碼函數片的全部候選漏洞語句后,對每個候選漏洞語句生成對應的FDG,因而每個函數片對應若干個FDG,當函數片對應的某個FDG 被源代碼漏洞檢測網絡確認存在漏洞,則判定函數片存在漏洞。FBLD 依據4 種漏洞語法特征,可以覆蓋絕大部分CWE 漏洞類型,與僅使用一種漏洞語法特征的μVulDeePecker 和VulDeePecker 相比,FBLD 方法在Devign 數據集上召回率分別提高163.12%和44.03%。此外,FBLD 采用的FDN 可以充分學習并感知候選漏洞語句的控制依賴信息和數據依賴信息,因而檢測關鍵指標優于其他7 種方法。

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

3) VulDeeLocator 和SySeVR 使用4 種漏洞語法特征對源代碼進行切片,最大程度獲取了源代碼的原始信息,因此在基于標記序列的5 種方法(Russell方法、VulDeePecker、SySeVR、μVulDeePecker 和VulDeeLocator)中表現最佳,但是這2 種方法未顯式維護候選漏洞語句的數據依賴和數據依賴關系,增加了神經網絡學習控制依賴和數據依賴信息的難度,因此漏洞檢測性能整體略低于 FBLD、Devign、Reveal 等基于圖結構的漏洞檢測方法。

4) 與VulDeeLocator 和SySeVR 相比,μVulDee-Pecker 和VulDeePecker 因僅使用敏感API 一種漏洞語法特征進行函數切片,忽略了大量數組、指針和表達式相關的漏洞信息,因此性能低于SySeVR 和VulDeePecker。此外,μVulDeePecker 使用由控制依賴和數據依賴引起的語義信息,而VulDeePecker 僅使用由數據依賴引起的語義信息,從而其漏洞檢測性能低于μVulDeePecker。與VulDeePecker 使用雙向長短期記憶神經網絡處理語句的長距離上下文關系相比,Russell 方法使用RNN 構建漏洞檢測網絡,RNN 處理長距離信息關聯時依賴極易出現梯度消失現象,在一定程度上影響了漏洞檢測性能。

上述實驗結果表明,與其他7 種方法相比,本文提出的FBLD 方法在源代碼漏洞檢測方面的綜合性能更好。

5.5 算法時間復雜性驗證

本文在Reveal 數據集上驗證FDG 生成算法的時間復雜性,Reveal 數據集中全部函數片生成的FDG 共20 109 個,表7 記錄了Reveal 數據集生成的FDG 的節點數量、邊數量和消耗時間三類信息。數據表明,生成FDG 的最大時間消耗為78.96 s,消耗時間的中位數為2.53 s,證明FDG 生成算法的時間復雜度可控,具備實際可行性。

表7 FDG 生成算法時間復雜性驗證結果

本文在Reveal 數據集上通過訓練時間和檢測時間對比了不同方法的漏洞檢測模型時間復雜度,對比結果如表8 所示,表8 中各方法的訓練輪數均為100。實驗結果表明,本文所提方法的訓練時間和平均檢測時間分別為87 min 和4.89 s,分析其原因為FDN 包含2 個HGT 層和多個線性層,圖神經網絡的訓練與計算消耗了較多時間。盡管本文的漏洞檢測模型訓練時間較長,但對于新樣本的平均檢測時間可控,且訓練過程僅需一次,故本文方法具備一定的實際意義。

表8 漏洞檢測模型時間消耗對比

6 結束語

針對現有源代碼漏洞檢測方法無法全面獲取漏洞語句的相關信息,導致漏洞檢測誤報率高等問題,本文提出一種基于特征依賴圖的源代碼漏洞檢測方法。采用一種新穎的源代碼表示結構FDG 分析候選漏洞語句的控制依賴鏈和數據依賴鏈,并在FDG 中顯式維護候選漏洞語句的控制依賴鏈和數據依賴鏈,更容易捕獲候選漏洞語句的語義信息。本文提出的面向FDG 的漏洞檢測網絡FDN,可以有效推理并感知FDG 包含的語義信息,同時可以動態調整漏洞語句相關的邊和節點的重要性。在3 個數據集上的實驗結果表明,本文方法的源代碼漏洞檢測性能優于其他現有方法。

在未來研究中,將嘗試設計漏洞語法特征更新機制以檢測未知漏洞,同時,嘗試更高效的代碼表示結構和漏洞檢測神經網絡,進一步提高準確率并降低誤報率,提升源代碼漏洞檢測方法的性能。

猜你喜歡
檢測方法
“不等式”檢測題
“一元一次不等式”檢測題
“一元一次不等式組”檢測題
“幾何圖形”檢測題
“角”檢測題
學習方法
小波變換在PCB缺陷檢測中的應用
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
賺錢方法
主站蜘蛛池模板: 国产精品吹潮在线观看中文| 国产精品亚洲天堂| 国产日韩丝袜一二三区| 亚洲天堂在线视频| 亚洲人视频在线观看| 免费毛片视频| 国产午夜小视频| 国产91透明丝袜美腿在线| 亚洲中文字幕无码爆乳| 九色最新网址| 久久久久国产一区二区| 国产一二三区视频| 99久久国产精品无码| 91伊人国产| 国产永久在线视频| 久久6免费视频| 97成人在线观看| 精品福利国产| 91av成人日本不卡三区| 538精品在线观看| 97狠狠操| 亚洲人人视频| 片在线无码观看| 日本精品αv中文字幕| 九九热精品免费视频| AV熟女乱| 欧美精品1区2区| 日韩精品欧美国产在线| 久久久国产精品无码专区| 国产H片无码不卡在线视频| 在线观看国产精品日本不卡网| 多人乱p欧美在线观看| 99久久精品免费视频| 99精品免费欧美成人小视频| 中文字幕有乳无码| 国产精品自在线天天看片| 伊人色天堂| 欧美精品影院| 91人妻日韩人妻无码专区精品| 在线人成精品免费视频| 伊人色综合久久天天| 热久久综合这里只有精品电影| 国模沟沟一区二区三区| 伊人久久大线影院首页| 亚洲a免费| 日韩高清一区 | 亚洲第一成网站| 亚洲成人www| 亚洲精品无码日韩国产不卡| 第一页亚洲| 精品久久久久无码| 91精品国产福利| 99伊人精品| 国产剧情一区二区| 亚洲香蕉伊综合在人在线| 啪啪国产视频| 国产午夜在线观看视频| 亚洲天堂网在线视频| 成年人国产网站| 欧美一区中文字幕| 亚洲 欧美 中文 AⅤ在线视频| 国产精品自拍露脸视频| 亚洲—日韩aV在线| 伊人久久精品无码麻豆精品| 一边摸一边做爽的视频17国产| 欧美精品在线观看视频| 中国黄色一级视频| 在线观看视频一区二区| 在线高清亚洲精品二区| 啪啪永久免费av| 中文字幕2区| 嫩草国产在线| 亚洲国产精品美女| 国产精品青青| 免费aa毛片| 青青操视频在线| 国产精品男人的天堂| 大香网伊人久久综合网2020| 99热6这里只有精品| 真人高潮娇喘嗯啊在线观看| 亚洲精品片911| 天堂av综合网|