王蘇蘇 徐陽
摘? 要: 常規(guī)的漏洞檢測方法通過激活函數(shù)的方式,標(biāo)識出存在漏洞的代碼,少有對代碼中的詞義進(jìn)行分析,導(dǎo)致檢測效果不佳。因此,設(shè)計了基于圖神經(jīng)網(wǎng)絡(luò)的軟件源碼漏洞檢測方法。提取軟件源碼漏洞特征,針對漏洞特征進(jìn)行詞義分析。利用圖神經(jīng)網(wǎng)絡(luò)構(gòu)建軟件源碼漏洞檢測模型,對源碼漏洞做二次檢測,去掉重讀的源碼,得到正確的代碼。采用對比實驗,驗證了該方法的檢測效果更佳。
關(guān)鍵詞: 圖神經(jīng)網(wǎng)絡(luò); 源碼; 漏洞; 檢測方法
中圖分類號:TN919.31? ? ? ? ? 文獻(xiàn)標(biāo)識碼:A? ? ?文章編號:1006-8228(2023)06-29-04
Software source code vulnerability detection method based on graph neural network
Wang Susu, Xu Yang
(Jiangsu Shipping College, Nantong, Jiangsu 226009, China)
Abstract: The conventional methods of vulnerability detection identify the code with vulnerability by means of activation function, and seldom analyze the meaning of the words in the code, which results in poor detection results. Therefore, a software source code vulnerability detection method based on graph neural network is designed. The software source code vulnerability features are extracted and their word meaning is analyzed. The software source code vulnerability detection model is constructed using graph neural network, and the source code vulnerability is detected twice to remove the reread source code and get the correct code. Comparison experiments are used to verify that the method has better detection results.
Key words: graph neural network; source code; vulnerability; detection method
0 引言
軟件源碼漏洞是目前亟待解決的數(shù)據(jù)安全問題,設(shè)計相應(yīng)的檢測方法勢在必行。在源碼出現(xiàn)漏洞時,應(yīng)用程序受到源碼漏洞的影響,可以使攻擊者在不與用戶作出任何交互的條件下自行應(yīng)答,從而出現(xiàn)信息泄露的問題。
針對軟件源碼漏洞問題,研究人員設(shè)計了多種解決方案。其中,基于CNN-GAP[1]可解釋性模型的方法和基于關(guān)系圖卷積網(wǎng)絡(luò)的方法應(yīng)用較為廣泛?;贑NN-GAP可解釋性模型的方法主要是通過CAM類的激活函數(shù),對代碼存在的漏洞情況進(jìn)行標(biāo)記,并利用CNN-GAP(卷積神經(jīng)網(wǎng)絡(luò)-全局平均池化)模型,對已經(jīng)標(biāo)記漏洞進(jìn)行檢測,檢測完成之后將正確代碼輸出,將存在漏洞的代碼進(jìn)行處理,保證漏洞檢測的精準(zhǔn)度?;陉P(guān)系圖卷積網(wǎng)絡(luò)的方法主要是利用RGCN(關(guān)系圖卷積網(wǎng)絡(luò))模型[2],通過訓(xùn)練預(yù)測源碼中的漏洞,在真實的代碼漏洞上進(jìn)行測試,由此提高漏洞檢測精準(zhǔn)度。以上兩種方法雖然在一定程度上提高了漏洞檢測的精準(zhǔn)度,但是CNN-GAP模型并未對其他代碼進(jìn)行檢測,相關(guān)語義特征與漏洞特征存在混淆,影響了檢測效果;RGCN模型訓(xùn)練的漏洞雖然較為準(zhǔn)確,但是其訓(xùn)練時間較長,無法適應(yīng)源碼漏洞檢測環(huán)境,導(dǎo)致檢測效果不佳。
圖神經(jīng)網(wǎng)絡(luò)是一種拓?fù)鋱D結(jié)構(gòu)的數(shù)據(jù),能夠深入挖掘數(shù)據(jù)特征,其對于網(wǎng)絡(luò)數(shù)據(jù)安全檢測具有重要作用。因此,本文利用了圖神經(jīng)網(wǎng)絡(luò),設(shè)計了軟件源碼漏洞檢測方法。
1 軟件源碼漏洞的圖神經(jīng)網(wǎng)絡(luò)檢測方法設(shè)計
1.1 提取軟件源碼漏洞特征
漏洞存在于計算機(jī)系統(tǒng)中,硬件、軟件、協(xié)議等方面的漏洞,均會導(dǎo)致系統(tǒng)存在安全缺陷。源碼作為程序語言,可以通過詞語映射實數(shù)向量,將所有語義反映到連續(xù)向量空間中,由此檢測出源碼中存在的語義漏洞。由于程序語言的詞向量與普通詞向量不同,本文將源碼中的語言利用向量化表示。本文從源碼的上下文考量,量化源碼輸入路徑,同時增加與漏洞檢測相關(guān)的數(shù)據(jù)信息,利用注意力機(jī)制,將上下文源碼數(shù)據(jù)融合到一起,用一個單一的向量表示,從而提取出源碼漏洞特征。對于每條源碼輸入路徑,將其轉(zhuǎn)化為圖神經(jīng)網(wǎng)絡(luò)作為輸入數(shù)值。輸入路徑中的每一個節(jié)點都存在一個源碼詞語映射,由此構(gòu)成了一個大型的節(jié)點源碼語料庫。在源碼語料庫上進(jìn)行向量表示,得到詞語與其對應(yīng)向量的映射關(guān)系,公式如下:
[Li=min1ij=1ik-logHNodeMk|NodeMj]? ⑴
式⑴中,[Li]為源碼詞語與向量之間的關(guān)系表達(dá)式;[NodeMk]為源碼輸入路徑的第k個詞向量;[NodeMj]為源碼輸入路徑的第j個詞向量;[H{NodeMk|NodeMj}]為節(jié)點損失函數(shù)。為了將源碼中存在的漏洞檢測出來,本文將源碼輸入路徑中的漏洞信息整合到圖神經(jīng)網(wǎng)絡(luò)中。任意一條源碼輸入路徑中,通過一個或多個漏洞源碼信息,則增加該條路徑的漏洞權(quán)重。路徑中任意一個詞向量P={NodeMi,NodeMi+1,…,NodeMn},經(jīng)過漏洞代碼存在的漏洞節(jié)點之后,相同的權(quán)重賦予多個漏洞節(jié)點上,而這條路徑上并未賦予任何權(quán)重,通過是否增加權(quán)重來判別漏洞源碼輸入路徑與正常源碼輸入路徑。從漏洞源碼輸入路徑中,對每一個向量元素進(jìn)行特征提取,通過圖神經(jīng)網(wǎng)絡(luò)更新路徑中涉及的每個權(quán)重參數(shù),組成一個完整的漏洞特征,其表達(dá)式如下:
[Ti=?(K?Xij+n-1+B)]? ⑵
[Ti1=tanh (K?Ti)]? ⑶
式⑵~式⑶中,[Ti]為漏洞源碼輸入路徑中每一個漏洞的特征參數(shù);[?]為激活函數(shù);[K]為權(quán)重的權(quán)值矩陣;[Xij+n-1]為漏洞源碼輸入路徑的向量元素;[B]為偏置因子;[Ti1]為通過圖神經(jīng)網(wǎng)絡(luò)重新組成的漏洞特征;[tanh]為非線性激活函數(shù)。在源碼語言領(lǐng)域中,漏洞特征的提取,使源碼漏洞詞向量更加明顯,將漏洞特征輸入到檢測模型中,模型能夠?qū)β┒丛~向量進(jìn)行專注檢測,更有利于提高檢測效果。
1.2 基于圖神經(jīng)網(wǎng)絡(luò)構(gòu)建軟件源碼漏洞檢測模型
使用本文設(shè)計的檢測方法,主要利用程序語言詞向量來提取源碼漏洞特征。此種特征提取與傳統(tǒng)方法漏洞特征提取不同,受到主觀性因素的影響,出現(xiàn)上下文丟失的現(xiàn)象。本文將漏洞特征提取精確到每個源碼路徑的每個詞向量上,漏洞特征提取效果更佳。將漏洞特征提取之后,本文選擇圖神經(jīng)網(wǎng)絡(luò)檢測模型來檢測程序漏洞。圖神經(jīng)網(wǎng)絡(luò)分類情況如圖1所示。
如圖1所示,本文選用的圖神經(jīng)網(wǎng)絡(luò)中包括了時空網(wǎng)絡(luò)、注意力網(wǎng)絡(luò)、生成網(wǎng)絡(luò)、卷積網(wǎng)絡(luò)等內(nèi)容。上文中已經(jīng)利用圖注意力網(wǎng)絡(luò),對漏洞特征進(jìn)行針對性提取。在此基礎(chǔ)上,本文隨機(jī)選取了一個漏洞特征向量,隨機(jī)游走在源碼輸入路徑中,步長為5,測試次數(shù)為100。游走的過程中,碰到的其他漏洞特征向量節(jié)點定義為“鄰居”。對“鄰居”進(jìn)行隨機(jī)采集,采集到的“鄰居”節(jié)點的特征向量值小于隨機(jī)漏洞特征向量值,則重新采集,否則將其與隨機(jī)漏洞特征向量進(jìn)行聚合。聚合公式如下:
[Skj←?K?MEANSk-1jSk-1j,?j∈bj] ⑷
式⑷中,[Skj]為聚合后的漏洞信息;[MEAN]為聚合器聚合算法;[Sk-1j]為“鄰居”的漏洞信息;[bj]為“鄰居”的特征向量size值。將融合后的漏洞信息在圖神經(jīng)網(wǎng)絡(luò)上游走,圖節(jié)點不斷更新直至穩(wěn)定的過程中,根據(jù)遞歸函數(shù)施加相應(yīng)的檢測約束,并將實時更新的圖節(jié)點進(jìn)行卷積層堆疊表示[3]。在新的漏洞信息不變,圖節(jié)點達(dá)到穩(wěn)定的狀態(tài)下,獲取到了圖中更高階的鄰域數(shù)據(jù),將此數(shù)據(jù)作為圖神經(jīng)網(wǎng)絡(luò)檢測模型的檢測數(shù)據(jù),則構(gòu)建出的檢測模型表達(dá)式如下:
[Sk+1j=εjebjij1SijvKkSkj]? ⑸
式⑸中,[Sk+1j]為漏洞檢測模型表達(dá)式;[Sij]為節(jié)點i在j層的特征信息;[ν]為歸一化因子;[Kk]為節(jié)點k的直接權(quán)重;[ε]為激活函數(shù)。通過該檢測模型的訓(xùn)練,每個漏洞特征節(jié)點將自身的特征信息傳遞給鄰域節(jié)點,從而將漏洞特征進(jìn)一步聚合并融合。再通過激活函數(shù),將圖神經(jīng)網(wǎng)絡(luò)中的漏洞節(jié)點信息進(jìn)行變換,增強(qiáng)模型的檢測能力。無論漏洞節(jié)點與鄰域節(jié)點如何變化,最終的節(jié)點中心長度保持一致。在多級權(quán)重實時更新的條件下,聚合的信息特征也逐一采集到圖節(jié)點中,由此獲取的表征數(shù)據(jù)更加真實,最大限度地提高了源碼漏洞檢測效果。
2 實驗
為了驗證本文設(shè)計的檢測方法是否具有實用價值,本文對上述方法進(jìn)行了實驗分析。最終的實驗結(jié)果以基于CNN-GAP可解釋性模型的方法、基于關(guān)系圖卷積網(wǎng)絡(luò)的方法,以及本文設(shè)計的基于圖神經(jīng)網(wǎng)絡(luò)的方法進(jìn)行對比的形式呈現(xiàn)。具體實驗過程及實驗結(jié)果如下所示。
2.1 實驗過程
在進(jìn)行實驗之前,本文選擇GeForce1080GPU的實驗平臺[4],對本文設(shè)計的檢測模型進(jìn)行訓(xùn)練。模型訓(xùn)練過程中,將源碼向量化,每個代碼的維度為100,最長代碼為200個詞。本文隨機(jī)選取了X源碼數(shù)據(jù)集,該數(shù)據(jù)集中包含了多個代碼,存在漏洞的代碼較多,漏洞類型較多,更符合實驗環(huán)境。為了保證實驗的真實性,本文針對每一類型的漏洞進(jìn)行輪流多次訓(xùn)練,將穩(wěn)定輸出的數(shù)據(jù)作為最終的實驗結(jié)果。其中,X源碼數(shù)據(jù)集中的CAD源碼較為特殊,分隔符樣式不同,檢測較為困難,本文將CAD源碼進(jìn)行歸一化處理,處理完成的代碼形式如圖2、圖3所示。
如圖2、圖3所示,源碼初始格式較為復(fù)雜,很難進(jìn)行漏洞檢測,經(jīng)過處理之后,格式相對簡單,可以與其他源碼進(jìn)行同時檢測,保證檢測效率。源碼檢測流程如圖4所示。
如圖4所示,在進(jìn)行源碼漏洞檢測的過程中,經(jīng)過三次檢測,分別為源碼檢測、二次檢測、詞法檢測,能夠?qū)⒃创a中存在的漏洞有效地檢測出來。檢測完成的代碼中存在的重復(fù)代碼進(jìn)行清除,保留下來的代碼即為正確代碼。本次實驗引進(jìn)[Precision]、[Recall]、[F1-score]等指標(biāo),對漏洞檢測效果進(jìn)行判定。[Precision]、[Recall]、[F1-score]等指標(biāo)的計算公式如下:
[Precision=TPTP+FPRecall=TPTP+dnF1-score=2×(Precision×Recall)Precision+Recall]? ⑹
式⑹中,[Precision]為漏洞檢測精準(zhǔn)度指標(biāo);[TP]為源碼中沒有漏洞的代碼數(shù)量;[FP]為源碼中存在漏洞的代碼數(shù)量;[Recall]為漏洞查全指標(biāo);[DN]為[TP]中檢測出的沒有漏洞的代碼數(shù)量;[F1-score]為[Precision]與[Recall]的平均值,該值越趨近于100%,漏洞檢測的效果越好。本文將[Precision]、[Recall]、[F1-score]等值進(jìn)行計算,對檢測方法的檢測效果進(jìn)行綜合判定。
2.2 實驗結(jié)果
在上述實驗條件下,本文隨機(jī)選取了三種軟件源碼,分別為CAD、Hide、Show[5,6]。將三種軟件源碼利用檢測模型進(jìn)行漏洞檢測。其中,[Precision]為查準(zhǔn)率指標(biāo),[Recall]為查全率指標(biāo)。[Precision]與[Recall]取平均值即為[F1-score],該值越高,軟件源碼漏洞檢測效果越趨近于完美。在其他條件均一致的情況下,將基于CNN-GAP可解釋性模型的[F1-score]值、基于關(guān)系圖卷積網(wǎng)絡(luò)的[F1-score]值,以及本文設(shè)計的基于圖神經(jīng)網(wǎng)絡(luò)[F1-score]值進(jìn)行對比。實驗結(jié)果如表1所示。
如表1所示,CAD、Hide、Show等三種軟件源碼中的漏洞源碼數(shù)量不同,漏洞檢測效果取決于[F1-score]值的大小,當(dāng)[F1-score]值=100%時,證明該檢測方法的檢測精準(zhǔn)度與召回率均為100%,能夠完美地檢測出源碼中的漏洞。在其他條件均一致的情況下,基于CNN-GAP可解釋性模型方法的[F1-score]值相對較低,在85.70%~87.70%的范圍內(nèi)變化,主要原因在于源碼的語法信息、結(jié)構(gòu)信息的語義特征與漏洞特征混合在了一起,無法準(zhǔn)確地辨別源碼漏洞,導(dǎo)致檢測效果不佳,亟需進(jìn)一步改進(jìn)?;陉P(guān)系圖卷積網(wǎng)絡(luò)方法的[F1-score]值有所提升,在90.16%~91.90%范圍內(nèi)變化,主要原因在于源碼中的代碼數(shù)據(jù)存在注意力依賴,雖然能夠找出源碼存在的漏洞,但是檢測時間相應(yīng)增加,在相同的時間內(nèi)無法找出對應(yīng)的漏洞。而本文設(shè)計的基于圖神經(jīng)網(wǎng)絡(luò)方法的[F1-score]值相對較高,在99.34%~100.00%的范圍內(nèi)變化,Show源碼的漏洞檢測[F1-score]值達(dá)到了100%的指標(biāo),漏洞檢測效果趨近于完美,符合本文研究目的。
3 結(jié)束語
本文在圖神經(jīng)網(wǎng)絡(luò)下,設(shè)計了軟件源碼漏洞檢測方法。本文設(shè)計的檢測方法主要從源碼漏洞特征的角度考慮,利用[F1-score]值提高了檢測效果。與其他檢測方法相同的是,均利用了漏洞特征與檢測模型,不同的是本文設(shè)計的方法能夠?qū)υ创a進(jìn)行歸一化處理,更加準(zhǔn)確地找出存在漏洞的代碼,對于網(wǎng)絡(luò)技術(shù)的發(fā)展具有重要意義。
參考文獻(xiàn)(References):
[1] 鄒權(quán)臣,張濤,吳潤浦,等.從自動化到智能化:軟件漏洞挖掘
技術(shù)進(jìn)展[J].清華大學(xué)學(xué)報(自然科學(xué)版),2018,58(12):1079-1094
[2] 朱麗娜,馬銘芮,朱東昭.基于圖神經(jīng)網(wǎng)絡(luò)和通用漏洞分析框
架的C類語言漏洞檢測方法[J].信息網(wǎng)絡(luò)安全,2022,22(10):59-68
[3] 李元誠,崔亞奇,呂俊峰,等.開源軟件漏洞檢測的混合深度
學(xué)習(xí)方法[J].計算機(jī)工程與應(yīng)用,2019,55(11):52-59
[4] LIN Guanjun, ZHANG Jun, LUO Wei, et al. POSTER:
Vulnerability discovery with function representation learning from unlabeled projects[C].The 2017 ACMSIGSAC Conference on Computer and Communications Security, New York, USA,2017:2539-2541
[5] 宋子韜,胡勇.基于圖神經(jīng)網(wǎng)絡(luò)的源碼漏洞檢測方法研究[J].
通信技術(shù),2022,55(5):640-645
[6] 段旭,吳敬征,羅天悅,等.基于代碼屬性圖及注意力雙向
LSTM的漏洞挖掘方法[J].軟件學(xué)報,2020,31(11):3404-3420