























摘要:目前的源代碼漏洞檢測方法大多僅依靠單一特征進行檢測,表征的維度單一導致方法效率低,針對上述問題提出一種基于結構化文本及代碼度量的漏洞檢測方法,在函數級粒度進行漏洞檢測.利用源代碼結構化文本信息及代碼度量結果作為特征,通過構造基于自注意力機制的神經網絡捕獲結構化文本信息中的長期依賴關系,以擬合結構化文本和漏洞存在之間的聯系并轉化為漏洞存在的概率.采用深度神經網絡對代碼度量的結果進行特征學習以擬合代碼度量值與漏洞存在的關系,并將其擬合的結果轉化為漏洞存在的概率.采用支持向量機對由上述兩種表征方式獲得的漏洞存在概率做進一步的決策分類并獲得漏洞檢測的最終結果,為驗證該方法的漏洞檢測性能,針對存在不同類型漏洞的11種源代碼樣本進行漏洞檢測實驗,該方法對每種漏洞的平均檢測準確率為97.96%,與現有基于單一表征的漏洞檢測方法相比,該方法的檢測準確率提高了4.89%~12.21%,同時,該方法的漏報率和誤報率均保持在10%以內.
關鍵詞:漏洞檢測;結構化表征;抽象語法樹;代碼度量;深度神經網絡
中圖分類號:TP393文獻標志碼:A
Vulnerability Detection Method Based on Structured Text and Code Metrics
YANG Hongyu" YING Leyi ZHANG Liang3
(1. College of Safety Science and Engineering,Civil Aviation University of China,Tianjin 300300,China;
2. College of Computer Science and Technology,Civil Aviation University of China,Tianjin 300300,China;
3. College of Information,University of Arizona,AZ 8572 USA)
Abstract:Most of the current source code vulnerability detection methods only rely on a single feature,and the single dimension of characterization results in inefficient methods. To address the above issues,a vulnerability detection method based on structured text and code metrics is proposed to detect vulnerabilities at the function-level granularity. Using source code structured text information and code metrics as features,long-term dependencies in structured text information are captured by constructing a self-attention based neural network to fit the relationship between structured text and the existence of vulnerabilities and translate them into the probability of vulnerabilities. The deep neural network is used to learn the characteristics of the results of code metrics to fit the relationship between code metrics and the existence of vulnerabilities,and the fitted results are transformed into the probability of vulnerabilities. Support Vector Machine (SVM)is used to further classify the probabilities of vulnerabilities obtained by the above two representations and obtain the final results of vulnerability detection. To verify the vulnerability detection performance of this method,11 source code samples with different types of vulnerabilities are tested. The average detection accuracy of this method for each vulnerability is 97.96%. Compared with the existing vulnerability detection methods based on a single representation,this method improves the detection accuracy by 4.89%~12.21%,and at the same time. the 1 positive and 1 negative rates of this method are kept within 10%.
Key words:vulnerability detection;structured representation;abstract syntax tree;code metrics;deep neural network
計算機軟件在各個領域的廣泛應用,使得軟件漏洞問題也日益嚴重.面對多樣化的軟件漏洞類型,如何高效地進行漏洞檢測成為當前研究的熱點問題.對源代碼進行漏洞檢測是保障軟件安全的有效手段之一.目前,基于代碼度量和基于深度學習的方法是較為常見的源代碼漏洞檢測方法[1].
代碼度量[2]被用于描述軟件代碼特性,以相關定義的數值來描述代碼的基本狀況.代碼度量雖然是一種粗粒度的源代碼表征方式,但是在一定程度上可以表征代碼的基本狀況.基于代碼度量的漏洞檢測方法通過源代碼度量工具對目標代碼進行代碼度量獲取對應指標的數值,利用機器學習算法,經過訓練生成漏洞檢測器.Ferenc等[3]基于代碼度量應用機器學習算法和網格搜索算法構建漏洞檢測模型并采用重采樣策略解決訓練數據不平衡問題.Sultana[4]利用機器學習和統計學方法追蹤代碼度量、代碼模式和漏洞之間的聯系,提出一種漏洞檢測方法,并利用該方法對開源軟件進行漏洞檢測.基于代碼度量的漏洞檢測方法的主要不足是:①檢測粒度粗且可解釋性差;②精確率低且誤報率高.
隨著深度學習在自然語言處理領域的應用,研究人員嘗試將深度學習技術應用于編程語言.當前深度學習技術已經普遍應用于信息安全領域[5],基于深度學習的漏洞檢測方法能夠自主學習代碼文本信息與漏洞之間的關聯性以此建立漏洞檢測模型.Li 等⑹首次將深度學習技術引入漏洞檢測領域,提出一種VulDeePecker自動化漏洞檢測系統,能夠對C/C++語言編寫的源代碼進行漏洞檢測.Saccente等[7]提出Achilles漏洞檢測方法,在Java源代碼上進行測試并取得不錯的效果,表明基于深度學習的源代碼漏洞檢測方法能夠應用于多種編程語言.上述兩種方法將源代碼完全視為線性文本,無法充分表征源代碼特征.為更加充分表征編程語言的語法和語義,結構化表征方式被應用于源代碼的表征.陳肇炫等[8]提出一種基于結構化表征的智能化漏洞檢測系統Astor,在復雜且語法豐富的數據集中,檢測效果優于線性表征方法.基于深度學習的漏洞檢測方法能夠完全脫離人工干預進行漏洞檢測,但仍存在不足.基于深度學習的漏洞檢測方法的主要不足有:①需要依賴大量數據進行訓練;②對不同類型漏洞的檢測結果波動性較大;③精確率和召回率有待提升.
針對計算機軟件二進制代碼的漏洞檢測技術是一種底層的漏洞檢測技術.當無法獲取軟件高級語言源代碼時,文獻[9]將反編譯軟件二進制代碼作為特征,應用深度學習技術進行特征學習并構造漏洞檢測模型,得到了較好的檢測性能.文獻[10]通過計算二進制函數和漏洞二進制函數特征庫的相似度進行漏洞檢測,該方法通過大量的訓練后的模型準確率得到提升.文獻[11]在經典代碼切片技術的基礎上改善二進制代碼過程間切片方式及切片粒度,使得檢測精度和效率有所提升.在無法獲取源代碼的情況下,利用二進制代碼依舊可以進行漏洞檢測并且有較好的檢測能力.但是基于二進制代碼的檢測方法并不直觀且表征方式單一.
上述工作在源代碼表征方式上,均采用了單一的表征方式,無法全面表征源代碼,因此導致檢測效果不佳.針對上述檢測方法表征方式單一導致檢測效果不佳的問題,為進一步提升漏洞檢測效果,本文提出一種基于結構化文本及代碼度量的漏洞檢測方法,在現有研究的基礎上從表征方法和特征擬合兩個方面做出改進,在函數級粒度上對源代碼進行漏洞檢測.首先,深度優先遍歷源代碼抽象語法樹得到結構化文本信息,使用源代碼靜態解析工具獲取代碼度量值;其次,通過構造基于自注意力機制的神經網絡捕獲結構化文本信息中的長期依賴關系,以擬合結構化文本和漏洞存在之間的聯系并轉化為漏洞存在的概率,采用深度神經網絡對代碼度量的結果進行特征學習以擬合代碼度量值與漏洞存在的關系,并將其擬合的結果轉化為漏洞存在的概率;最后,采用支持向量機對由上述兩種表征方式獲得的漏洞存在概率做進一步的決策分類,并獲得漏洞檢測的最終結果.在對比實驗中,針對存在不同類型漏洞的11種源代碼樣本進行漏洞檢測實驗,本文方法對每種漏洞的平均檢測準確率為97.96%.與現有基于單一表征的漏洞檢測方法相比,本文方法的檢測準確率提高了4.89%~12.21%,同時,本文方法的漏報率和誤報率均保持在10%以內.
1源代碼漏洞檢測方法設計
1.1方法設計思路
本文方法從結構化文本信息和代碼度量兩個維度對源代碼進行表征,利用表征結果和預設的標簽對構造的神經網絡進行訓練.訓練完成的神經網絡模型即為漏洞檢測模型,應用漏洞檢測模型對待檢測源代碼進行漏洞檢測得到檢測結果.本文方法中4個部分的設計思路如下.
1)數據預處理.為生成符合本文漏洞檢測粒度的訓練集和測試集,在本階段對原始數據集以函數級粒度進行切片并設置監督學習標簽.預處理階段的輸出為代碼的函數切片以及對應的監督學習標簽.
2)數據表征.為充分表現源代碼特征,從結構化文本信息和代碼度量兩個維度對預處理后的數據進行表征.為從源代碼結構化文本信息角度表征源代碼,利用AST作為中間載體,采用深度優先遍歷機制收集源代碼文本特征并轉化為向量形式;為從代碼度量角度表征源代碼,需要定義代碼度量指標,通過源代碼靜態解析工具獲取對應的度量值.本階段的輸出為向量形式的結構化文本信息以及代碼度量值序列.
3)模型構建及訓練.為擬合數據表征的結果和漏洞存在之間的關系,構建合適的神經網絡模型對表征結果進行特征學習.構建的神經網絡模型能對結構化文本信息和代碼度量值進行特征學習,綜合兩種特征給出漏洞檢測結果.最后,采用表征結果和預設的標簽對模型進行訓練,本階段的輸出為訓練完成的漏洞檢測模型.
4)源代碼漏洞檢測.為在本階段應用訓練完成的模型進行漏洞檢測,對待檢測源代碼進行特征提取,提取特征的方式與表征方式相同.將提取到的特征輸入訓練完成的模型中,輸出漏洞檢測的結果.
1.2方法架構設計
本文提出的源代碼漏洞檢測模型由數據預處理、數據表征、模型搭建及訓練、源代碼漏洞檢測4個部分組成,該方法的核心框架如圖1所示.該漏洞檢測模型的4個部分的主要處理過程為
1)數據預處理.數據預處理階段包括代碼切片和設置監督學習標簽兩個部分.本文方法在函數級粒度進行漏洞檢測,因此需將源代碼數據切分為函數片段并根據函數片段是否存在漏洞設置標簽.
2)數據表征.為充分表征函數片段的信息,分別從結構化文本信息和代碼度量兩種維度對預處理后的數據進行表征.利用抽象語法樹(Abstract Syntax Tree,AST)表征函數片段的文本信息.定義代碼度量指標對函數片段進行代碼度量.
3)模型構建及訓練.構建一種神經網絡,由該神經網絡針對兩種維度表征結果的數據類型進行特征學習,利用兩種表征結果以及預設的標簽對神經網絡進行訓練以構造漏洞檢測模型.
4)源代碼漏洞檢測.利用訓練完成的漏洞檢測模型對待檢測源代碼進行漏洞檢測.待檢測源代碼的預處理和表征方式與訓練數據相同,將表征結果輸入訓練完成的漏洞檢測模型得到檢測結果.
2數據處理及表征
2.1數據預處理
本文采用的數據集為美國國家標準與技術研究院的Juliet Test Suite數據集[12],該數據集包含118種CWE[13]類型的28 881個Java文件.由于基于深度學習的方法對于數據量的需求較大,所以在研究中選取測試用例超過1 000例的漏洞類型.雖然在本文研究中以Java語言源代碼作為研究對象,但本文方法并不受編程語言類型限制,只要被檢測程序的源代碼能夠進行結構化表征和代碼度量,本文方法依然適用.
為生成符合本文檢測粒度的訓練集和測試集,需要對收集的數據進行預處理.數據預處理階段包括代碼切片和監督學習標簽設置兩部分.
2.1.1代碼切片
本文方法的檢測粒度是函數級別,所以對需要表征的源代碼按函數進行切片.漏洞源代碼用例如表1所示.
代碼切片可以從Java文件中分離出不含空行和注釋的函數代碼,代碼切片的具體過程如下.
1)源代碼清洗.為提升源代碼的信息密度,防止無用信息被表征,以字符串匹配的方式消除代碼中的空行和注釋.
2)函數切片.利用Java靜態解析工具Javalang[14]解析Java源文件獲得類中包含的所有函數并存儲在列表中.
2.1.2監督學習標簽設置
判斷源代碼函數是否存在漏洞是一個典型的二分類問題.本文針對漏洞檢測設計的神經網絡是一個二分類監督學習模型,因此需要對訓練數據設置標簽.
Juliet Test Suite數據集中,已經在函數名稱上標注了標記“good”(無漏洞)或“bad”(有漏洞).采用字符匹配的方法匹配函數名稱中的標記,標記為“good”的函數片段設置標簽為“0”,標記為“bad”的函數片段設置標簽為“1”.由于函數名稱也會作為文本信息被表征,為了不使上述標記影響模型的訓練效果,依據標記添加標簽后,將其用隨機字符替代.
2.2數據表征
為充分表現源代碼特征,從代碼結構化表征和代碼度量兩個不同維度對源代碼進行表征.代碼結構化表征可以獲得代碼結構化的文本信息,代碼度量能夠表征代碼的基本狀況.
2.2.1代碼結構化表征
編程語言是一種結構化的語言,源代碼中的信息有明確的結構關系.因此表征自然語言的方法并不能充分表征源代碼中的語法和語義.為了得到更貼合實際的源代碼特征,采用結構化表征方法對源代碼進行表征.結構化表征方法包括以下三個步驟.
步驟1:利用Java源代碼解析工具javalang解析代碼,得到抽象語法樹節點和邊的信息,根據節點和邊的信息生成抽象語法樹.
步驟2:深度優先遍歷抽象語法樹,依次收集節點信息.深度優先遍歷抽象語法樹的結果使得樹形數據轉化為一維文本數據.
步驟3:將一維文本數據轉化為神經網絡的輸入.由于神經網絡的輸入是向量形式的數據,因此需要進一步處理一維的文本數據.首先對文本數據作分詞處理,然后通過統計方法生成詞典,根據詞典將文本表示為向量.
2.2.2代碼度量
本文方法旨在對函數級別的源代碼進行漏洞檢測,因此需要在代碼函數級別上進行度量.為使完全依賴數據的深度學習方法能與安全專家的先驗知識進行有效交互,并使檢測模型的自適應性更強,在代碼度量中需要人工參與定義代碼度量指標.本文方法中的代碼度量處理過程包括2個步驟.
步驟1:度量指標定義.對代碼度量的指標進行定義,在代碼度量階段使用的主要度量指標是Chidamberamp;Kemerer指標[15],與傳統的McCabe指標和Halstead metrics 指標相比,Chidamberamp;Kemerer指標是專門針對面向對象程序語言提出的,故對Java語言的適應性更強.具體的度量指標如表2所示,其中包含函數和函數所在類的相關信息.
步驟2:代碼度量.使用代碼度量工具[16]進行代碼度量可得到表2所示指標的具體量化數值.
3深度神經網絡的構建與訓練
3.1神經網絡總體框架
對源代碼的表征結果分別為結構化的文本信息和代碼度量產生的數字序列.因此需要設計神經網絡對結構化文本信息和數字序列進行特征學習,并綜合二者判斷結果給出最終的漏洞檢測結果.
在本文方法中構建的神經網絡模型有三個部分:①基于自注意力(Self-Attention,SA)機制[17]的神經網絡;②深度神經網絡(Deep Neural Networks,DNN);③支持向量機(Support Vector Machine,SVM).該神經網絡的主要結構如圖2所示.
其中,基于SA的神經網絡模型用于文本序列的特征學習,DNN模型用于代碼度量結果的特征學習,SVM模型用于對上述兩個模型的輸出結果進行處理和分類并得到最終的漏洞檢測結果.
3.2基于SA機制的神經網絡模型構建
分析文本數據最重要的目的是捕獲其中的長期依賴關系,這種依賴關系在編程語言中尤為關鍵.受自然語言語法和人類文字編輯習慣的影響,自然語言中的依賴關系在時間跨度上是有限的.但是這種依賴關系在編程語言中的時間跨度是不受控制的,例如定義的變量或函數,在代碼中的任意位置都可能被調用.因此在對源代碼結構化文本漏洞檢測時,通過SA機制解決依賴問題.
SA結構如圖3所示,對于每一個輸入的詞向量xi,SA將其表示為向量qi、ki、vi.為獲取這3個向量,分別定義3個不同的權值矩陣WQ、WK、WV,這3個矩陣在訓練階段通過反向傳播算法不斷更新優化.將權值矩陣與輸入矩陣X=[x x x …,xn]相乘來獲得對應的向量集和,計算方式如公式(1)~公式(3)所示.
式中:X為輸入詞向量X組成的矩陣,WQ為對應的權值矩陣,Q是由向量qi組成的矩陣.
式中:X為輸入詞向量xi組成的矩陣,WK為對應的權值矩陣,K是由向量ki組成的矩陣.
式中:X為輸入詞向量xi組成的矩陣,WV為對應的權值矩陣,V是由向量vi組成的矩陣.
SA的計算結果為:
式中:dk為尺度標度,與向量qi的維度相等;Q、K、V分別為公式(1)~公式(3)的計算結果,是輸入矩陣X的三種不同的表示形式.
在公式(4)中,Q和K相乘的結果用于反映每個詞與其他詞的相關程度,但是這個結果會隨著詞向量維度的增加而不斷增大.如果Q和K相乘的結果非常大,會造成softmax結果無限接近 會使得梯度較小,從而影響參數的更新.因此需要利用dk約束計算結果的大小.softmax能夠計算詞與詞的關聯程度在句子中的比重,softmax的結果再與V相乘,相當于一個加權求和的結果,這個結果可以反映每個詞對于句子的貢獻程度.在本文研究中,這個貢獻程度表示這個詞與漏洞存在的關聯程度.
本文構建的基于SA的神經網絡由輸入層、SA層、全連接層、輸出層構成,其中全連接層由128個神經元組成.由于SA中的計算都是線性計算,加入全連接層以擬合非線性特征.為通過文本特征得到漏洞存在的概率,輸出層以Sigmoid作為激活函數. Sigmoid函數如公式(5)所示.
Sigmoid函數能將神經網絡的輸出映射到[0,1] 之間,能將學習到的文本特征轉化為漏洞存在的概率.通過源代碼結構化表征結果和預設的標簽對基于SA的神經網絡進行訓練,在訓練完成的神經網絡中輸入源代碼結構化文本信息,即可輸出對應源代碼存在漏洞的概率.
3.3DNN模型構建
代碼度量的結果是一段數字序列,序列中的每個元素表示對應度量指標的具體數值,并且度量結果各個元素之間不存在相互依賴關系.基于上述應用場景,DNN相較于傳統機器學習算法能夠在較短的時間內學習到序列特征.因此應用DNN進行代碼度量的特征學習,其結構如圖4所示,隱藏層的神經元個數均為64.
對輸入的代碼度量結果,在經過兩層隱藏層擬合代碼度量特征后,利用Sigmoid函數作為激活函數將輸出結果映射到[0,1]之間.利用代碼度量結果和預設的標簽對DNN進行訓練,在訓練完成的DNN模型中輸入代碼度量結果即可輸出對應源代碼存在漏洞的概率.
3.4SVM模型構建
本文漏洞檢測模型以學習文本序列特征的基于SA的神經網絡和學習代碼度量特征的DNN為基礎構建.在完成上述模型的訓練后,能夠應用這兩種模型分別從文本信息和代碼度量兩個維度判斷代碼是否存在漏洞.為得到更加精確的漏洞檢測結果,需要綜合上述兩種模型的輸出結果.因此本文以上述兩種模型的輸出作為特征,應用SVM作進一步分類,判斷代碼是否存在漏洞.
在獲取兩種模型輸出的漏洞存在概率后,需要應用分類算法對輸出進行分類以盡可能消除兩種表征方式判斷出現分歧的部分.因此,在應用分類算法后,檢測效果會得到明顯提升.
選擇SVM作為這一階段的分類器主要有以下兩個原因:①SVM在分類任務中效果好,并且分類思想簡單直觀,能夠準確繪制其決策邊界,以直觀表現本文方法的可行性;②分類方式靈活,可以通過調整其核函數進行線性分類和非線性分類.由于無法提前判斷兩種模型的輸出是否是線性可分的,SVM的分類方式相較于其他分類算法更加適合作為本階段的分類器.
常規的SVM通過繪制最大間隔的超平面進行分類,但這種方法無法進行非線性分類.由于基于SA 的神經網絡和DNN的輸出結果可能出現線性不可分的情況,設置SVM的核函數以進行非線性分類.本方法構建的SVM模型利用線性核(linear)、多項式核(poly)和高斯核(rbf)對基于SA的神經網絡和DNN 的輸出結果進行分類.在訓練完成的SVM模型中,輸入基于SA的神經網絡和DNN輸出的漏洞存在概率,輸出漏洞檢測的最終結果.
4實驗設計及結果分析
4.1評價指標
本文采用準確率、精確率、召回率、F1-Score、誤報率、漏報率6個指標對提出的漏洞檢測模型進行評價.為計算上述6個評價指標,需要在實驗中收集以下4種數據:①真正類(True Positive,TP)即被正確分類的有漏洞樣本數量;②假正類(False Positive,FP)即不含漏洞樣本被誤報的數量;③假負類(False Negative,FN)即未被成功檢測的漏洞樣本數量;④真負類(True Negative,TN)即不存在漏洞的樣本被準確判斷的數量.6個評價指標的定義如下.
1)準確率A :準確分類的樣本占總樣本的比例.
2)精確率P在所有被判斷為存在漏洞的樣本中,判斷正確的樣本比例.
3)召回率R:被成功檢測出的漏洞樣本占所有漏洞樣本的比例.
4)F 1-Score:精確率和召回率的調和平均值,反映模型整體表現情況.
5)誤報率FPR:無漏洞樣本被誤報的比例.
6)漏報率FNR:漏洞樣本中未被檢測出的樣本所占比例,FNR=1-R.
4.2實驗與結果分析
為驗證本文方法的性能,將本文方法與基于源代碼文本結構化表征的漏洞檢測方法[8]、基于文本線性表征的漏洞檢測方法[7]和基于代碼度量的漏洞檢測方法[3]進行對比實驗.具體實驗環境配置如表3所示.
4.2.1檢測模型構建及性能評估
本文提出的基于結構化文本及代碼度量的漏洞檢測方法,綜合了源代碼文本的結構化表征和代碼度量兩種表征方式.因此模型的構造需要分三步進行:①基于SA的神經網絡訓練及測試;②DNN模型訓練及測試;③SVM模型訓練及測試,其中SVM模型的輸出結果是本文檢測方法的最終結果.訓練及測試所需數據集如表1所示,將表1中收集的測試用例進行分割,得到訓練集和測試集.
1)基于SA的神經網絡訓練及測試.本文利用基于SA的神經網絡進行代碼結構化文本特征的學習.為驗證SA機制在捕獲代碼結構化文本長期依賴能力優于其他神經網絡,與其他4種神經網絡進行對比實驗,分別為:CNN、LSTM、BLSTM、GRU.對上述模型進行訓練,經過測試分別得到5種模型的性能指標,實驗結果如圖5~圖10所示.
由圖5~圖10可見,基于SA的神經網絡在測試集上的準確率和精確率較高且誤報率較低,這說明與采用其他4種神經網絡模型相比,基于SA的神經網絡模型對源代碼的結構化文本特征擬合效果更好.并且基于SA的神經網絡F 1-Score保持在較高的水平,這說明該神經網絡在利用結構化文本特征進行漏洞檢測時的整體表現優于其他模型.由圖6~ 圖11的曲線趨勢可見,基于SA的神經網絡在面對不同漏洞類型的表現也較為穩定.綜上可知,基于SA 的神經網絡能夠充分擬合源代碼結構化文本和漏洞存在之間的聯系,比其他神經網絡更加適合基于文本結構化表征的漏洞檢測任務.
2)DNN測試及訓練.針對代碼度量特征,采用DNN構建一個漏洞檢測模型,其在測試數據上的實驗結果如表4所示.
實驗結果表明,基于代碼度量的方式雖然準確率較高,但漏報率極高.例如,在對CWE129的檢測準確率達到81.93%的前提下,漏報率達到69.09%.表明代碼度量表征方法對存在漏洞的代碼表征效果不好,導致檢測結果出現偏差.可見,采用這種粗粒度的表征方式只適用于粗略判斷源代碼是否存在漏洞,不能準確檢測源代碼的漏洞.因此代碼度量在一定程度上能夠判斷代碼的健康狀況,但僅依靠代碼度量不能充分表示漏洞代碼的特性.
3)SVM模型訓練及測試.在前序實驗中,通過對結構化文本特征和代碼度量特征訓練,得到2種不同維度的檢測模型.在本實驗中,將測試數據輸入2 種檢測模型分別得出源代碼存在漏洞的概率,以2個神經網絡檢測模型的輸出作為新的特征,采用SVM進行決策分類,得到最終檢測結果,即判斷漏洞是否存在.通過調整核函數利用SVM進行線性分類和非線性分類.本文分別使用線性核(linear)、多項式核(poly)和高斯核(rbf)對上述兩種檢測模型的輸出作進一步分類.以CWE113漏洞為例說明分類過程,不同核函數的SVM決策邊界如圖11所示.
圖11(a)是基于SA的檢測模型和DNN檢測模型的輸出散點圖,圖1(a)~圖11(d)中的每一個點表示測試數據集中的一個函數片段,圓點表示該函數真實存在漏洞,“x”點表示該函數不存在漏洞.圖中橫坐標表示基于結構化文本特征的檢測模型輸出的漏洞存在概率,縱坐標表示基于代碼度量的檢測模型輸出的漏洞存在概率.例如靠近右上角的點表示基于SA的檢測模型和DNN檢測模型都判斷該函數有很大概率存在漏洞.圖11(1))~圖11(d)分別表示SVM中3種不同核函數的決策邊界.SVM模型的具體評估結果如表5~表7所示.
由表5~表7可見,經過SVM的進一步分類決策,漏洞檢測的各項指標均有大幅提升,但是對于不同核函數的SVM分類結果相差不大.出現這種現象的原因是,在CWE113測試數據中,基于SA的神經網絡和DNN的輸出是線性可分的.但是本文方法在應用過程中,由于漏洞類型的多樣性和源代碼的復雜性,無法保證基于SA的神經網絡和DNN的輸出都是線性可分的,因此本文方法采用三種不同核函數進行分類.對比表4-表7以及圖5~圖10中的數據可見,本文方法在結構化表征方法和代碼度量方法的基礎上,提高了準確率、精確率和召回率.
4.2.2對比檢測實驗
為驗證本文提出方法的優越性,將本文方法和基于文本結構化表征的漏洞檢測方法[8]、基于代碼度量的漏洞檢測方法[3]、基于線性文本表征的漏洞檢測方法Achilles[7]進行對比實驗.其中基于結構化文本的方法采用的是基于SA機制的神經網絡模型、基于代碼度量的方法采用DNN模型、基于線性文本的方法采用LSTM模型.分別搭建上述4種檢測模型,在相同數據集下進行訓練和測試,4種模型的漏洞檢測準確率對比結果如圖12所示.
從圖12可見,基于代碼度量的方法、基于結構化表征的方法和Achilles對不同漏洞的檢測平均準確率分別為85.75%、93.07%和92.18%,本文方法對不同漏洞的檢測平均準確率為97.96%,均高于其他3種方法.本文方法能夠取得較好的漏洞檢測效果,有以下兩個原因:①本文方法從源代碼結構文本信息以及代碼度量兩個維度對源代碼進行表征,相比于單一表征方法,本文的表征方法更加全面;②文本信息特征是漏洞檢測過程中較為重要的特征,本文所構建的基于SA的神經網絡,能夠較好地捕捉文本信息中的長期依賴關系.
5結束語
為進一步提高源代碼漏洞檢測準確率,降低誤報率,本文提出一種基于結構化文本及代碼度量的漏洞檢測方法.通過代碼度量和結構化文本兩種表征方法對源代碼進行表征,利用神經網絡模型進行特征學習以構造漏洞檢測模型,進行漏洞檢測.實驗結果表明本文提出的方法有較好的檢測效果.
本文方法僅從兩個維度對源代碼進行表征,考慮的表征維度仍不夠全面.未來的工作重點是發掘更多適合漏洞檢測的源代碼表征方式,改進表征方式以獲得更優的檢測性能.
參考文獻
[1] LI Z J,SHAO Y. A survey of feature selection for vulnerability prediction using feature-based machine learning [C]//Proceedings of the 2019 11th International Conference on Machine Learning and Computing-ICMLC,19. New York:ACM Press,2019:36-42.
[2] HORCH J W. Metrics and models in software quality engineering [J]. Control Engineering Practice,1996,4(9):1333-1334.
[3] FERENC R,HEGEDUS P,GYIMESI P,et al. Challenging machine learning algorithms in predicting vulnerable JavaScript functions [C]//2019 IEEE/ACM 7th International Workshop on Realizing Artificial Intelligence Synergies in Software Engineering (RAISE). Montreal,QC,Canada:IEEE,2019:8-14.
[4] SULTANA K Z. Towards a software vulnerability prediction model using traceable code patterns and software metrics[ C]//2017 32ndIEEE/ACM International Conference on Automated Software Engineering (ASE). Urbana,IL,USA:IEEE,2017:1022-1025.
[5] YANG H Y,ZENG R Y,XU G Q,et al. A network security situation assessment method based on adversarial deep learning[J].Applied Soft Computing,202 102:107096.
[6]LI Z,ZOU D Q,XU S H,et al.VulPecker:an automated vulnerability detection system based on code similarity analysis[C]//Proceedings of the 32nd Annual Conference on Computer Security Applications. New York:ACM,2016:201-213.
[7] SACCENTE N,DEHLINGER J,DENG L,et al. Project Achilles:a prototype tool for static method-level vulnerability detection of Java source code using a recurrent neural network[ C]//2019 34th IEEE/ACM International Conference on Automated Software Engineering Workshop(ASEW)San Diego,CA,USA:IEEE,2019:114-121
[8]陳肇炫,鄒德清,李珍,等.基于抽象語法樹的智能化漏洞檢測系統[J].信息安全學報,2020,5(4):1-13.
CHEN Z X,ZOU D Q,LI Z,et al Intelligent vulnerability detection system based on abstract syntax tree[J]. Journal of Cyber Security,2020,5(4):1-13 (In Chinese)
[9]ZHENG J Y,PANG J M,ZHANG X C,et al. Recurrent neural network based binary code vulnerability detection[C]//Proceedings of the 2019 2nd International Conference on Algorithms,Computing and Artificial Intelligence New York:ACM,2019:160-165
[10]楊鑫.基于語義學習的二進制漏洞代碼克隆檢測[D].北京:清華大學,2019.
YANG X Semantic learning based binary vulnerability code clone detection[D]. Beijing:Tsinghua University,2019.(In Chinese)
[11]梅瑞,嚴寒冰,沈元,等.二進制代碼切片技術在惡意代碼檢測中的應用研究[J].信息安全學報,202 6(3):125-140.
MEI R,YAN H B,SHEN Y,et al Application research of slicing technology of binary executables in malware detection[J] Journal of Cyber Security,202 6(3):125-140 (In Chinese)
[12] BOLAND JR F E,BLACK P E. Juliet 1.1 C/C++ and Java test suite[OL].[Accessed:May 2021]. https://www.nist.gov/publications/juliet-11-cc-and-java-test-suite.
[13] MITRE. MITRE Common Weakness Enumeration (CWE)[OL]. [Accessed:May 2019] . https://cwe.mitre.org/.
[14] THUNES C.Javalang 0.13.0 [OL]. [Accessed:May-2020] https://github.com/c2nes/javalang.
[15]劉煒.基于機器學習的代碼漏洞檢測機制研究與應用[D].成都:電子科技大學,2018.
LIU W Research and application of machine learning based code vulnerability detection mechanism[D] Chengdu:University of Electronic Science and Technology of China,2018 (In Chinese)
[16] MAURICIO A. CK[OL]. [Accessed:May 2021] . https://github. com/mauricioaniche/ck.
[17] VASWANI A,SHAZEER N,PARMAR N,et al. Attention is all you need [C]//Advances in Neural Information Processing Systems. 2017:5998-6008.