A Deep Learning-Based System for Vulnerability Detection(二)


  接着上一篇,這篇研究實驗和結果。

A.用於評估漏洞檢測系統的指標

TP:為正確檢測到漏洞的樣本數量

FP:為檢測到虛假漏洞樣本的數量(誤報)

FN:為未檢真實漏洞的樣本數量(漏報)

TN:未檢測到漏洞樣本的數量

  這篇文獻廣泛使用指標假陽性率(FPR),假陰性率(FNR),真陽性率或者召回率(TPR),精確度(P)和F1-measure來評估漏洞檢測系統[39]。

FPR=FP/(FP+TN)指標衡量的是假陽性率漏洞占不容易受到攻擊的整個群體樣本的比例(在非脆弱樣本中誤報比率);

FNR=FN/(TP+FN)指標衡量的是假陰性率漏洞與整個樣本脆弱群體的比例(在脆弱樣本中的漏報比率);

TPR=TP/(TP+FN)指標衡量的是真正檢測到脆弱的樣本在樣本脆弱群體中的比例(TPR=1-FNR);

P=TP/(TP+FP)指標衡量的是正確性;

F1=2*P*TPR/(P+TPR)指標兼顧了精確度和真實陽性率。

  檢測系統既不漏報(FNR=0)也不誤報(FPR=0)以及正確率極高接近1,這是理想情況,現實實踐中是不可能的。只可能的是盡量的降低FNR和FPR。

B.准備VulDeePecker的輸入

收集數據  NIST維護的漏洞數據庫有兩個廣泛使用的來源:包含生產軟件漏洞的NVD[10]和包含生成,合成和學術安全漏洞或漏洞的SARD項目[12]。在NVD中,每個漏洞都有一個唯一的公共漏洞和標識符(CVE ID)和一個公共的弱點枚舉標識符(CWE ID),該標識符指示着所涉漏洞的類型。在本篇文獻中,關注兩種類型的漏洞:緩沖區錯誤(CWE-119)和資源管理錯誤(CWE-399),其中每一個都有許多子類型。這些漏洞非常常見,這意味着可以收集足夠的數據來可進行深度學習。本片文獻選擇了19個流行的C/C++開源產品,包括Linux內核,Firefox,Thunderbird,Seamonkey,Firefox esr,Thunderbird esr,Wireshark,FFmpeg,Apache Http Server,Xen,OpenSSL,Qemu,Libav,Asterisk, Cups,Freetype, Gnutls,Libvirt,VLC media player。根據NVD,還在SARD中收集了包含這兩種漏洞的C/C++程序。總共從NVD收集了520個有關緩沖區漏洞相關的程序,320個與資源管理錯誤漏洞相關的程序。還從SARD收集了8112個關於緩沖區錯誤的程序(測試用例)以及1729個資源管理錯誤相關的程序,實際上,包含漏洞的程序包含多個程序文件。

訓練程序 vs 目標程序   本篇文章隨機地選擇80%的程序作為訓練程序剩下的20%作為目標程序,當在處理一種或者同時兩種類型漏洞時這種比例是相對比較平等適用的。

C.學習BLSTM神經網絡

這階段對應着系統VulDeePecker的學習階段。作者使用Theano[24]和keras[8]在Python中實現了BLSTM神經網絡。

第一步:提取函數調用和相應的程序片段。從程序中提取C/C++庫/API函數調用,有6045個C/C++庫/API函數調用,包括標准庫函數調用[1],基本的Windows API和Linux內核API函數調用[9],[13]。總共從程序中提取了56902個庫/API函數調用,包括7255個正向函數調用和49647個反向函數調用。

第二步:1.生成代碼小部件

  代碼小部件由程序片段生成,利用訓練程序的程序片段生成的48744個代碼小部件和目標程序的程序片段生成的12894個代碼小部件獲得了一個有關61638個代碼小部件的的數據庫(Code Gadget Database)。生成代碼小部件的時間復雜度主要依賴於數據流分析工具,例如,從SARD中隨機選擇100個程序(99232行語句)生成2494個代碼需要花費883秒,這意味着每個代碼小部件的生成平均需要354毫秒。基於效率的考慮,使用CGD(前面提到的代碼小部件的數據庫)總結出了以下6個數據集。

·BE-ALL:CGD的子集,針對緩沖區錯誤漏洞(CWE-119)和所有的庫/API函數調用。

·RM-ALL:CGD的子集,針對資源管理錯誤漏洞(CWE-399)和所有的庫/API函數調用。

·HY-ALL:和CGD一樣,針對前面兩種錯誤漏洞和所有的庫/API函數調用。

·BE-SEL:CGD的子集,針對緩沖區錯誤漏洞(CWE-119)和手動選擇的函數調用(而不是所有的函數調用)。

·RM-SEL:CGD的子集,針對資源管理錯誤漏洞(CWE-399)和手動選擇的函數調用(而不是所有的函數調用)。

·HY-SEL:和CGD一樣,針對前面兩種錯誤漏洞和手動選擇的函數調用(而不是所有的函數調用)。

2.給代碼小部件做標記

  對於從NVD程序中提取的代碼小部件,着重關注於涉及到行刪除或修改的被打補丁的漏洞。這個過程有兩個步驟:第一步,如果一個代碼小部件至少有一行語句通過補丁形式被刪除或者修改,那么會被自動標注為“1”(脆弱的,存在安全隱患),否則,標注為“0”(安全的)。然而,這種自動標注過程會誤標注一些代碼小部件(不是脆弱的被標注為“1”),為了改善這種誤標注,第二步,手動去檢查這些標記為“1”的代碼小部件,去糾正錯誤標注(如果有的話)。

  對於從與SARD有關的程序中提取的代碼小部件,,由於每個在SARD中的程序都已經被分別標注為"good"(沒有安全缺陷),“bad”(包含安全缺陷),“mixed”(包含有安全缺陷的函數和修補以后的版本)。所以從帶有“good”標簽的程序提取的代碼小部件標注為“0”(安全的),從帶有“bad”或者“mixed”標簽的程序提取的,代碼小部件至少包含一行脆弱的語句,那么該代碼小部件標記為“1”,否則為“0”。由於在SARD程序的標簽中使用了啟發式方法,查看了1000個隨機代碼小部件的標簽,發現只有6個(0.6%)小部件誤標注了,這是由於不容易受到攻擊的代碼段中的語句與容易受到攻擊的代碼段中的語句是相同的。由於誤標注的代碼小部件非常少,並且神經網絡對於一小部分標記錯誤的樣本具有健壯性,因此不需要人工手動檢查SARD程序提取的代碼小部件的所有標簽。

  可能會遇到代碼小部件同時被標記為“1”和“0”,這種情況是由於數據流分析工具的不完善造成的,本篇文獻的做法是將這些代碼小部件刪除即可。

第三步:將代碼小部件轉換為向量

  CGD總共包含6166401個標記,其中23464個是不同的,當將用戶自定義的函數名稱和變量名映射成符號之后,不同的標記進一步減少到10480個。將這些符號表示被編碼成向量后,作為訓練一個BLSTM神經網絡的輸入。

第四步:訓練BLSTM神經網絡

  對於表中描述的每個數據集,作者采用10倍交叉驗證的方法訓練BLSTM神經網絡,並選擇與有效性相對應的最佳參數值進行漏洞檢測。例如。作者改變每個BLSTM神經網絡的隱藏層數,觀察對結果F1-measure的影響。當調整隱藏層的數量時,當參數的默認值可用時,設置參數為其默認值以及將這些參數設置為深度學習社區廣泛使用的值。有關代碼小部件的向量表示的標志數目(tokens)設置為50個,dropout設置為0.5,batch size設置為64,epochs設置為4,ADAMAX的minibatch隨機梯度下降法(這部分我不熟悉,所以語言組織難免出錯),選擇300個隱藏節點,采用默認的學習率1.0來進行訓練。

  上圖繪制了VulDeePecker相對於6個數據集用不同的數量的隱藏層數,每一個數據集導致了不同的神經網絡,觀察到6個BLSTM神經網絡的F1-measure在隱藏層數的個數為2-3時達到最大,當層數大於6時,這些BLSTM神經網絡的大多數F1-measure會下降。BLSTM神經網絡的其他參數可以以類似的方式進行調優。

D.實驗結果與意義

  為了測試VulDeePecker是否可以應用於多種類型的漏洞,作者在三個數據集上進行了實驗:BE-ALL,RM-ALL,HY-ALL,這分別導致了三種神經網絡,其有效性如下表所示:

經結果分析得:

1.VulDeePecker可以同時檢測多種類型的漏洞,但是其有效性取決於與漏洞相關的庫/API函數調用的數量(即越少越好)。

2.可以利用人工專業知識來選擇庫/API函數調用來提高VulDeePecker的有效性,尤其是F1-measure中的整體效率。

3.利用數據流分析的優勢基於深度學習的漏洞檢測系統會更加有效。

4.VulDeePecker比基於代碼相似性的漏洞檢測系統更有效,后者無法檢測出不是由於代碼克隆引起的漏洞,因此,經常導致漏報,然而VulDeePecker的高效性體現在對大量的數據很敏感,這是一種深度學習的固有性質。

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM