摘 要:源碼漏洞檢測作為重要的研究課題,其傳統方法在面對規模龐大、脆弱性多樣化的代碼時,存在人工參與度高、未知漏洞檢測能力弱等諸多問題。針對以上問題,基于開放源代碼的語法語義信息,提出了改進差分進化算法的源碼漏洞檢測模型冷啟動優化方法。運用源碼切片技術、啟發式優化算法及神經網絡模型,解決了漏洞檢測模型在啟動之初超參數無法準確選定的問題。對于實驗中樣本信息冗余和正負樣本鮮明特征混和的情況,提出了正負樣本鮮明特征交叉剔除的思想以減小模型的漏報率及誤報率。實驗表明,該方法可以有效加速模型的收斂,使得模型在10個epoch內達到穩定,在提升源碼漏洞檢測模型準確率的同時其收斂速度比其他模型提升了2~3倍。在后續改進實驗中,源碼漏洞檢測模型在所有類型漏洞的準確率上均提高了1~3個百分點,充分證明了改進措施的有效性。該方法的優化策略和改進措施同樣適用于其他神經網絡分類模型,可以為漏洞檢測領域探索新方法和新模型提供思路。
關鍵詞:語法語義;改進差分進化;漏洞檢測;BiGRU
中圖分類號:TP183
文獻標志碼:A
文章編號:1001-3695(2023)07-038-2170-09
doi:10.19734/j.issn.1001-3695.2022.11.0640
Cold start method for source code vulnerability detection model based on improved differential evolution algorithm
Yuan Zilong1,Wu Qiuxin1,Liu Ren2,Qin Yu3
(1.School of Applied Science,Beijing Information Science amp; Technology University,Beijing 100192,China;2.Beijing Excellent Network Security Technology Co.,Ltd.,Beijing 100192,China;3.Trusted Computing amp; Information Assurance Laboratory,Institute of Software,Chinese Academy of Science,Beijing 100190,China)
Abstract:As an important research topic,source code vulnerability detection has many problems in its traditional methods,such as high manual participation,weak detection ability of unknown vulnerabilities.Aiming at the above problems,based on the syntactic and semantic information of open source code and improved differential evolution algorithm,this paper proposed a cold start optimization method for source code vulnerability detection model.This paper used source code slicing technology,heuristic optimization algorithms and neural network models,which solved the problem that the hyperparameters couldn’t be correctly selected at the beginning of the vulnerability detection model.For the case of sample information redundancy and mixture of positive and negative sample distinctive features in the experiment,it proposed an idea of cross-exclusion of positive and negative sample distinctive features to reduce the 1 negative rate and 1 positive rate of the model.Experiments show that this method can effectively accelerate the convergence of the model,and making the model stable within 10 epochs.While improving the accuracy of the source code vulnerability detection model,its convergence speed is 2~3 times higher than other models.In the subsequent improvement experiments,the source code vulnerability detection model has improved the accuracy of each type of vulnerability by 1~3 percentage points,which fully proves the effectiveness of the improvement measures.The optimization strategies and improvement measures of this method are also applicable to other neural network classification mo-dels,and it can provide ideas for exploring new methods and models in the field of vulnerability detection.
Key words:syntax semantics;improved differential evolution;vulnerability detection;BiGRU
0 引言
在以物聯網、云計算、智能合約等工業互聯網安全環境下,源代碼漏洞檢測都是無法回避的問題,其在軟件系統安全中占據著尤為重要的地位。工信部2021年發布的數據顯示,截止七月底,國內應用市場上的應用數量就高達291萬款,覆蓋范圍有咨詢類、社交類、電商類、游戲類、理財類等生活的方方面面。據國家互聯網應急中心報告,我國2022年8月7日至9月4日以來境內計算機惡意程序傳播次數同比增加4.3%,其中惡意代碼傳播次數排名前三的家族分別是Backdoor.Linux.Mirai、Malware.Script.X-Threat、Trojan.Win32.Script;境內被植入后門網站總數同比增加14.5%,其中被植入后門網站總數前三種類型分別是COM、其他、NET[1]。此外,2018年CVE發布了16 556個安全漏洞,在2019年發布了12 174個安全漏洞,截止2022年CVE發布的安全漏洞總數高達184 480個。隨著經濟和應用數量的增長,安全漏洞的形態也呈現出復雜性、多樣性及海量性,嚴重威脅著國家、企業、系統的正常安全運行[2]。
傳統源代碼漏洞檢測可簡要分為靜態分析和動態分析兩種形式。靜態分析有根據源代碼的語法樹、控制流圖、數據流圖等抽象概念進行漏洞解析;動態分析有根據語法的fuzz測試、基于污點分析、符號執行等解析方式。其中靜態分析是探測源碼漏洞的重要方法,其一般分為以代碼相似性為基礎的漏洞檢測和以模式匹配為基礎的漏洞檢測,前者一般針對代碼克隆引起的漏洞,后者則一般由專家人工走查來構建模式。
現行的靜態漏洞檢測方式在面對漏洞特征不明確的漏洞時其準確性大幅下降,原因是基于規則的方法是在目標源程序中逐一匹配專家預先定義的漏洞模式,可見其預先定義的漏洞模型較刻板單一,難以涵蓋漏洞準確特征,造成準確性低、誤報率高;此外,基于學習的方法又難以正確地構建源碼特征,以及捕捉有效的關鍵漏洞特征。基于以上種種原因,使得其在處理特征不明確的漏洞時,也難以正確地進行漏洞檢測。
隨著以強大的特征學習能力和數據擬合能力為特點的人工神經網絡及機器學習等技術在CV、NLP、推薦系統等領域的相繼成熟,眾多的中外學者也嘗試將其引入漏洞檢測領域。其中文獻[3]提出了一種以代碼屬性圖和注意力雙向LSTM模型為基礎的源碼漏洞檢測方法,首先將源代碼轉換為代碼屬性圖,然后使用以雙向LSTM和注意力機制為基礎的神經網絡進行漏洞檢測。文獻[4]提出了一種基于代碼屬性圖和BiGRU的軟件脆弱性檢測方法,其主要思想是從函數的代碼屬性圖中提取出抽象語法樹序列、控制流圖序列等作為函數表征方式,然后選取BiGRU構建訓練模型以對漏洞進行檢測。文獻[5]提出基于結構表征的智能化漏洞檢測系統,使用深度優先遍歷的機制獲取抽象語法樹的語法表征,再結合神經網絡模型進行漏洞檢測。文獻[6]提出基于卷積神經網絡(CNN)和全局平均池化(GAP)可解釋性模型的源代碼漏洞檢測方法,使用one-hot編碼進行詞嵌入,結合CNN-GAP神經網絡進行漏洞檢測。
為了引入源碼的語法語義表征,Li等人[7]設計提出了第一個使用深度學習來檢測C/C++源代碼程序中漏洞的框架,該框架以語法語義向量表征為基礎,著重于獲取可以容納與漏洞相關的語法和語義信息的程序表示。
Li等人[8]結合源代碼和匯編代碼模型實現漏洞檢測,從源代碼和匯編代碼中提取代碼片段并對齊,之后轉換為向量輸入到超融合深度學習模型中。
Liu等人[9]提出深度學習(DL)和域適應(DA)相結合的跨域軟件漏洞檢測系統,使用DL構建程序高級特征,使用DA減少樣本分布之間差異,從而構建漏洞檢測分類器。此外,針對機器學習的代碼表示問題及正負樣本間類不平衡問題,Liu等人[10]還提出DeepDalance系統,該系統結合深度學習的代碼表示與模糊類再平衡思想,使用模糊過采樣方法合成正樣本以平衡訓練數據,最后設計出一個具有雙向長短期記憶的深度神經網絡模型。
針對漏洞數據稀缺性的問題,Lin等人[11]提出了一個利用預先存在的數據源進行遷移學習的框架,選用多個與漏洞數據相關的數據源建立遷移知識基礎,長短期記憶數據網絡(LSTM)作為訓練模型對漏洞進行檢測。針對傳統靜態切片方法通過程序依賴圖(PDG)和系統依賴圖(SDG)構造源碼切片的高昂代價問題,Zhang[12]提出一種輕量級的靜態程序切片方法——符號程序切片(SymPas),評估發現SymPas與SDG-IFDS相比,時間成本降低了6倍,空間成本降低了4倍。
上述種種神經網絡往往需要眾多超參數(如網絡層數,數據元個數),為了防止過擬合加入的dropout以及batchsize等,而這些超參數往往在應對不同場景不同模型時,表現出的差異性又過于懸殊,傳統選擇模型超參數的方法不是借鑒其他模型的超參數進行大量試錯、調整,就是需要經驗豐富的專家精心設置,再結合實驗進行調整,往往費時費力,還不一定能得到很好的效果。基于此,本文提出改進差分進化算法,對模型的超參數進行自動尋參,達到模型自動學習的過程,讓模型自己尋找最優參數,可以在剛開始訓練時節省人力物力,盡可能尋找最優參數組合,以尋求模型最優解。
1 理論基礎
啟發式優化相較于傳統優化方法具有多可行解并行、對優化目標函數要求低、具有良好全局尋優能力等特點,廣受業界青睞。而差分進化算法作為綜合能力顯著的一種啟發式優化算法,其具有參數設置簡單、不依賴于初始解、尋求最優解的同時可以得到多個次優解等特點,可以較好地解決漏洞檢測超參數優化問題中存在的初始解不確定、維度復雜、目標函數約束較弱等問題。但是現階段的差分進化算法在面對高維度、多參數的復雜漏洞檢測問題上仍存在收斂速度慢、容易陷入局部最優解甚至收斂停滯等問題,所以權衡利弊之下,采用改進差分進化算法對源碼漏洞檢測問題進行優化處理。
在進行源碼漏洞檢測研究前,首先應該解決的問題是在什么維度上進行漏洞檢測,這直接決定了后續實驗該如何進行數據表征提取。研究表明,在較細粒度上進行漏洞檢測,才有可能得到較高的漏洞定位精度。對于文件級的檢測粒度則太粗,難以滿足細粒度要求;而對于代碼段級的檢測粒度又存在切分困難、過于零散、缺乏整體性、漏報、誤報率高等問題。綜上,函數級的檢測粒度則更為合理,其具有在源碼中分隔明顯、易切分、結構完整、整體性強等特點[13]。傳統的函數級檢測粒度主要是利用抽象語法樹對源碼進行數據表征,導致源碼語法及語義信息出現丟失。針對以上代碼表征過程中出現的信息損失問題,本文引入代碼屬性圖來增加源碼控制信息,從而提高代碼表征能力[14]。
代碼屬性圖[15]作為一種代碼查詢的中間代碼表現形式,將抽象語法樹、控制流圖(control flow graph,CFG)和程序依賴圖(program dependency graph,PDG)三種代碼表現形式整合到一起,形成一個帶有標記的多重有向圖,故而所擁有的信息較單一抽象的語法樹來說要更加完整豐富。
1.1 源碼切片
作為圖形數據結構的源代碼屬性圖是無法直接用于模型訓練的,需要將代碼屬性圖中的信息轉換為合適的表征形式后才能進行后續研究。Suneja等人[16]通過圖神經網絡來學習代碼屬性圖中的特征,用于檢測代碼漏洞。但是鑒于圖神經網絡更傾向于關注圖結構信息而忽略節點信息,同時將代碼屬性圖中的信息轉換為圖神經網絡所能接受的輸入形式所需要付出的代價更為巨大。故而,為了降低預處理的復雜度、避免不必要的操作,同時合理利用代碼屬性圖中的信息,本文選用代碼屬性圖來進行源碼切片,進而得到函數級的代碼表征。
想要獲得函數級的代碼表征,需要先構建函數的代碼屬性圖,通過Joern[17]開源工具可以從源代碼中生成代碼屬性圖。Joern作為分析C/C++項目的開源工具,其無須經過編譯以及依賴庫就能夠生成整個項目或單個源文件乃至函數代碼片段的代碼屬性圖。如圖1所示,代碼屬性圖本質是一個有向圖,其節點表示源碼語句,其中有低級語言結構(如函數、變量和控制結構),也有高級語言結構(如HTTP端點)。代碼屬性圖中的每個節點都存在一個類型,其表征節點的源代碼語句類型,例如類型為“METHOD”的節點表示該源代碼語句為函數,“〈operator〉.assignment”表示該節點為賦值操作運算符。代碼屬性圖中的邊則表征源代碼語句間的關系,不同的邊類型代表不同的源代碼語句關系,其中AST、CFG、CDG、DDG等邊類型分別代表源代碼語句間的語法、控制、控制依賴及數據依賴等關系。
獲得代碼屬性圖后,需要對代碼屬性圖中的信息進行提取以獲得源碼漏洞切片,進而將切片經由word2vec模型轉換為向量形式,輸入神經網絡模型供其訓練。下面給出源碼切片部分定義[7]:
定義1 若程序p由一組函數(function)f1,…,fn構成,用p={f1,…,fn}表示,其中fi表示程序p中第i個函數,1≤i≤n。函數中一組有序語句(sentence) si,1,…,si,mi表示為fi={si,1,…,si,mi},其中si,j表示函數fi的第m條語句,1≤i≤n,1≤j≤mi。語句中一組有序的標記(token) ti,j,1,…,ti,j,wi,j表示為si,j={ti,j,1,…,ti,j,wi,j},其中ti,j,z表示語句的第z個token,1≤i≤n,1≤j≤mi,1≤z≤wi,j(標記可以是標識符、運算符、常量、關鍵字等)。給定其中一個函數fi,其生成的抽象語法樹表示為Ti。
定義2 給定程序p={f1,…,fn},其中fi={si,1,…,si,mi},si,j={ti,j,1,…,ti,j,wi,j}。對于一組漏洞語法特征,用V={vk}表示,其中1≤k≤β,β是語法特征數量。若代碼元素ti,j,z與漏洞語法特征vk相匹配,則稱該代碼元素為語法漏洞候選節點Csi,j,z。不同類型的漏洞有不同的語法特征,如與庫/API函數調用相關的漏洞語法特征在語法樹Ti上的函數類型就為callee,其表示函數的調用。
定義3 給定程序p={f1,…,fn},函數fi的代碼屬性圖G″i=(Vi,E″i)與一個漏洞候選節點Csj,其中Csj∈Vi。 若代碼屬性圖G″i中存在一組以Csj為起點的可達前向有序節點{ni,x1,…,ni,xsi}Vi,其中ni,xp有1≤x1≤xp≤xsi≤ci,ci是Vi的節點數目,則Csj的前向切片可表示為Gfj={ni,xi,…,ni,xsi};若程序依賴圖G″i中存在一組以Csj為起點的可達后向有序節點{ni,y1,…,ni,ysi}Vi,其中ni,yp有1≤y1≤yp≤ysi≤ci,則Csj的后向切片可表示為Gbj={ni,yi,…,ni,ysi};若Csj同時存在前向切片Gfj和后向切片Gbj,則Csj的源碼切片可表示為Vsj=Gfj∪Gbj。
由于實際獲得的樣本數據往往是成千上萬的源代碼行,其不能直接作為模型輸入數據進行處理,通過本節的源碼切片技術對源代碼進行處理后,可獲得函數級細粒度的源碼數據切片樣本[18]。
1.2 傳統差分進化算法
Store和Price于1997年首次提出了基于群體差異的啟發式并行搜索算法——差分進化(differential evolution,DE)。DE算法作為一種基于群體導向的隨機搜索算法,其主要包括初始化、變異、交叉以及選擇等操作[19]。由于差分進化算法涉及各種控制參數的設置以及進化策略的選擇,在缺乏理論分析和指導下容易陷入局部最優,導致收斂早熟甚至搜索停滯。
差分進化算法主要包括個體初始化、變異、交叉、選擇、終止五個步驟[20]。
由于模型啟動之初僅憑人為經驗不足以取得正確的模型超參數,同時傳統差分進化算法存在收斂速度緩慢、容易陷入局部最優解等問題,所以本文采用改進差分進化算法對漏洞檢測模型超參數進行初始化,以達到漏洞檢測模型冷啟動的目的。
1.3 BiGRU
Cho等人[21]在2014年提出了門控制循環單元(GRU)。GRU模型包含更新門和重置門兩種門結構,更新門決定了之前記憶信息到當前時間步的保存量,重置門決定了新的輸入信息如何與之前的記憶信息結合,精簡的結構使得GRU訓練速度比LSTM更快,同時能更好地捕捉文本信息[22]。設t時刻輸入為xt,GRU隱藏層的輸出為ht,GRU計算公式如下:
其中:Wr、Wz、W分別為GRU模型的權重矩陣,下標r、z則分別表示重置門和更新門;⊙代表矩陣對應的元素相乘;tanh和σ表示激活函數[23]。
傳統GRU屬于單向神經網絡,狀態總是從前往后,這就導致模型只利用了序列的上文信息,而沒有考慮序列的下文信息。針對此問題,Schuster等人[24]提出將兩個RNN結合起來同時考慮正向和反向序列,從而構成了BiRNN(bidirectional recurrent neural network)模型,此模型既可以記憶上文信息又能夠記憶下文信息。在BiRNN的基礎上將隱藏神經元換成GRU門控神經元,便可得到BiGRU模型。
對于給定的n維輸入表示為(x1,…,xn)T,在t時刻BiGRU的隱藏層輸出表示為ht,其計算公式如下:
其中:⊙代表矩陣對應的元素相乘;⊕代表矩陣對應的元素相加;GRU(x)函數表示對輸入的詞向量進行GRU非線形變換;wt、vt分別代表t時刻BiGRU模型所對應的前向和后向隱藏神經元的權重;t和t分別代表BiGRU模型的前向輸出和反向輸出;yt是BiGRU的輸出。
BGUR作為LSTM的改進模型,其存在模型參數相對較少、記憶信息保留更為完善、過擬合風險更低等優點,相較于其他神經網絡模型來說其更適合用來檢測源代碼漏洞。
2 改進差分進化漏洞檢測模型冷啟動方法
模型冷啟動主要用于推薦系統建立之初,由于缺乏足夠的數據積累和歷史交互信息從而導致的難以有效滿足業務需求的問題。模型冷啟動問題是機器學習中十分常見、無法回避的問題,因為任何機器學習模型都要經歷從無到有的過程。改進差分進化算法可以有效地解決此問題,將其引入源碼漏洞檢測模型中可以使得模型超參數進行自動尋參,達到模型自動學習的目的。
本文使用software assurance reference dataset(SARD)漏洞數據進行實驗,首先構造源代碼的抽象語法樹以生成語法信息,隨后結合程序依賴圖(PDG)以生成語義信息,最后形成具有語法語義特征的漏洞切片。源碼漏洞可以理解為可被利用的缺陷,缺陷預測和漏洞檢測對于數據的預處理手法都極為相似,在預測訓練階段都可以通過隨機欠采樣的方式對漏洞切片數據進行平衡預處理[25]。由于源代碼屬于文本形式數據,同時不同開發者的命名習慣不同,為了更好地突出代碼的語法及語義信息,需要先將文本形式的源碼做函數名和變量名的映射,隨后通過詞向量模型轉換為向量表示形式,使用改進差分演化算法對漏洞檢測模型進行自適應優化,不斷調整模型參數,最終得到一個最優漏洞檢測模型,算法流程如圖2所示。
實際檢測時,首先將源代碼進行切片,轉換為模型可接受的數據向量表征,隨后將該向量表征送入訓練好的模型中,得到源代碼的預測結果,最后結合源代碼的標簽計算模型的精確率、召回率、等評價指標并進行分析。
2.1 源碼切片提取算法
首先通過開源工具Joern構造源碼的代碼屬性圖PDG,對代碼屬性圖中的語法語義信息進行提取以獲得漏洞切片,隨后通過word2vec模型映射轉換為向量,最后使用差分進化算法對漏洞檢測模型進行優化。
算法流程如下:
a)初始化漏洞候選節點集Cs、漏洞切片集Vs、源代碼漏洞切片集Sv為空集、漏洞特征集V={′api′,′expr′,′array′,′poin-ter′},同時為程序p={f1,…,fn}中的每個函數fi(1≤i≤n)生成抽象語法樹Ti(1≤i≤n)和代碼屬性圖Gi(1≤i≤n)。
b)遍歷每個抽象語法樹Ti(1≤i≤n)中的節點ni,j(1≤i≤n,1≤j≤ti),如果該節點屬于漏洞特征集Vk(1≤k≤4)中的一種漏洞特征,則將該節點加入到漏洞候選節點集Cs中。
c)遍歷漏洞候選節點集Cs中的每個元素Csi(其中1≤i≤Ncs,Ncs是Cs集合中的元素數目),將該節點Csi作為起點前向遍歷其對應的代碼屬性圖G″i以得到前向切片Gfi;同時將該節點Csi作為起點后向遍歷其對應的代碼屬性圖G″i以得到后向切片Gbi;最后合并前向切片Gfi和后向切片Gbi以形成節點Csi的源碼切片Vsi(1≤i≤Ncs),并加入到源碼切片集Vs中。
d)遍歷漏洞切片集Vs中的每個元素Vsi(1≤i≤Nvs,Nvs是Vs集合中的元素數目),根據其對應的抽象語法樹Ti將Vsi中出現的每個節點轉換為源代碼以生成源代碼漏洞切片Svi(1≤i≤Nvs),并將Svi加入到源代碼漏洞切片集Sv中。
如圖3所示,以CWE-489漏洞為例,演示以代碼屬性圖為基礎的源碼表征提取過程,CWE-489是遺留的調試代碼漏洞,該漏洞可能導致調試代碼創建的意外入口點被利用。產生這種漏洞的原因是在開發過程中,為了調試或測試目的而設計的“后門”代碼未被及時刪除所導致的,這些代碼并不打算隨應用程序一起發布或部署,由于它們在設計或測試期間從未被考慮,并且完全超出了應用程序的預期運行條件,所以該漏洞導致的后門入口點會產生極高的安全風險。
2.2 改進差分進化算法
針對DE算法容易陷入局部最優解問題,改進算法采用動量原理對差分進化策略進行優化,針對停滯搜索、收斂速度緩慢等問題,改進算法采用劃分空間域的方法約束種群結構以改進此問題。
2.2.1 動量變異(進化)
個體每次進化都與上一時刻的速度和位置有關,公式表現為
其中:G(x)是梯度估計,式中表示適應函數在Xi,g處的導數,實際中可用變異前兩代的差分向量進行梯度近似估計,即G(Xi,g)|Xi,g-1-Xi,g-2|;λ是學習率,初速度設為0,即G(Xi,k)=0(k=0,1);Fi為變異縮放因子。
2.2.2 劃分空間域
引入個體空間的概念對種群個體進行約束,種群個體在初始化時不能屬于同一個個體空間。在選擇操作時,如果個體發生空間域沖突,保留最適應的個體,公式表現為
‖Xi,g-Xj,g‖gt;Ddomain(1≤i≠j≤Np)(10)
同時每次進化后的個體也應該滿足此條件。
改進差分進化算法的步驟如下:
a)初始化改進差分進化算法各參數;
b)在利用個體空間定義對種群個體進行約束的前提下,隨機初始化種群個體;
c)按照適應函數,計算所有個體的適應度值,同時更新個體最優極值pg,best和全局最優極值pG,best;
d)執行動量進化操作,根據個體上一代個體的位置和速度進行動量變異;
e)執行交叉操作;
f)在個體空間定義約束的前提下,對種群個體進行選擇操作;
g)按照適應函數,重新計算新種群中所有個體的適應度值,同時更新pg,best和pG,best;
h)檢查改進差分進化算法的迭代次數是否達到最大迭代次數Gmax或pg,best與pG,best趨于收斂,若達到上述條件則終止算法并輸出結果,否則跳轉至步驟d)。
差分進化算法對照如表1所示。
2.3 漏洞檢測模型
如圖4所示,漏洞檢測模型由BiGRU層和全連接層組成,最后經由激活層輸出分類結果。
提取到的漏洞切片經由word2vec模型映射為向量形式后,在改進差分進化算法的監督下進行模型訓練,首先漏洞切片向量經過BiGRU層提取漏洞特征后,經過全連接層和激活層最后輸出漏洞類型。
3 實驗分析
實驗使用本文提出的基于改進差分進化算法的漏洞檢測冷啟動模型,對SARD漏洞數據集進行漏洞檢測分析。本文實驗在阿里云服務器上進行,GPU配置為NVIDIA P4,CPU及內存為4核(vCPU) 16 GB,操作系統是CentOS 7.6 64位,使用Joern 0.3.1(JDK 1.7)進行源碼解析,Neo4j 2.1.5作為數據庫來存儲代碼屬性圖(PDG)等,編程語言以Python 3.8為主Shell為輔助語言,GPU的加速環境為CUDA 10.1、cuDNN 7.6.3,相關依賴包有TensorFlow-GPU 2.10.0,Gensim 3.4,h5py 2.10.0,NumPy 1.23.3,Keras 2.10.0,Ray 2.2.0,Hyperopt 0.2.7等。
3.1 度量標準
與一般二分類任務類似,本文采用準確率(accuracy)、查準率(precision)、召回率(recall)、F1指標、誤報率(FPR)、漏報率(FNR)等六個指標作為模型優劣的評價指標。其中TP(true positive)表示正確檢測漏洞樣本數目,TN(true negative)表示正確檢測正常樣本數目,FP(1 positive)表示錯誤檢測漏洞樣本數目(即誤報樣本數目),FN(1 negative)表示錯誤檢測正常樣本數目(即漏報樣本數目)。
3.2 數據集提取
本文使用SySeVR中使用的SARD(software assurance refe-rence dataset)數據集繼續模型訓練及驗證,該數據集是美國國家標準與技術研究院(national institute of standards and technology,NIST)的參考數據集,可用測試案例高達100 000個。該數據集將這些程序標記為無漏洞用例(good),有漏洞用例(bad)和有漏洞但已修補用例(fix)三種類型,SARD通過漏洞類型對用例進行分類編號,以CWE作為類型標識。
使用前文介紹的源碼切片提取算法對測試用例分別針對函數調用(api)、表達式(expr)、指針(pointer)、數組(array)四種類型的源碼漏洞進行切片提取,并統計其漏洞數和正常數,如表2所示。然后構建word2vec模型將語法義切片映射為深度神經網絡能夠處理的向量樣本送入模型繼續訓練,映射處理分為以下步驟:a)對源碼切片進行分詞處理,得到源碼切片的token序列;b)將用戶定義的自變量及函數映射為func_i和var_i;c)將映射處理后的語料庫送入到word2vec模型中訓練以得到詞向量模型;d)將之前映射處理后的源碼切片token序列逐一送入到剛剛訓練好的word2vec模型中,以得到漏洞檢測模型能夠接受的具有語法語義信息的源碼切片向量形式。
3.3 實驗與結果分析
本文著手提煉以下四個問題,并給出結論:
RQ1:什么樣的模型超參數可以加快模型收斂?
RQ2:什么樣的數據更適合模型預測?
RQ3:為什么模型會出現漏報和誤報?
RQ4:如何提高模型查準率和召回率?
對于問題RQ1,本文使用改進差分進化算法先對神經網絡模型進行預訓練,預訓練數據從四類樣本中各隨機抽樣1 000條正負樣本(四類共4 000條樣本)進行預訓練,其中為了樣本均衡性,正負樣本的比例定為1:1,預訓練迭代次數定為5次。改進差分進化算法的優化超參數分別是模型層數(layers)、dropout層丟棄率(dropout)、隱藏層的神經元個數(unit)、masking層的掩碼率,隱藏層的正向激活函數(activation)和反向激活函數(re_activation)分別固定為tanh及hard_sigmoid,適應度值為F1分數,種群個體數為10,改進差分進化算法的進化次數為20。從進化群體中選擇最優個體作為模型的超參數,在此基礎上將剩余樣本繼續進行訓練,并加大迭代次數為20次。
選擇BiGRU、BiLSTM、GRU、LSTM四種模型作為改進差分算法的優化對象,如圖5、6所示,分別給出各基礎模型和經過DE冷啟動優化后的各模型loss隨epoch變化曲線。
從圖中可以看出,經過差分進化算法冷啟動后的四種模型的loss收斂速度都有明顯加快,其中BiLSTM變化最為顯著。同時也說明模型超參數的選取對模型的訓練過程及結果具有顯著影響,如果選取不當,模型會出現收斂速度緩慢,甚至出現無法收斂的情況。此外,從實驗可以看出,BiGRU和BiLSTM較GRU和LSTM在漏洞檢測領域有較好的效果,說明模型的正確選取也極為重要。
下面給出收斂指標定義:
假設{x(k)}∈Rn是一個收斂到x*∈Rn的序列,即limk→+∞x(k)=x*,那么收斂指標定義為
由于實際實驗中x*無法準確得知,為比較模型收斂速度同時減少不必要的計算,本文選擇使用逐差法來近似計算收斂速度。其公式如下:
由表3可以看出,經過改進差分優化后的模型loss收斂速度顯著提高。其中BiGRU和BiLSTM兩種模型表現效果最佳,但是BiLSTM較BiGRU又更為復雜,需要的參數更多,相比之下BiGRU表現要更為優秀,下文選擇BiGRU進行縱向分析,其他模型同理。四種模型優化前后參數對比如表4所示。
由表5、6可知,BiGRU層為2層,dropout率為0.299 6,BiGRU神經元個數為128,masking掩碼率為0.159 3的個體綜合表現最優,其模型評價指標F1分數為0.423 0,score為0.698 2,recall為0.423 0,precision為0.423 0,TP為239,FN為0,FP為192,將其選為漏洞檢測冷啟動模型(以下簡稱冷啟動模型)的初始超參數,繼續進行訓練。其訓練20個epoch后,loss、precision、recall、F1隨epoch變化情況如圖7所示。
從圖7中可以看出,模型在第7個epoch左右loss和precision開始放緩,雖然后期precision仍然有略微上升,但是整體上升并不明顯。同時發現查準數(TP)、誤報數(FP)、漏報數(FN)和在第2個epoch時就已經有平穩的趨勢,在第6個epoch時也基本趨于穩定,由此看出差分進化算法選出的模型超參數能有效加速模型的收斂,使得模型在10個epoch內趨于穩定,很好地回答了問題RQ1。此外,選擇20%的樣本作為該模型的測試數據進行模型驗證,發現差分進化算法優化后的模型誤報率(FPR)是19%,漏報率(FNR)是8.89%,準確率(accuracy)是85.79%,查準率(precision)是81.19%,召回率(recall)是91.11%,F1分數是85.86%,其中誤報率高于漏報率,這是比較合理的,對于誤報率高可以由人工審查排除,但是如果漏報率高,可能會發生嚴重安全問題,因此模型應該具有較為嚴格的篩選條件。
對于問題RQ2,為了更清楚地表達,不失一般性地從TP、FP、FN中各取一條樣本繪制其輸入模型之前的詞向量三維圖,如圖8所示。
其中x軸表示詞向量維度(word dim),y軸表示標記(token)序號,z軸表示該token在某一維度上的值,可以看出樣本詞向量是以鋸齒形狀排布,在第5和第20維左右呈現最高波峰,在第15和第23維左右波谷達到最低。
為了更清晰地描述樣本特征,將樣本的詞向量取1范數作為樣本token模長繪制token模長線性圖繼續進一步分析,結果如圖9所示。
其中橫軸表示該樣本的token,縱軸表示對應token的模長。圖中的紅點是該樣本中的可疑漏洞爆發點(見電子版),其上的標注是該爆發點的token;可以發現TP模長圖中的可疑爆發點是wcslen,表明該樣本可能存在由函數wcslen引起的漏洞;FP模長圖中的可疑爆發點是recv,表明該樣本可能存在由函數recv引起的漏洞;FN模長圖中的可疑爆發點是操作符左括號“(”,表明該樣本的可疑爆發點未被正確找出。由此發現當樣本中可疑爆發點不能正確找出時,模型會出現漏報情況,將其認為正常樣本,但是當可疑漏洞點即使被正確發現,也可能存在誤報情況。從上面三個樣本的詞向量模長圖可以發現,TP和FP是高頻部分占主體,具體表現為折線圖劇烈變化,TN是低頻部分占主體,具體表現為折線圖平緩變化,但FP較TP變化又更為劇烈,波峰波谷差距明顯。
綜上發現模型更容易將詞向量頻率較高、振幅較大的樣本認為是漏洞,詞向量頻率較低、振幅較小的樣本認為是正常樣本。為了降低誤報率、減少誤報數,可以降低模型對詞向量頻率和振幅的敏感性,但是此舉同時也會增加模型的漏報率。對于可疑漏洞明顯,詞向量模長頻率變化較快、振幅較大的樣本模型更容易預測。
對于問題RQ3,將TP、FP、FN中的三個樣本送入模型中,依次得到各層輸出,繪制三維圖繼續進行深入分析。
TP、FP、FN經過第一層BiGRU后樣本輸出特征如圖10所示。與之前分析的結論相同,FN在經過第一層BiGRU后,樣本特征整體已經趨于平緩了,在第300~500維仍具有較大起伏,波峰被拉平,波谷被加深。TP和FP在經過第一層BiGRU后,樣本特征整體變化更加劇烈,在整個特征圖上波峰波谷差距明顯,呈現崎嶇不平的特征,但是FP較TP又更為劇烈,山峰和山谷交錯更為密集,由此更加印證了RQ2的結論。
對于問題RQ4,基于以上結論,想要提高模型精度,應該突出樣本特征,去除樣本中的冗余信息,正確標出樣本漏洞點,其直接體現在增強漏洞樣本的頻率和振幅,正常樣本則相反,其具體措施為適當增加樣本有效token數和詞向量維度,剔除正負樣本中可能導致預測結果發生偏移的token,減小樣本冗余信息。
如表7所示,隨機選取400條訓練樣本進行token統計,發現四類漏洞的樣本token數主要集中在200附近,其余少部分樣本token數在400及以上。
統計訓練樣本中各token出現的頻率,從表8可以發現詞頻前六的token分別是操作符(、)、;、,、=、*。同時統計正負樣本中獨有的各token出現頻率,如表9、10所示。
對比表9、10,將表9中頻繁出現而表10中較少出現的token在非漏洞樣本中隨機刪除,以突出非漏洞樣本特征;漏洞樣本則進行相反操作,以突出漏洞樣本特征。最后再繼續進行模型訓練,改進后模型評價指標隨epochs變化情況如圖11所示,各漏洞類型最終評價指標如表11所示。從表中可以發現漏洞評價指標較之前都有所提升,說明剔除樣本冗余信息可以提高模型的精確度,有效減小誤報率和漏報率,但是對于不同應用場景其效果表現有所差異。
表12中分別統計了目前幾種主流的超參數優化及本文提出的改進差分進化算法(IMDE)在以BGRU為基礎框架的源碼漏洞檢測模型上的F1分數、時間成本和最優超參數,其中時間成本是以改進差分進化算法(IMDE)的時間成本為單位進行統計的,per time是一次超參數優化花費的時間成本,total time是優化算法整體花費的時間成本。由表12中數據不難發現,改進差分優化算法(IMDE)和遺傳優化算法(GE)整體要優于基于TPE的貝葉斯優化算法(TPE)和隨機搜索優化算法(RS),其中改進差分進化算法(IMDE)的F1分數最高為90.84%,時間成本最低,遺傳優化算法(GE)、基于TPE的貝葉斯優化算法(TPE)和隨機搜索優化算法(RS)分別是IMDE的1.07倍、1.36倍和3.45倍。雖然改進差分進化算法(IMDE)在F1分數和時間成本上只略優于遺傳優化算法(GE),但是GE的網絡結構明顯比IMDE的網絡結構要復雜。綜上所述,改進差分進化算法在漏洞檢測模型上的表現要明顯優于目前主流的幾種超參數優化算法,可以為漏洞檢測領域的超參數優化提供新思路和新方法,具有廣闊的應用前景。
4 討論
在源碼漏洞檢測問題中,漏報率(FNR)和誤報率(FPR)是重要評價指標,其直接反映了模型的性能,與其他分類問題類似,模型的FNR高于FPR是難以接受的,因為這意味著會有更多漏洞樣本被錯誤地判定為正常樣本,這對于實際工程應用中很危險,所以本文認為適當的FPR高于FNR是合理且必要的,雖然此時可能需要投入部分人工審查成本,但為了安全起見這也是不可避免的。同時,如果正負樣本不均衡,也會影響到模型的判斷,其直接結果就是使得模型更傾向于將預測樣本判定為訓練樣本數量較多的一類,故在訓練過程中應注意平衡正負樣本數目。此外,如果存在樣本信息冗余、詞向量維度過多等問題,會導致模型出現訓練速度緩慢、準確率不高等情況。后續研究方向將考慮使用PCA降維將詞向量維度進行壓縮以縮小詞向量維度,同時引入數據增強技術來增加樣本的有效信息。除此之外,還可以考慮使用融合模型來對樣本進行聚合打分以預測樣本漏洞類型,從而進一步提高模型的準確度。
5 結束語
本文基于源碼的語法語義信息,提出改進差分進化算法的漏洞檢測模型冷啟動優化方法,解決了漏洞檢測模型在啟動之初超參數無法準確選定的問題。基于現有數據集進行實驗,結果表明改進差分進化算法可以有效加速模型的收斂,使得模型在10個epoch內達到穩定,在保證準確度的同時其收斂速度比基礎模型提升了2~3倍,并在后續改進實驗中使得模型各類型漏洞準確率(accuracy)在原有基礎上(85.79%)提高了1~3個百分點,同時其余指標均有所提升,充分證明了改進措施的實際有效性。同時,實驗還發現模型更容易將詞向量頻率較高、振幅較大的源碼切片認為是漏洞切片,而將頻率較低、振幅較小的源碼切片認為是正常切片,對于詞向量模長變化較快、振奮較大的切片,模型更容易正確預測。此外,對于實驗中樣本信息冗余和正負樣本鮮明特征混和的情況,本文還提出正負樣本鮮明特征交叉剔除的方法,以達到減小模型漏報率及誤報率的目的。最后,本文提出的優化策略和改進措施同樣適用于漏洞檢測領域等其他神經網絡分類模型,可以為漏洞檢測領域探索新方法和新模型提供思路。
參考文獻:
[1]中華人民共和國工業和信息化部.2022年上半年軟件業經濟運行情況[EB/OL].[2022-09-25].https://www.miit.gov.cn/gxsj/tjfx/rjy/art/2022/art_4a89904f3abb4d 5e82825a70f506af7b.html.(Ministry of Industry and Information Technology of the People’s Republic of China.The economic operation of the software industry in the first half of 2022[EB/OL].[2022-09-25].https://www.miit.gov.cn/gxsj/tjfx/rjy/art/2022/art_4a89904f3abb4d5e82825a70f506af7b.html.)
[2]李韻,黃辰林,王中鋒,等.基于機器學習的軟件漏洞挖掘方法綜述[J].軟件學報,2020,31(7):2040-2061.(Li Yun,Huang Chenlin,Wang Zhongfeng,et al.Survey of software vulnerability mining methods based on machine learning[J].Journal of Software,2020,31(7):2040-2061.)
[3]段旭,吳敬征,羅天悅,等.基于代碼屬性圖及注意力雙向LSTM的漏洞挖掘方法[J].軟件學報,2020,31(11):3404-3420.(Duan Xu,Wu Jingzheng,Luo Tianyue,et al.Vulnerability mining method based on code property graph and attention BiLSTM[J].Journal of Software,2020,31(11):3404-3420.)
[4]肖添明,管劍波,蹇松雷,等.基于代碼屬性圖和Bi-GRU的軟件脆弱性檢測方法[J].計算機研究與發展,2021,58(8):1668-1685.(Xiao Tianming,Guan Jianbo,Jian Songlei,et al.Software vulnerability detection method based on code property graph and Bi-GRU[J].Journal of Computer Research and Development,2021,58(8):1668-1685.)
[5]陳肇炫,鄒德清,李珍,等.基于抽象語法樹的智能化漏洞檢測系統[J].信息安全學報,2020,5(4):1-13.(Chen Zhaoxuan,Zou Deqing,Li Zhen,et al.Intelligent vulnerability detection system based on abstract syntax tree[J].Journal of Cyber Security,2020,5(4):1-13.)
[6]王劍,匡洪宇,李瑞林,等.基于CNN-GAP可解釋性模型的軟件源碼漏洞檢測方法[J].電子與信息學報,2022,44(7):2568-2575.(Wang Jian,Kuang Hongyu,Li Ruilin,et al.Software source code vulnerability detection based on CNN-GAP interpretability model[J].Journal of Electronics amp; Information Technology,2022,44(7):2568-2575.)
[7]Li Zhen,Zou Deqing,Xu Shouhuai,et al.SySeVR:a framework for using deep learning to detect software vulnerabilities[J].IEEE Trans on Dependable and Secure Computing,2022,19(4):2244-2258.
[8]Li Xingzheng,Feng Bingwen,Li Guofeng,et al.A vulnerability detection system based on fusion of assembly code and source code[J].Security and Communication Networks,2021,2021:article ID 9997641.
[9]Liu Shigang,Lin Guanjun,Qu Lizhen,et al.CD-VulD:cross-domain vulnerability discovery based on deep domain adaptation[J].IEEE Trans on Dependable and Secure Computing,2022,19(1):438-451.
[10]Liu Shigang,Lin Guanjun,Han Qinglong,et al.DeepBalance:deep-learning and fuzzy oversampling for vulnerability detection[J].IEEE Trans on Fuzzy Systems,2020,28(7):1329-1343.
[11]Lin Guanjun,Zhang Jun,Luo Wei,et al.Software vulnerability disco-very via learning multi-domain knowledge bases[J].IEEE Trans on Dependable and Secure Computing,2021,18(5):2469-2485.
[12]Zhang Yingzhou.SymPas:symbolic program slicing[J].Journal of Computer Science and Technology,2021,36:397-418.
[13]張獻,賁可榮,曾杰.基于代碼自然性的切片粒度缺陷預測方法[J].軟件學報,2021,32(7):2219-2241.(Zhang Xian,Ben Ke-rong,Zeng Jie.Code naturalness based defect prediction method at slice level[J].Journal of Software,2021,32(7):2219-2241.)
[14]況曉輝,劉強,李響,等.基于機器學習的軟件脆弱性分析方法綜述[J].計算機工程與科學,2018,40(11):2000-2007.(Kuang Xiaohui,Liu Qiang,Li Xiang,et al.Survey on software vulnerability analysis based on machine learning[J].Computer Engineering amp; Science,2018,40(11):2000-2007.)
[15]Yamaguchi F,Golde N,Arp D,et al.Modeling and discovering vulnerabilities with code property graphs[C]//Proc of IEEE Symposium on Security and Privacy.Piscataway,NJ:IEEE Press,2014:590-604.
[16]Suneja S,Zheng Yunhai,Zhuang Yufan,et al.Learning to map source code to software vulnerability using code-as-a-graph[EB/OL].(2020).https://arxiv.org/abs/2006.08614.
[17]ShiftLeft.Joern[CP/OL].[2022-09-25].https://joern.io/.
[18]張勇翔,李必信,鄭國梁.程序切片技術的研究與應用[J].計算機科學,2000,27(1):31-35.(Zhang Yongxiang,Li Bixin,Zheng Guoliang.The research and application of program slice techniques[J].Computer Science,2000,27(1):31-35.)
[19]丁青鋒,尹曉宇.差分進化算法綜述[J].智能系統學報,2017,12(4):431-442.(Ding Qingfeng,Yin Xiaoyu.Research survey of differential evolution algorithms[J].CAAI Trans on Intelligent Systems,2017,12(4):431-442.)
[20]陳丹鳳,趙才,張志飛,等.基于改進差分進化算法的微電網調度研究[J].廣西大學學報:自然科學版,2022,47(4):1018-1029.(Chen Danfeng,Zhao cai,Zhang Zhifei,et al.Research on microgrid scheduling based on improved differential evolution algorithm[J].Journal of Guangxi University:Natural Science Edition,2022,47(4):1018-1029.)
[21]Cho K,Van Merrienboer B,Gulcehre C,et al.Learning phrase representations using RNN encoder-decoder for statistical machine translation[C]//Proc of Conference on Empirical Methods is Natural Language Processing.Stroudsburg,PA:Association for Computational Linguistics,2014:1724-1734.
[22]胡艷麗,童譚騫,張嘯宇,等.融入自注意力機制的深度學習情感分析方法[J].計算機科學,2022,49(1):252-258.(Hu Yanli,Tong Tanqian,Zhang Xiaoyu,et al.Self-attention-based BGRU and CNN for sentiment analysis[J].Computer Science,2022,49(1):252-258.)
[23]曹宇,李天瑞,賈真,等.BGRU:中文文本情感分析的新方法[J].計算機科學與探索,2019,13(6):973-981.(Cao Yu,Li Tianrui,Jia Zhen,et al.BGRU:new method of Chinese text sentiment analysis[J].Journal of Frontiers of Computer Science and Technology,2019,13(6):973-981.)
[24]Schuster M,Paliwal K.Bidirectional recurrent neural networks[J].IEEE Trans on Signal Processing,1997,45(11):2673-2681.
[25]Agrawal A,Menzies T.Is“better data”better than“better data mi-ners”?[C]//Proc of IEEE/ACM the 40th International Conference on Software Engineering.New York:ACM Press,2018:1050-1061.
[26]楊望,高明哲,蔣婷.一種基于多特征集成學習的惡意代碼靜態檢測框架[J].計算機研究與發展,2021,58(5):1021-1034.(Yang Wang,Gao Mingzhe,Jiang Ting.A malicious code static detection framework based on multi-feature ensemble learning[J].Journal of Computer Research and Development,2021,58(5):1021-1034.)
[27]Zou Deqing,Wang Sujuan,Xu Shouhuai,et al.μμVulDeePecker:a deep learning-based system for multiclass vulnerability detection[J].IEEE Trans on Dependable and Secure Computing,2021,18(5):2224-2236.
[28]Harer J A,Kim L Y,Russell R L,et al.Automated software vulnerability detection with machine learning[EB/OL].(2018).https://arxiv.org/abs/1803.04497.
[29]Yamaguchi F,Wressnegger C,Gascon H,et al.Chucky:exposing mis-sing checks in source code for vulnerability discovery[C]//Proc of ACM SIGSAC Conference on Computer amp; Communications Security.New York:ACM Press,2013:499-510.
[30]Silva J.A vocabulary of program slicing-based techniques[J].ACM Computing Surveys,2012,44(3):1-41.