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

基于關(guān)系圖卷積網(wǎng)絡(luò)的源代碼漏洞檢測

2022-07-05 10:08:08文敏王榮存姜淑娟
計算機應(yīng)用 2022年6期
關(guān)鍵詞:檢測方法模型

文敏,王榮存,姜淑娟

基于關(guān)系圖卷積網(wǎng)絡(luò)的源代碼漏洞檢測

文敏1,2,王榮存1,2,3*,姜淑娟1,2

(1.礦山數(shù)字化教育部工程研究中心(中國礦業(yè)大學(xué)),江蘇 徐州 221116; 2.中國礦業(yè)大學(xué)計算機科學(xué)與技術(shù)學(xué)院,江蘇 徐州 221116; 3.高安全系統(tǒng)的軟件開發(fā)與驗證技術(shù)工業(yè)和信息化部重點實驗室(南京航空航天大學(xué)),南京 211106)(*通信作者電子郵箱rcwang@cumt.edu.cn)

軟件安全的根源在于軟件開發(fā)人員開發(fā)的源代碼,但隨著軟件規(guī)模和復(fù)雜性不斷提高,僅靠人工檢測漏洞代價高昂且難以擴展,而現(xiàn)有的代碼分析工具有較高的誤報率與漏報率。為此,提出一種基于關(guān)系圖卷積網(wǎng)絡(luò)(RGCN)的自動化漏洞檢測方法以進(jìn)一步提高漏洞檢測的精度。首先將程序源代碼轉(zhuǎn)換為包含語法、語義特征信息的CPG;然后使用RGCN對圖結(jié)構(gòu)進(jìn)行表示學(xué)習(xí);最后訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型預(yù)測程序源代碼中的漏洞。為驗證所提方法的有效性,在真實的軟件漏洞樣本上開展了實驗驗證,結(jié)果表明所提方法的漏洞檢測結(jié)果的召回率和F1值分別達(dá)到了80.27%和63.78%。與Flawfinder、VulDeepecker和基于圖卷積網(wǎng)絡(luò)(GCN)的同類方法相比,所提方法的F1值分別提高了182%、12%和55%,可見所提方法能有效提高漏洞檢測能力。

漏洞檢測;代碼屬性圖;關(guān)系圖卷積網(wǎng)絡(luò);深度學(xué)習(xí);預(yù)測模型

0 引言

如今,計算機軟件已經(jīng)滲透到生活的方方面面。不安全的軟件可能造成用戶的人身傷害和財產(chǎn)損失,甚至嚴(yán)重威脅國家安全。軟件變得愈加復(fù)雜,且規(guī)模也不斷增加;與此同時,安全漏洞的數(shù)量一直在逐年增加。漏洞也稱為脆弱性,是指軟件中的特定缺陷或疏忽[1]。攻擊者可以利用這些漏洞進(jìn)行惡意操作,暴露或更改敏感信息,破壞或控制計算機系統(tǒng),對信息安全產(chǎn)生極大的威脅。2017年,WanaCry病毒勒索軟件利用了一個源自服務(wù)器消息塊的漏洞,導(dǎo)致了全球約80億美元的損失。鑒于現(xiàn)代軟件項目的規(guī)模和復(fù)雜度在不斷提高,通過人工方式開展漏洞檢測代價高昂,且難以擴展,因此使用工具自動檢測軟件漏洞輔助代碼審計是一個重要研究方向。根據(jù)是否依賴程序運行,傳統(tǒng)的漏洞分析方法[2]分為靜態(tài)方法和動態(tài)方法。靜態(tài)分析方法[3]根據(jù)預(yù)定義的漏洞規(guī)則對源程序進(jìn)行掃描,以便獲取詞法、語法、控制流和數(shù)據(jù)流等信息后進(jìn)行模式匹配來發(fā)現(xiàn)漏洞。該類方法無需搭建運行環(huán)境,但是需要源代碼,常常應(yīng)用于設(shè)計開發(fā)階段。典型的靜態(tài)分析工具有Coverity、Flawfinder、RATS。動態(tài)分析方法通過收集軟件運行過程中程序狀態(tài)和運行路徑等信息進(jìn)行分析。該類方法需要構(gòu)造大量測試輸入,以覆蓋盡可能多的程序輸出和執(zhí)行路徑,常應(yīng)用于調(diào)試、測試階段。常見的動態(tài)分析工具有KLEE[4]、S2E[5]、libFuzzer、AFL等。

然而,現(xiàn)有的代碼分析工具在檢測漏洞方面不夠有效。靜態(tài)分析工具往往依賴于專家知識人工構(gòu)造的漏洞模式庫。隨著軟件復(fù)雜性持續(xù)增加,人工構(gòu)造漏洞模式庫的成本高昂,且人的主觀性會影響漏洞檢測的誤報率和漏報率。在動態(tài)方法中,符號執(zhí)行[6]策略面臨著路徑爆炸、約束求解困難、代價高昂、內(nèi)存建模與并行處理復(fù)雜、難以擴展到大規(guī)模程序等問題。同樣的,模糊測試[7]面臨著覆蓋率低、依賴種子生成質(zhì)量、測試冗余、測試攻擊面模糊、難以發(fā)現(xiàn)訪問控制漏洞和設(shè)計邏輯錯誤等問題。

漏洞產(chǎn)生的根源是軟件開發(fā)人員開發(fā)的不安全代碼。軟件的長期運行積累了大量的歷史數(shù)據(jù),因此可以利用機器學(xué)習(xí)方法學(xué)習(xí)并挖掘與軟件漏洞相關(guān)的歷史數(shù)據(jù)。與靜態(tài)分析檢測漏洞方法相比,基于機器學(xué)習(xí)的漏洞檢測方法能有效降低漏洞的漏報率。與符號執(zhí)行等動態(tài)分析方法相比,基于機器學(xué)習(xí)的漏洞檢測方法成本更低、更具擴展性。同時機器學(xué)習(xí)結(jié)果還可以用于指導(dǎo)模糊測試中的路徑覆蓋和種子生成,有助于解決傳統(tǒng)漏洞分析方法的局限性。因此研究基于機器學(xué)習(xí)的代碼脆弱性識別方法,解決漏洞挖掘的自動化、效率、代碼覆蓋率、代碼深度等問題,降低人工參與度,實現(xiàn)智慧型脆弱性知識挖掘和系統(tǒng)級大規(guī)模脆弱性挖掘具有重要的現(xiàn)實意義。

鑒于已有的基于靜態(tài)分析的漏洞檢測方法存在精度不高的問題,本文提出了一種基于關(guān)系圖卷積網(wǎng)絡(luò)( Relational Graph Convolution Network, RGCN)的自動化漏洞檢測方法。首先將程序源代碼轉(zhuǎn)換為包含語法語義特征信息的代碼屬性圖(Code Property Graph, CPG),然后使用RGCN對圖進(jìn)行表示學(xué)習(xí)后進(jìn)行漏洞預(yù)測。最后,在真實世界的軟件漏洞樣本上開展了實驗驗證,并比較了三種基線方法。實驗結(jié)果表明,與基線方法相比,本文方法能進(jìn)一步提高漏洞檢測能力。

1 相關(guān)工作

基于機器學(xué)習(xí)的漏洞檢測方法[8-9]通過挖掘軟件漏洞歷史數(shù)據(jù),使用機器學(xué)習(xí)模型進(jìn)行漏洞檢測。已有的研究可大致分為基于軟件度量的漏洞檢測和基于模式學(xué)習(xí)的漏洞檢測。

基于軟件度量的漏洞檢測往往依賴于專家定義的特征,其思想主要借鑒了軟件質(zhì)量和可靠性領(lǐng)域的缺陷預(yù)測。軟件度量信息包含代碼度量和過程度量等,其中代碼度量主要描述源碼的靜態(tài)特征。如Shin等[10]研究了基于代碼復(fù)雜度和執(zhí)行復(fù)雜度等傳統(tǒng)缺陷預(yù)測度量能否用來預(yù)測漏洞,并嘗試了多種分類模型。Younis等[11]選取了代碼行數(shù)、圈復(fù)雜度、嵌套層數(shù)等八個代碼度量指標(biāo)描述代碼特征,實驗驗證了三種不同的特征選擇方法和四種不同的分類算法預(yù)測可被利用的漏洞。Walden等[12]首次將文本挖掘相關(guān)方法應(yīng)用于軟件組件漏洞預(yù)測,與基于軟件度量的學(xué)習(xí)模型相比具有更高的召回率和準(zhǔn)確率。過程度量主要描述了從版本管理系統(tǒng)中收集的代碼開發(fā)過程中的各種變化信息。如Shin等[13]研究了開發(fā)者活動度量元與漏洞間的聯(lián)系,構(gòu)建貝葉斯網(wǎng)絡(luò)預(yù)測易受攻擊的文件。Bosu等[14]針對易受攻擊代碼的更改特征進(jìn)行了實證研究,分析了10個開源項目中超過260 000個代碼修改請求。王飛雪等[15]基于漏洞披露報告定義了一組特征,如修復(fù)時間、漏洞嚴(yán)重性、開發(fā)人員信息、更改文件數(shù)等,并使用四種機器學(xué)習(xí)方法進(jìn)行了漏洞分類。

盡管上述研究使用了不同類型的統(tǒng)計度量指標(biāo),但這些度量僅是開發(fā)人員根據(jù)經(jīng)驗而設(shè)計的統(tǒng)計特征,并非漏洞的直接指示,與漏洞關(guān)聯(lián)性不強。因此,上述方法無法有效地捕捉到豐富的程序語義、語法結(jié)構(gòu)信息,從而限制了機器學(xué)習(xí)分類模型對程序行為進(jìn)行推理的能力。從這個意義上說,僅依賴于軟件度量指標(biāo)構(gòu)建預(yù)測模型進(jìn)行漏洞檢測的效果不夠理想。

基于模式學(xué)習(xí)的漏洞檢測常結(jié)合不同的程序分析技術(shù)如靜態(tài)分析、動態(tài)分析、詞法分析和語法分析等輔助模型學(xué)習(xí)。如Yamaguchi等[16]提出了一種名叫“漏洞外推”(Vulnerability Extrapolation)的方法進(jìn)行漏洞檢測。該方法從漏洞函數(shù)中提取抽象語法樹(Abstract Syntax Tree, AST),將其映射到向量空間,進(jìn)而尋找結(jié)構(gòu)上相似的函數(shù)。Russell等[17]編譯了一個包含數(shù)百萬個開源函數(shù)的龐大數(shù)據(jù)集,使用三個不同的靜態(tài)分析器進(jìn)行了標(biāo)記,經(jīng)詞法分析和向量化編碼后使用卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network, CNN)和循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network, RNN)模型進(jìn)行特征提取,最后使用隨機森林對所學(xué)習(xí)到的特征進(jìn)行分類,證明了利用深度學(xué)習(xí)進(jìn)行漏洞檢測的可行性。Duan等[18]將程序代碼節(jié)點之間的關(guān)系編碼為144維的特征張量,充分提取了程序的語義特征,并利用注意力機制的神經(jīng)網(wǎng)絡(luò)來學(xué)習(xí)程序不同區(qū)域的注意力權(quán)重,實現(xiàn)對漏洞的細(xì)粒度檢測,以解決檢測細(xì)粒度漏洞準(zhǔn)確率低的問題。Li等[19]提出的基于深度學(xué)習(xí)的漏洞檢測系統(tǒng)VulDeepecker通過對庫/API調(diào)用進(jìn)行語義切片后組合成code gadget,再對其進(jìn)行向量化編碼成固定長度后使用雙向長短期記憶(Bi-directional Long-Short Term Memory, BLSTM)神經(jīng)網(wǎng)絡(luò)進(jìn)行學(xué)習(xí)和預(yù)測。但BLSTM神經(jīng)網(wǎng)絡(luò)只適合線性序列,只能學(xué)習(xí)淺層表示,無法捕獲程序深層的結(jié)構(gòu)和語義。基于圖的表示形式包含了代碼中更豐富的語義語法和結(jié)構(gòu)特征,因此將代碼轉(zhuǎn)換成基于圖的中間表示對其進(jìn)行學(xué)習(xí)成為當(dāng)下研究熱點。孔維星等[20]在對源碼進(jìn)行程序分析構(gòu)造出代碼圖的鄰接矩陣和特征矩陣后,輸入到圖卷積網(wǎng)絡(luò)(Graph Convolution Network, GCN)模型進(jìn)行學(xué)習(xí)。該學(xué)習(xí)模型只專注于代碼節(jié)點之間是否存在連接,將代碼節(jié)點之間不同的類型邊融合成了一條,沒有考慮不同類型邊對于漏洞檢測效果的影響。為此有必要結(jié)合多種類型的代碼圖,對不同語義、語法邊分別進(jìn)行學(xué)習(xí),以捕獲脆弱性和非脆弱性語句之間潛在和細(xì)微的語義、語法差距,學(xué)習(xí)更多的漏洞類型和模式。本文使用結(jié)合了AST、控制流圖(Control Flow Graph, CFG)和程序依賴圖(Program Dependence Graph, PDG)等多種語義、語法邊的CPG,利用RGCN模型對包含不同類型邊的CPG進(jìn)行學(xué)習(xí)以識別漏洞。

2 背景介紹

2.1 代碼屬性圖

CPG是由Yamaguchi等[21]為了查找漏洞而提出的一種新的源代碼表示形式。該圖將AST、CFG和PDG這三種經(jīng)典的代碼表示圖合并到一個聯(lián)合數(shù)據(jù)結(jié)構(gòu)中,以對程序進(jìn)行更加全面的建模,并實現(xiàn)了原型工具Joern。代碼表示圖的解析生成通常需要搭建編譯工作環(huán)境,包含所有頭文件。與以往的分析器不同,Joern是一個基于island grammar[22]構(gòu)建的分析器,可以在不檢查所提供文本的全部語法的情況下進(jìn)行模糊解析。在將代碼解析成一系列節(jié)點和代表節(jié)點間關(guān)系的邊后存儲在Neo4j圖數(shù)據(jù)庫,使用圖遍歷語言Gremlin設(shè)計漏洞模板進(jìn)行漏洞查找,可以識別如緩沖區(qū)溢出、整數(shù)溢出、格式化字符串漏洞和內(nèi)存泄露等。以下文給出的整數(shù)溢出的代碼樣本為例介紹每種代碼的表示形式。

AST是表示源代碼抽象語法信息的有序樹形結(jié)構(gòu),是代碼解析器用來理解程序基本結(jié)構(gòu)和檢查語法錯誤的第一個中間表示。AST是構(gòu)成許多其他代碼表示的基礎(chǔ),它忽略了解析樹包含的一些語法信息,以便能更簡潔地表示源代碼中的語法信息。圖1(a)給出了前文代碼示例的AST。從根節(jié)點開始,代碼被分解成代碼塊、語句、聲明、表達(dá)式等,內(nèi)部節(jié)點表示運算符(例如加法或賦值),葉節(jié)點表示操作數(shù)(例如常量或標(biāo)識符),有向邊表示AST的父子關(guān)系。雖然AST已被用于識別語義相似的代碼,但是無法用作進(jìn)行更深層的代碼語義分析(例如檢測未初始化的變量、未正確釋放的變量),因為這種代碼表示缺乏控制流和數(shù)據(jù)流信息。

CFG表示語句的執(zhí)行順序,描述了程序在執(zhí)行過程中所有可能遍歷的路徑以及需要滿足的條件。CFG基于AST構(gòu)建,首先要考慮結(jié)構(gòu)化控制語句如if、for和switch語句來構(gòu)建初步CFG,其次再考慮諸如goto、break和continue等非結(jié)構(gòu)化控制語句修正CFG。圖1(b)給出了前文代碼示例的CFG,流從入口節(jié)點進(jìn)入到出口節(jié)點離開,語句和條件表示成節(jié)點,有向邊表示控制的轉(zhuǎn)移和路徑的派生。CFG封裝了基本塊信息,有助于理解程序,定位程序的不可達(dá)代碼,查找循環(huán)等語法結(jié)構(gòu)。CFG已被廣泛用于各種安全應(yīng)用中,如檢測惡意程序、指導(dǎo)模糊測試等,但是CFG無法提供數(shù)據(jù)流信息,這意味著無法識別易受攻擊者影響的數(shù)據(jù)。

PDG是為了執(zhí)行程序切片縮小程序分析范圍而提出的一種圖表示,能夠明確地表示語句和謂詞間的數(shù)據(jù)依賴和控制依賴關(guān)系。通過確定定義的變量集和每個語句使用的變量集,然后計算每個語句和謂詞的可達(dá)性,可以從CFG中計算PDG的邊。圖1(c)給出了前文代碼示例的PDG:虛線C邊表示控制依賴,流向條件分支下的所有語句;實線D邊表示數(shù)據(jù)依賴,下標(biāo)表示所涉及的變量,數(shù)據(jù)依賴邊表示對該變量的后續(xù)訪問或修改。例如,變量x用于if條件和賦值語句。

圖1 代碼的圖表示

圖2 代碼屬性圖

2.2 深度學(xué)習(xí)模型

近年來,CNN被廣泛應(yīng)用于不同領(lǐng)域的模式分類中,尤其是在計算機視覺領(lǐng)域取得了革命性的突破。CNN能夠提取多尺度局部特征,但是只能對常規(guī)歐幾里得數(shù)據(jù)如圖像、文本等進(jìn)行操作。基于CNN和網(wǎng)絡(luò)嵌入的啟發(fā),Kipf等[23]提出了圖卷積網(wǎng)絡(luò)(Graph Convolutional Network, GCN)來對圖(Graph)數(shù)據(jù)進(jìn)行處理,以深入發(fā)掘其特征和規(guī)律。Gilmer等[24]立足于節(jié)點間的信息傳播和聚合,提出了GCN的通用計算框架——消息傳遞神經(jīng)網(wǎng)絡(luò)(Message Passing Neural Network, MPNN)。Schlichtkrull等[25]提出的RGCN模型是對GCN在關(guān)系圖域上的一種擴展,適用于諸如知識圖譜之類的多關(guān)系數(shù)據(jù)進(jìn)行編碼。如圖3所示,RGCN根據(jù)邊類型和方向?qū)D拆分成不同的子圖,在每個子圖上獨立地進(jìn)行信息傳播后,節(jié)點聚合來自不同子圖的結(jié)果并經(jīng)過激活函數(shù)作為下一層網(wǎng)絡(luò)的輸入,為了保留原節(jié)點信息還可以添加自環(huán)self-loop。節(jié)點在整個圖中共享參數(shù),可以并行計算同步更新。

圖3 RGCN模型

3 本文方法

本文方法的框架如圖4所示。該方法主要包括三個階段:1)提取源代碼的語法和語義信息,生成CPG;2)對圖進(jìn)行編碼,作為關(guān)系圖卷積網(wǎng)絡(luò)的輸入;3)使用RGCN對圖進(jìn)行表示學(xué)習(xí),在經(jīng)過卷積和池化進(jìn)一步提取節(jié)點特征后,聚合所有節(jié)點特征饋入全連接神經(jīng)網(wǎng)絡(luò),經(jīng)激活函數(shù)分類獲得最終的標(biāo)簽,0為無漏洞,1為有漏洞。

圖4 本文方法框架

3.1 生成CPG

本文主要考慮了69種類型的節(jié)點和5種語法語義邊。在使用Joern工具生成CPG后將解析結(jié)果以純文本形式導(dǎo)出,將節(jié)點和邊分別保存至兩個CSV文件中,節(jié)點信息包含id、節(jié)點類型(如ExpressionStatement、CallStatement等)和節(jié)點的代碼內(nèi)容、所屬函數(shù)、所處位置等字段信息;邊信息包含連接的起始節(jié)點id和邊類型等字段信息。本文考慮的不同語義語法的類型邊如表1所示。

表1 邊類型

DEF和USE邊關(guān)聯(lián)的是AST中表示符號的葉子節(jié)點與定義和使用符號的語句;REACHES邊連接具有數(shù)據(jù)依賴關(guān)系的語句節(jié)點,具有屬性var,值為所關(guān)聯(lián)的變量名;FLOWS_TO從CFGEntryNode開始,沿著所有程序可執(zhí)行路徑,一直指向CFGExitNode,具有屬性flowLabel,在相連節(jié)點為if條件語句時值為true或false,在相連節(jié)點為switch語句時,值為case值;CONTROLS邊或由CFGEntryNode指向函數(shù)中所有語句,或由Condition節(jié)點流向條件分支的所有語句。

3.2 構(gòu)造節(jié)點的初始化特征向量

算法 節(jié)點的初始化表示。

輸入 節(jié)點集;

輸出 節(jié)點的初始化特征列表。

3.3 訓(xùn)練圖神經(jīng)網(wǎng)絡(luò)

Deep Graph Library (DGL)是當(dāng)前主流的圖神經(jīng)網(wǎng)絡(luò)框架之一,提供多種圖神經(jīng)網(wǎng)絡(luò)模型與采樣方法。本文使用DGL作為圖神經(jīng)網(wǎng)絡(luò)后端,在為CPG構(gòu)造節(jié)點特征集和邊集后使用接口方法add_edge,add_node轉(zhuǎn)換成DGL的圖數(shù)據(jù)結(jié)構(gòu)DGLGraph,使用RGCN模型來學(xué)習(xí)異構(gòu)邊融合圖的聚合信息。該模型傳播公式如下:

與節(jié)點級分類任務(wù)不同,本文的漏洞檢測目標(biāo)是進(jìn)行圖級分類,在不同關(guān)系下執(zhí)行鄰域聚合過程后,將為每個節(jié)點學(xué)習(xí)到一組新的嵌入,再進(jìn)一步經(jīng)過卷積和池化提取節(jié)點特征,聚合所有節(jié)點特征饋入全連接神經(jīng)網(wǎng)絡(luò),經(jīng)激活函數(shù)分類輸出最終預(yù)測的標(biāo)簽,0為無漏洞,1為有漏洞。

4 實驗和結(jié)果分析

本文實驗運行在Google Colab云服務(wù)器上,語言環(huán)境為Python3.7,深度學(xué)習(xí)環(huán)境為Pytorch1.8.1,cuda10.1,dgl 0.4.1,gensim3.8.3。

4.1 實驗數(shù)據(jù)集

本文選用的數(shù)據(jù)集是Zhou等[28]收集和標(biāo)注的真實世界漏洞數(shù)據(jù)集,包含了2個流行且多樣化的基于C/C++的開源庫FFmpeg和Qemu。FFmpeg項目是一個包含大量用于處理視頻、音頻以及其他多媒體流文件的庫,報告的主要漏洞類型是緩存溢出。Qemu項目是一款用于執(zhí)行硬件虛擬化的模擬器,報告的主要的漏洞類型是拒絕服務(wù)(Denial of Service, DoS)、溢出引起的代碼執(zhí)行等。為了確保數(shù)據(jù)標(biāo)簽的質(zhì)量,Zhou等[28]從Github上收集項目的相關(guān)提交,首先基于與安全相關(guān)的關(guān)鍵字(如Out of bound、Overflow等)標(biāo)記與安全相關(guān)的提交,然后由四名專業(yè)安全研究人員組成的團(tuán)隊總共花費了600個工時進(jìn)行了兩輪數(shù)據(jù)標(biāo)記和交叉驗證確認(rèn)是修復(fù)漏洞的提交。最后從非漏洞修復(fù)提交中提取修改前的源碼函數(shù)作為非漏洞樣本集(Non-vul),從漏洞修復(fù)提交中提取修改前的源碼函數(shù)作為漏洞樣本集(Vul)。鑒于昂貴的人工成本并沒有對樣本集進(jìn)行漏洞分類,但從提交信息來看這些漏洞大多是與內(nèi)存有關(guān)的,如緩沖區(qū)溢出、內(nèi)存泄漏、崩潰和損壞。這兩款實現(xiàn)不同功能的開源庫,即使對于相同類型的漏洞,也往往具有不同的形式和成因,為此可以用來驗證模型的泛化能力和有效性。數(shù)據(jù)集脆弱函數(shù)樣本統(tǒng)計數(shù)據(jù)如表2所示。

表2 漏洞數(shù)據(jù)集統(tǒng)計

4.2 實驗設(shè)置與評價指標(biāo)

基于漏洞函數(shù)數(shù)據(jù)集生成圖并編碼生成實驗樣本,因為正負(fù)樣本數(shù)量接近無需作平衡處理,隨機打亂樣本并保持相同的正負(fù)樣本比例,并按照8∶1∶1的大小將樣本劃分成訓(xùn)練集、驗證集和測試集,選擇在驗證集上具有最高F1值的模型為最佳模型。學(xué)習(xí)率設(shè)置為0.001,dropout設(shè)置為0.2防止過擬合,batch size設(shè)置為128,最大epoch次數(shù)為50,patience設(shè)置為10,即如果連續(xù)10次訓(xùn)練迭代中驗證集上的F1分?jǐn)?shù)都沒有增加,則停止訓(xùn)練過程。選用Adam優(yōu)化器和交叉熵?fù)p失函數(shù)進(jìn)行有監(jiān)督學(xué)習(xí)訓(xùn)練模型。

4.3 實驗結(jié)果與討論

在先前的研究[14,29-30]中,經(jīng)典的基于詞法分析的靜態(tài)分析工具Flawfinder和具有代表性的基于深度學(xué)習(xí)的漏洞檢測方法VulDeepecker[19]被廣泛地用作基準(zhǔn)比較方法。為了驗證本文方法的有效性,與之前的研究一樣,本文也選用了Flawfinder和VulDeepecker作為基準(zhǔn)方法進(jìn)行了實驗對比。同時也選用孔維星等[20]提出的基于圖卷積模型的方法作為基準(zhǔn)進(jìn)行比較。

Flawfinder是一個簡單和快速的靜態(tài)分析器,通過掃描C/C++源代碼進(jìn)行文本匹配以查找典型易受攻擊的庫函數(shù)的調(diào)用,如有緩沖區(qū)溢出風(fēng)險的庫函數(shù)(gets、strcpy、strcat等)、容易受到字符串格式化攻擊的庫函數(shù)(sprintf、fprintf等)。然后檢查函數(shù)參數(shù)以估計風(fēng)險,并生成一個按風(fēng)險級別排序的潛在安全漏洞列表。它對于在程序發(fā)布之前快速查找和消除一些安全問題非常有用。

VulDeepecker是當(dāng)下具有代表性的基于深度學(xué)習(xí)的漏洞檢測方法,通過對與漏洞相關(guān)的庫/API調(diào)用進(jìn)行語義切片后組合成代碼小片段(code gadget),在對其進(jìn)行向量化編碼成固定長度后使用BLSTM進(jìn)行學(xué)習(xí)和分類。

孔維星等[20]使用Eclipse CDT編譯器進(jìn)行代碼圖解析,設(shè)計提取了7種關(guān)系邊。在AST上提取Child邊和Next邊,Child邊連接AST上的父子節(jié)點,Next邊按代碼順序連接AST上的葉子節(jié)點。在進(jìn)行數(shù)據(jù)流分析后提取源碼中變量間的數(shù)據(jù)依賴關(guān)系,ComputeFrom邊連接變量節(jié)點在修改時用到的其他變量節(jié)點;LastLexicalUse連接被if語句的條件節(jié)點使用的變量節(jié)點;GuardedBy連接if語句的條件節(jié)點和then語句中出現(xiàn)的變量節(jié)點;GuardedByNegation連接if語句的條件節(jié)點和else語句中出現(xiàn)的變量節(jié)點;Jump邊連接具有控制依賴關(guān)系的變量節(jié)點。在使用GCN進(jìn)行節(jié)點更新后,聚合特征饋入全連接神經(jīng)網(wǎng)絡(luò)進(jìn)行預(yù)測。

根據(jù)4.2節(jié)設(shè)置的實驗參數(shù),在開源項目FFmpeg和QEMU上進(jìn)行了實驗。考慮計算效率,刪除了節(jié)點個數(shù)超過200的樣本。經(jīng)不同方法處理后的樣本集統(tǒng)計數(shù)據(jù)如表3所示。因為文獻(xiàn)[20]的方法包含了AST上的所有分支節(jié)點和葉子節(jié)點,為此過濾了大量的樣本,而本文方法只保留了語句節(jié)點和變量節(jié)點,可以在有限的計算資源內(nèi)分析更多樣本。

表3 不同方法生成的樣本集

觀察表4可以看出,基于深度學(xué)習(xí)的漏洞檢測方法的效果都明顯優(yōu)于Flawfinder的靜態(tài)分析方法。Flawfinder方法的召回率只有14.65%,主要原因是Flawfinder是依靠專家定義規(guī)則,根據(jù)詞法分析對漏洞代碼進(jìn)行模式匹配來挖掘漏洞,定義的規(guī)則無法覆蓋復(fù)雜多變的漏洞模式,作為一個快速掃描器,在搜索潛在漏洞和估計風(fēng)險級別時不使用有關(guān)控制流或數(shù)據(jù)流等信息,為此容易漏報很多漏洞。本文方法的召回率最高可達(dá)80.27%,F(xiàn)1值也比VulDeepecker的F1值高出12%。分析原因是由于VulDeepecker在對代碼進(jìn)行了切片且對嵌入向量進(jìn)行了截斷,丟失了一些關(guān)鍵的代碼信息。

在表4中,將文獻(xiàn)[20]方法和本文方法拆分成圖編碼和圖學(xué)習(xí)模型兩部分進(jìn)行比較。其中,CDT表示文獻(xiàn)[20]的圖編碼方法,GCN表示文獻(xiàn)[20]的圖學(xué)習(xí)模型,Joern表示本文的圖編碼方法,RGCN表示本文的圖學(xué)習(xí)模型。觀察可以得出,在CDT方法生成的樣本集上,RGCN模型的F1值比GCN模型的F1值高33.55%;在Joern方法生成的樣本集上,RGCN模型的F1值比GCN模型的F1值高39.08%。可見RGCN在對不同語義邊分別學(xué)習(xí)后能有效提高漏洞檢測結(jié)果。對于圖編碼方法,Joern方法在GCN和RGCN兩種模型上的F1值比CDT高出11%和16%,可見本文圖編碼方法的有效性。本文圖編碼方法關(guān)注的節(jié)點是語句節(jié)點和對語句具有依賴的變量節(jié)點,關(guān)注的邊是語句之間的依賴邊和語句與變量之間的依賴邊。文獻(xiàn)[20]的方法包含了AST上的所有分支節(jié)點和葉子節(jié)點,保留了AST上的所有語法邊,考慮的語義邊是變量之間的依賴關(guān)系。盡管該方法的分析粒度更細(xì),但可能包含過多冗余的語法信息,反而不利于模型對于漏洞模式的學(xué)習(xí)。

圖5是本文方法和基準(zhǔn)方法的受試者工作特征(Receiver Operating Characteristic, ROC)曲線,ROC是在不同的分類閾值下,以假陽率(False Positive Rate, FPR)為橫坐標(biāo),真陽率(True Positive Rate, TPR)為縱坐標(biāo)繪制的曲線,ROC曲線與坐標(biāo)軸圍成的面積即為曲線下面積(Area Under Curve, AUC),AUC值越大表示分類器的效果越好。本文方法的AUC值為0.671,高于文獻(xiàn)[20]方法的0.548和VulDeepecker的0.586。RGCN模型在兩種圖編碼方法生成樣本集上的AUC值分別是0.671和0.618,高于GCN模型的0.525和0.548。由此可見,本文的圖編碼方法和圖學(xué)習(xí)模型在漏洞檢測方面更加有效。

表4 不同方法的性能對比 單位: %

圖5 ROC曲線

本文通過結(jié)合不同的代碼表示圖并對其進(jìn)行編碼,使用RGCN學(xué)習(xí)區(qū)分漏洞代碼和非漏洞代碼,提高了自動檢測漏洞能力。鑒于漏洞通常具有嚴(yán)重的危害性,因此較高的召回率對于模型的應(yīng)用更具有重要的意義。本文方法以函數(shù)為單位進(jìn)行檢測,但是包含漏洞的語句通常只占幾行,真實項目漏洞代碼更為復(fù)雜和多變,且訓(xùn)練的樣本數(shù)量有限,學(xué)習(xí)的參數(shù)過多,因此本文方法容易產(chǎn)生過擬合。深度學(xué)習(xí)方法的性能與網(wǎng)絡(luò)架構(gòu)和超參數(shù)有關(guān),這是一個經(jīng)驗性的任務(wù),需要進(jìn)一步優(yōu)化,以提高模型的泛化能力。此外,深度學(xué)習(xí)方法缺乏可解釋性,這給深度學(xué)習(xí)在安全方面的應(yīng)用帶來了困難。

5 結(jié)語

為了檢測源碼中的漏洞,本文提出了一種基于關(guān)系圖卷積網(wǎng)絡(luò)的自動化漏洞檢測方法。通過將程序源代碼建模成保留語法語義信息的代碼屬性圖,對節(jié)點和邊進(jìn)行編碼后使用關(guān)系圖卷積網(wǎng)絡(luò)對圖結(jié)構(gòu)進(jìn)行表示學(xué)習(xí),最后使用神經(jīng)網(wǎng)絡(luò)進(jìn)行分類預(yù)測。在真實的軟件漏洞樣本上進(jìn)行了實驗驗證,并與三種經(jīng)典的漏洞檢測方法進(jìn)行了對比,結(jié)果顯示本文方法的召回率高達(dá)80.27%,說明本文方法在自動化檢測源碼上的漏洞是非常有效的。未來將研究更細(xì)粒度的漏洞檢測方法,更精確的漏洞代碼表示方法,以及更有效的學(xué)習(xí)模型,提供除預(yù)測結(jié)果外的更豐富的輔助信息,如漏洞類型、漏洞定位等。

[1] 吳世忠,郭濤,董國偉,等. 軟件漏洞分析技術(shù)進(jìn)展[J]. 清華大學(xué)學(xué)報(自然科學(xué)版), 2012, 52(10): 1309-1319.(WU S Z, GUO T, DONG G W, et al. Software vulnerability analyses: a road map[J]. Journal of Tsinghua University (Science and Technology), 2012, 52(10): 1309-1319.)

[2] 李舟軍,張俊賢,廖湘科,等. 軟件安全漏洞檢測技術(shù)[J]. 計算機學(xué)報, 2015, 38(4): 717-732.(LI Z J, ZHANG J X, LIAO X K, et al. Survey of software vulnerability detection techniques[J]. Chinese Journal of Computers, 2015, 38(4): 717-732.)

[3] 李珍,鄒德清,王澤麗,等. 面向源代碼的軟件漏洞靜態(tài)檢測綜述[J]. 網(wǎng)絡(luò)與信息安全學(xué)報, 2019, 5(1): 1-14.(LI Z, ZOU D Q, WANG Z L, et al. Survey on static software vulnerability detection for source code[J]. Chinese Journal of Network and Information Security, 2019, 5(1): 1-14.)

[4] CADAR C, DUNBAR D, ENGLER D. KLEE: unassisted and automatic generation of high-coverage tests for complex systems programs[C]// Proceedings of the 8th USENIX Conference on Operating Systems Design and Implementation. Berkeley: USENIX Association, 2008: 209-224.

[5] CHIPOUNOV V, KUZNETSOV V, CANDEA G. S2E: a platform for in-vivo multi-path analysis of software systems[C]// Proceedings of the 16th International Conference on Architectural Support for Programming Languages and Operating Systems. New York: ACM, 2011: 265-278.

[6] BALDONI R, COPPA E, D’ELIA D C, et al. A survey of symbolic execution techniques[J]. ACM Computing Surveys, 2018, 51(3): No.50.

[7] GODEFROID P, LEVIN M Y, MOLNAR D A. Automated whitebox fuzz testing[C/OL]// Proceedings of the 2008 Network and Distributed System Security Symposium. [2021-03-14]. https://www.ndss-symposium.org/wp-content/uploads/2017/09/Automated-Whitebox-Fuzz-Testing-paper-Patrice-Godefroid.pdf.

[8] 李韻,黃辰林,王中鋒,等. 基于機器學(xué)習(xí)的軟件漏洞挖掘方法綜述[J]. 軟件學(xué)報, 2020, 31(7): 2040-2061.(LI Y, HUANG C L, WANG Z F, et al. Survey of software vulnerability mining methods based on machine learning[J]. Journal of Software, 2020, 31(7): 2040-2061.)

[9] 孫鴻宇,何遠(yuǎn),王基策,等. 人工智能技術(shù)在安全漏洞領(lǐng)域的應(yīng)用[J]. 通信學(xué)報, 2018, 39(8): 1-17.(SUN H Y, HE Y, WANG J C, et al. Application of artificial intelligence technology in the field of security vulnerability[J]. Journal on Communications, 2018, 39(8): 1-17.)

[10] SHIN Y, WILLIAMS L. Can traditional fault prediction models be used for vulnerability prediction?[J]. Empirical Software Engineering, 2013, 18(1): 25-59.

[11] YOUNIS A, MALAIYA Y, ANDERSON C, et al. To fear or not to fear that is the question: code characteristics of a vulnerable function with an existing exploit[C]// Proceedings of the 6th ACM Conference on Data and Application Security and Privacy. New York: ACM, 2016: 97-104.

[12] WALDEN J, STUCKMAN J, SCANDARIATO R. Predicting vulnerable components: software metrics vs text mining[C]// Proceedings of the IEEE 25th International Symposium on Software Reliability Engineering. Piscataway: IEEE, 2014: 23-33.

[13] SHIN Y, MENEELY A, WILLIAMS L, et al. Evaluating complexity, code churn, and developer activity metrics as indicators of software vulnerabilities[J]. IEEE Transactions on Software Engineering, 2011, 37(6): 772-787.

[14] BOSU A, CARVER J, HAFIZ M, et al. Identifying the characteristics of vulnerable code changes: an empirical study[C]// Proceedings of the 22nd ACM SIGSOFT International Symposium on Foundations of Software Engineering. New York: ACM, 2014: 257-268.

[15] 王飛雪,李芳. 基于激活漏洞能力條件的軟件漏洞自動分類框架[J]. 重慶理工大學(xué)學(xué)報(自然科學(xué)版), 2019, 33(5): 154-160.(WANG F X, LI F. Software vulnerability automatic classification framework based on activation vulnerability conditions[J]. Journal of Chongqing University of Technology (Natural Science), 2019, 33(5): 154-160.)

[16] YAMAGUCHI F, LOTTMANN M, RIECK K. Generalized vulnerability extrapolation using abstract syntax trees[C]// Proceedings of the 28th Annual Computer Security Applications Conference. New York: ACM, 2012: 359-368.

[17] RUSSELL R, KIM L, HAMILTON L, et al. Automated vulnerability detection in source code using deep representation learning[C]// Proceedings of the 17th IEEE International Conference on Machine Learning and Applications. Piscataway: IEEE, 2018: 757-762.

[18] DUAN X, WU J Z, JI S L, et al. VulSniper: focus your attention to shoot fine-grained vulnerabilities[C]// Proceedings of the 28th International Joint Conference on Artificial Intelligence. California: ijcai.org, 2019: 4665-4671.

[19] LI Z, ZOU D Q, XU S H, et al. VulDeePecker: a deep learning-based system for vulnerability detection[C/OL]// Proceedings of the 2018 Network and Distributed Systems Security Symposium. [2021-03-14]. https://www.ndss-symposium.org/wp-content/uploads/2018/02/ndss2018_03A-2_Li_paper.pdf.

[20] 孔維星,葉貴鑫,王煥廷,等.一種基于圖卷積網(wǎng)絡(luò)的源代碼漏洞檢測方法:中國, 202010168037.0[P]. 2020-07-28.(KONG W X, YE G X, WANG H T, et al. A source code vulnerability detection method based on graph convolution network: CN,202010168037.0[P]. 2020-07-28.)

[21] YAMAGUCHI F, GOLDE N, ARP D, et al. Modeling and discovering vulnerabilities with code property graphs[C]// Proceedings of the 2014 IEEE Symposium on Security and Privacy. Piscataway: IEEE, 2014: 590-604.

[22] MOONEN L. Generating robust parsers using island grammars[C]// Proceedings of the 8th Working Conference on Reverse Engineering. Piscataway: IEEE, 2001: 13-22.

[23] KIPF T N, WELLING M. Semi-supervised classification with graph convolutional networks[EB/OL]. (2017-02-22)[2021-04-14].https://arxiv.org/pdf/1609.02907.pdf.

[24] GILMER J, SCHOENHOLZ S S, RILEY P E, et al. Neural message passing for quantum chemistry[C]// Proceedings of the 34th International Conference on Machine Learning. New York: JMLR.org, 2017: 1263-1272.

[25] SCHLICHTKRULL M, KIPF T N, BLOEM P, et al. Modeling relational data with graph convolutional networks[C]// Proceedings of the 2018 European Semantic Web Conference, LNCS 10843/LNISA 10843. Cham: Springer, 2018: 593-607.

[26] LE Q, MIKOLOV T. Distributed representations of sentences and documents[C]// Proceedings of the 31st International Conference on Machine Learning. New York: JMLR.org, 2014: 1188-1196.

[27] ISPIROVA G, EFTIMOV T, SELJAK B K. Comparing semantic and nutrient value similarities of recipes[C]// Proceedings of the 2019 IEEE International Conference on Big Data. Piscataway: IEEE, 2019: 5131-5139.

[28] ZHOU Y Q, LIU S Q, SIOW J, et al.: effective vulnerability identification by learning comprehensive program semantics via graph neural networks[C/OL]// Proceedings of the 33rd Conference on Neural Information Processing Systems. [2021-01-12].https://proceedings.neurips.cc/paper/2019/file/49265d2447bc3bbfe9e76306ce40a31f-Paper.pdf.

[29] ZOU D Q, WANG S J, XU S H, et al.VulDeePecker: a deep learning-based system for multiclass vulnerability detection[J]. IEEE Transactions on Dependable and Secure Computing, 2021, 18(5): 2224-2236.

[30] LI Z, ZOU D Q, XU S H, et al. SySeVR: a framework for using deep learning to detect software vulnerabilities[J]. IEEE Transactions on Dependable and Secure Computing, 2021(Early Access): 3051525.

Source code vulnerability detection based on relational graph convolution network

WEN Min1,2, WANG Rongcun1,2,3*, JIANG Shujuan1,2

(1,(),221116,;2,,221116,;3,(),211106,)

The root cause of software security lies in the source code developed by software developers, but with the continues increasing size and complexity of software, it is costly and difficult to perform vulnerability detection only manually, while the existing code analysis tools have high false positive rate and false negative rate. Therefore, an automatic vulnerability detection method based on Relational Graph Convolution Network (RGCN) was proposed to further improve the accuracy of vulnerability detection. Firstly, the program source code was transformed into CPG containing syntax and semantic information. Then, representation learning was performed to the graph structure by RGCN. Finally, a neural network model was trained to predict the vulnerabilities in the program source code. To verify the effectiveness of the proposed method, an experimental validation was conducted on the real-world software vulnerability samples, and the results show that the recall and F1-measure of vulnerability detection results of the proposed method reach 80.27% and 63.78% respectively. Compared with Flawfinder, VulDeepecker and similar method based on Graph Convolution Network (GCN), the proposed method has the F1-measure increased by 182%, 12% and 55% respectively. It can be seen that the proposed method can effectively improve the vulnerability detection capability.

vulnerability detection; Code Property Graph (CPG); Relational Graph Convolution Network (RGCN); deep learning; prediction model

This work is partially supported by National Natural Science Foundation of China (61673384,618761860), Natural Science Foundation of Jiangsu Province (BK20181353), Open Fund of Key Laboratory of Safety-Critical Software, Ministry of Industry and Information Technology (1015-56XCA18164).

WEN Min, born in 1996, M. S. candidate. Her research interests include vulnerability detection.

WANG Rongcun, born in 1979, Ph. D., associate professor. His research interests include software safety analysis, software testing, software maintenance.

JIANG Shujuan, born in 1966, Ph. D., professor. Her research interests include software analysis and testing, compilation technology.

TP311

A

1001-9081(2022)06-1814-08

10.11772/j.issn.1001-9081.2021091691

2021?09?29;

2021?11?16;

2021?11?17。

國家自然科學(xué)基金資助項目(61673384, 618761860);江蘇省自然科學(xué)基金資助項目(BK20181353);高安全系統(tǒng)的軟件開發(fā)與驗證技術(shù)工業(yè)和信息化部重點實驗室開放基金資助項目(1015-56XCA18164)。

文敏(1996—),女,湖南邵東人,碩士研究生,主要研究方向:漏洞檢測;王榮存(1979—),男,山東夏津人,副教授,博士,CCF會員,主要研究方向:軟件安全分析、軟件測試、軟件維護(hù);姜淑娟(1966—),女,山東萊陽人,教授,博士,CCF會員,主要研究方向:軟件分析與測試、編譯技術(shù)。

猜你喜歡
檢測方法模型
一半模型
“不等式”檢測題
“一元一次不等式”檢測題
“一元一次不等式組”檢測題
重要模型『一線三等角』
重尾非線性自回歸模型自加權(quán)M-估計的漸近分布
3D打印中的模型分割與打包
小波變換在PCB缺陷檢測中的應(yīng)用
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
主站蜘蛛池模板: 91探花在线观看国产最新| 国产导航在线| 国产色婷婷视频在线观看| 99久视频| 亚洲精品日产精品乱码不卡| 国产在线自乱拍播放| 亚洲第一成网站| 久久免费成人| 久草网视频在线| 制服丝袜 91视频| 国产成人乱无码视频| 97国产精品视频自在拍| 欧美成人一区午夜福利在线| 日韩小视频在线观看| 无码精品国产VA在线观看DVD| 亚洲水蜜桃久久综合网站| 国产AV无码专区亚洲精品网站| 欧美啪啪一区| 在线va视频| AⅤ色综合久久天堂AV色综合| 国产浮力第一页永久地址| 国产又黄又硬又粗| 国产一区二区免费播放| 免费一级成人毛片| 在线视频亚洲色图| 亚洲人成网站18禁动漫无码 | 中文字幕人妻av一区二区| 日韩福利在线观看| 国产视频久久久久| 久996视频精品免费观看| 亚洲av无码人妻| 91九色国产在线| 自偷自拍三级全三级视频| 69av在线| 欧美自慰一级看片免费| 国产精品露脸视频| 亚洲色图欧美视频| av一区二区无码在线| 成人无码一区二区三区视频在线观看| 高清色本在线www| 午夜啪啪福利| 中文精品久久久久国产网址| 不卡午夜视频| 欧美97色| 精品免费在线视频| 在线观看精品自拍视频| 欧美成人怡春院在线激情| 国产男女免费视频| 国产一区成人| 香蕉久人久人青草青草| 久久夜色精品国产嚕嚕亚洲av| 四虎永久在线| 青草91视频免费观看| 久久午夜夜伦鲁鲁片无码免费| 在线观看免费国产| 国产精品成人啪精品视频| 精品国产一二三区| 日韩精品专区免费无码aⅴ| 亚洲一级色| 91九色最新地址| 少妇被粗大的猛烈进出免费视频| 五月婷婷丁香综合| 久久精品免费国产大片| 国产性精品| 一区二区三区四区日韩| 久久人人妻人人爽人人卡片av| 欧美一级视频免费| 亚洲国产清纯| 免费激情网站| 国产精品lululu在线观看| 国内精品小视频在线| 午夜国产精品视频| 亚洲人网站| 日本亚洲最大的色成网站www| 91成人试看福利体验区| 亚洲精品在线影院| 小蝌蚪亚洲精品国产| 全部毛片免费看| 青青草国产精品久久久久| 91成人在线免费观看| 亚洲精品视频免费看| 国产第四页|