劉烊僑,楊頻,王炎
(四川大學網絡空間安全學院,成都610065)
隨著信息技術的飛速發展,互聯網和計算機的應用給社會帶來的影響是雙重的。它們帶來了便利,但也帶來了巨大的風險和隱患。近來,隨著各個行業的數字化水平的提高,信息安全問題變得越來越突出。漏洞的定義是指未經授權的人員可以非法利用的系統軟件和硬件缺陷。一旦信息系統的漏洞被惡意攻擊者所利用,信息系統的安全性將面臨極大的風險,可能造成不可估量的后果。例如,2017 年,黑客利用Windows系統漏洞,用比特幣勒索病毒對全球200 萬臺終端發起過攻擊,攻擊次數高達1700 萬余次。黑客可以利用辦公室漏洞進行高級持久威脅(APT)攻擊,傳播僵尸網絡,勒索軟件等。近年來,漏洞的數量和種類逐漸增多,因此軟件漏洞的管理和分析變得越來越重要。如果能夠有效地對漏洞進行分類和管理,不僅可以提高漏洞修復和管理的效率,還可以降低系統受到攻擊和破壞的風險,這對于系統的安全性能至關重要。因此,越來越多的研究將機器學習和深度學習應用到漏洞自動化分類中。但由于漏洞數量大、漏洞描述文本簡短且生成的詞向量空間具有高維和稀疏的特征,導致這些方法分類效果不理想。為解決上述問題,提出了一種基于深度學習的漏洞自動化分類模型(Word2Vec-CNN),目的在于提高漏洞自動化分類的準確度。使用Word2Vec 方法構建詞向量,利用CNN 神經網絡模型構造自動漏洞分類器,實現漏洞自動化分類。接著構建了其他三個模型,分別是One-hot-CNN、One-hot-RNN 以及Word2Vec-RNN 作為實驗對比的基線模型。然后將四種模型與傳統機器學習算法[1](神經網絡、貝葉斯算法)在單個CVSS[2]屬性分類上進行了比較,最后將四種模型在漏洞類別的分類效果上進行了比較,測試結果表明,提出的漏洞自動化分類模型(Word2Vec-CNN)綜合效果最優,有效地提高了漏洞分類的性能。
近年來,在文本分類[3]領域中已經提出了許多機器學習方法。其中,許多研究將文本分類技術用于漏洞分類這一場景下。Davari 等人提出了一種基于激活漏洞條件的自動漏洞分類框架[4],使用不同的機器學習技術(隨機森林、C4.5 決策樹、邏輯回歸和樸素貝葉斯)來構造具有最高F 度量的分類器。并使用Firefox 項目中的580 個軟件安全漏洞來評估分類的有效性。Shuai Bo 等人將基于LDA 的SVM 多分類器[5]用于漏洞分類領域,實驗結果表明SVM 分類方法在漏洞分類方面取得了較好的效果。Dumidu Wijayasekara 等人證明了樸素貝葉斯分類器根據漏洞的描述信息對漏洞進行分類的可行性[6]。Marian Gawron 等人在相同的數據集中,用樸素貝葉斯算法和簡化的人工神經網絡算法進行漏洞分類[1]。實驗結果表明,在漏洞分類中,人工神經網絡算法優于樸素貝葉斯算法。
盡管這些機器學習分類算法在許多領域都取得了令人滿意的結果,但是在漏洞分類這一場景下,由于漏洞數據量大、漏洞描述文本簡短且生成的詞向量空間具有高維和稀疏的特征,導致這些機器學習算法在處理這種高稀疏問題方面不是很有效。而且傳統方法大多基于人工提取特征,導致分類準確性不高。近年來,深度學習已在許多領域得到應用,對于自然語言領域也有重要的影響。Hwiyeol 等人將卷積神經網絡(CNN)和遞歸神經網絡(RNN)應用于大規模文本分類領域并取得了成功[7]。Wu Fang 等人提出了三種深度學習的漏洞檢測模型[8]預測二進制程序的漏洞,分別是卷積神經網絡(CNN)、長短期記憶(LSTM)和卷積神經網絡長短期記憶(CNNLSTM),實驗結果表明,漏洞預測的準確率達到了83.6%,優于傳統方法??梢钥闯觯疃葘W習應用于軟件漏洞檢測領域,并取得了良好的效果。
因此,為了更好地處理詞向量空間的高稀疏性并充分利用深度學習自動提取特征的優勢,提出了一種深度學習漏洞自動分類模型(Word2Vec-CNN),旨在于提高漏洞自動分類準確率。
Word2Vec-CNN 模型框架如圖1 所示?;赪ord2Vec-CNN 的漏洞描述文本分類模型主要分為4個層面,包括詞嵌入層、卷積神經網絡層、Max 池化層和全連接Softmax 分類層。①漏洞描述文本通過數據預處理劃分為單個詞并將單個詞送入詞嵌入層生成詞向量。②構建維度為n×k 的輸入矩陣,其中n 為文本句子中單詞的數量,k 為每個詞的embedding 維度。③輸入矩陣進入卷積層與m 個大小不同的卷積核分別做卷積。④在池化層采用max 池化的方式對卷積后的輸出結果做池化處理,壓縮數據。⑤池化層處理后得到的特征向量進入全連接層,先flattening 扁平化,然后乘以權重求和加偏置,激活函數處理,梯度下降優化權重,Softmax 輸出分類標簽。

圖1 Word2Vec-CNN模型框架圖
為了驗證有效性,使用國際認可的國家漏洞數據庫(NVD)[9]作為實驗數據。該數據集的源文件是一系列XML 文件,其中包含有關漏洞的全面信息,例如CVE 號、漏洞發布日期、CVSS_version、CVSS_score、CVSS_vector、漏洞文本描述等。NVD 漏洞數據庫的年度漏洞數量(2002 年-2019 年6 月)如圖2 所示,漏洞記錄總數為121164 條。

圖2 各年的漏洞數量
到2019 年6 月,CVE-Detail 中記錄了13 個漏洞類別,大部分漏洞可被標記為多個漏洞類別,如CVE-2012-5835 漏洞被標記為DoS、Exec Code 以及Overflow 三種漏洞類別,被分類為多個漏洞類別的漏洞對于模型訓練沒有價值,實驗中排除存在多個漏洞類別的漏洞。統計剩余漏洞信息,File Inclusion、Memory Corruption、Http Response Splitting 三種類別的漏洞分別只有69、60、163 條,由于數量過少對于深度學習模型訓練沒有價值,也一并排除。其他10 個漏洞類別的漏洞記錄如圖3 所示。

圖3 各個類別的漏洞數量
從漏洞文件中提取所需的漏洞信息,包括CVE號,漏洞文本描述以及攻擊矢量(access-vector)、機密性(confidentiality-impact)、完整性(integrity-impact)和可用性(availability-impact)四個CVSS 指標,以及從CVE-Detail 中提取漏洞類別。其中,機密性、完整性和可用性三種屬性均包括NONE、PARTIAL、COMPLETE三種取值作為分類的標簽。攻擊矢量包括ADJACENT_NETWORK、LOCAL、NETWORK 三種取值作為分類的標簽。
從NVD(National Vulnerability Database,國家漏洞數據庫)上獲取到的漏洞描述是計算機無法直接識別和計算的文本數據,不能直接放進CNN 卷積神經網絡進行處理,需要進行數據的預處理,預處理的過程如下:
(1)分詞
分詞是指將連貫的漏洞描述的文本信息切分為單個詞,將整個漏洞描述的文本信息轉化為可以由統計信息計算的最小語義單位。這個過程是漏洞文本預處理的第一步也是最重要的一步。對于用英文單詞描述的漏洞信息,單詞細分是很簡單的。只需要識別整段漏洞描述文本間的空格或標點來劃分單詞。例如CVE-2016-6045 漏洞的描述為:"IBM Tivoli Storage Manager Operations Center is vulnerable to cross-site request forgery which could allow an attacker to execute malicious and unauthorized..."分詞之后變為["IBM","Tivoli","Storage","Manager","Operations","Center","is","vulnerable","to","cross","-","site","request","forgery","which", "would","allow","an","attacker","to","execute","malicious","and","unauthorized",...]。
(2)數據清洗與小寫化
數據清洗是指去除分詞后數據中的標點符號以及單個字母,如“%”,“a”。小寫化是指對數據清洗后的單詞中的大寫字母轉變為小寫,如“Manager”經過小寫化后變為“manager”,方便更加準確的對詞進行統計,并在此之后生成詞匯表。通過對漏洞數據庫中的漏洞報告分析,確定漏洞描述的最大長度約為400 個單詞,并對長度不夠400 個單詞的漏洞描述進行補0。
(3)構建單詞向量空間
詞向量又稱為詞嵌入,是自然語言處理中語言建模和特征學習的統稱,將詞匯表中的詞映射為實數域上的向量,以便計算機進行處理和建模。Word2Vec[10]是一個多層的神經網絡,可以將詞向量化。在Word2Vec 中存在兩個模型CBOW 模型和Skip-gram模型,第一個模型的作用是已知當前詞Wt 的前后單詞(Wt-2,Wt-1,Wt+1,Wt+2)來預測當前詞,第二個模型的作用是根據當前詞Wt 來預測上下文(Wt-2,Wt-1,Wt+1,Wt+2)。兩種模型都包含輸入層,投影層,輸出層如圖4 所示。由于漏洞描述信息復雜多變,生僻詞較多,而Skip-gram 模型比起CBOW 模型準確率更高[10],更能準確處理生僻詞。因此,選擇Word2Vec 中的Skipgram 模型來構建詞向量。經過反復的實驗,Word2Vec參數設置如下時效果最好,特征向量100 維,窗口大小為5,訓練并行數為6。

圖4 Word2Vec兩種模型
CNN(卷積神經網絡)[11]最早應用于圖像識別[12]的領域中,將一張圖像看作是一個個像素值組成的矩陣,那么對圖像的分析就是對矩陣的數字進行分析,通過對矩陣做卷積運算,從而得到圖像中的特征。CNN 最大優勢在于網絡結構簡單,這使得它網絡參數數目少,計算量少,訓練速度快。之后,CNN 第一次被用于文本分類[13],并取得了不錯的效果?;贑NN 的文本分類主要過程如下:
(1)卷積神經網絡層將數據預處理后得到的400×100 矩陣作為輸入,400 為每條漏洞描述中單詞的個數,100 為詞向量維度。將輸入矩陣與卷積核做卷積得到若干個列數為1 的特征圖。由于漏洞描述中每句話的單詞數較少,并且采用大小不同的卷積核能更好地提取文本信息中的特征,因此,卷積核窗口設置為3,4,5 三種大小合適,步長為1。
(2)池化層將卷積神經網絡層中輸出的一維特征圖進行采樣,提取出最大值。最終池化層的輸出為各個特征圖的最大值,即一個一維的向量。Max 池化操作能減少文本矩陣補零操作噪聲影響,實驗得出的效果更好。
(3)最后一層采用全連接的方式,對池化后得到的文本特征向量進行全連接后,送入Softmax 分類器,用來預測類別概率。
One-hot[14]又稱為熱獨編碼,用于單詞的向量化。近年來,One-hot 被廣泛應用于文本分類領域中數據的預處理。因此,選擇One-hot 作為構建詞向量的基線方法。采用字符級One-hot 編碼的方式,即維度為1×n 的向量,向量所有位置上都是0,只有在對應字符的索引位置上是1,其中n 為字符表中所有字符的數量。如字符”b”索引位置為2,則對應的one-hot 碼為[0 0 1 0...]。
RNN 循環神經網絡[15]近年來被廣泛用于構建文本分類器,因此,選擇RNN 循環神經網絡作為分類器的基線方法。最終組合出三種基線模型,即One-hot-CNN、One-hot-RNN、Word2Vec-RNN。
實驗是在PC 上進行的,處理器為Intel E3-1230 V5,3.40 GHz 和8.00 GB。
內存,運行Windows 7 操作系統。編程使用PyCharm 2017 和TensorFlow 框架。
CNN 參數設定如下:
(1)卷積核設為3,4,5 三個大小,每個大小的卷積核數量設為128,每個卷積核步長設為1。
(2)輸入層的正向傳播和隱藏層使用ReLU 作為激活函數,而輸出層使用Softmax 作為激活函數。
(3)使用TensorFlow 中的dropout 功能來防止過度擬合,dropout 值設為0.5。
(4)使用批量梯度下降優化CNN 模型,批量大小設置為128,學習率設置為1e-3。
(5)訓練輪數epoch 設置為20。
收集2000 年至2019 年6 月NVD 上所有漏洞的文本信息以進行統計,對于單個CVSS 屬性(Confidentiality、Integrity、Availability 以及Access)的分類,分別選擇其中20000 個作為訓練集,2000 個作為驗證集,2000個作為測試集。對于漏洞類別的分類,選擇其中40,000 個作為訓練集,并使用5000 個作為驗證集,5000個作為測試集。具體的數據樣本列于表1。

表1 數據樣本
(1)評估指標
為了評估所提出的漏洞自動分類模型(Word2Vec-CNN)的性能并比較不同算法之間的性能,需要統一的評估標準。采用多類混淆矩陣來評估模型分類性能,如表2 所示。

表2 混淆矩陣
其中i 代表漏洞的類別。根據混淆矩陣的準確性、召回率、準確率和F1 得分用作評估指標TFI-DNN 模型。每個指標的計算公式如下。
Accuracy(i):表示測試次數的比率實例按漏洞i 正確分類到總數中測試實例數。計算公式如下:

Recall(i):表示正數的比例按漏洞正確分類的示例到數字實際的正面例子。計算公式如下:

Precision(i):代表正數的比例按漏洞正確分類的示例到數字實例被歸類為積極實例。計算公式如下:

F1-score(i):結合了召回率和準確率。計算公式如下:

F1 分數的值介于0 到1 之間,并且數值越高,漏洞分類模型的性能越好。
(2)單個CVSS 屬性分類的比較結果
機密性、可用性、完整性以及攻擊矢量的比較結果如表3 所示。
比較結果中,可以看到,在機密性(Confidentiality)、可用性(Availability)、完整性(Integrity)三個屬性的分類中,Word2Vec-CNN 測試精度比傳統的神經網絡算法分別高出1.9%、1.3%、4.3%。對于攻擊矢量(Access)屬性則比神經網絡算法低1.2%,由于Access 屬性相比于其他三個屬性的特征更易提取和識別,因此,機器學習算法在Access 屬性的分類上優于深度學習算法,這個結果是合理的。從四個CVSS 屬性的分類結果中可以看出,Word2Vec-CNN 模型的分類效果均高于其他三個基線深度學習模型。

表3 單個CVSS 屬性的分類準確率
(3)漏洞類別分類的比較結果
將提出的Word2Vec-CNN 模型與三個基線深度學習模型在漏洞類別的分類上進行了比較。比較結果如表4 所示。

表4 漏洞類別分類結果
根據實驗比較結果,可以看到,Word2Vec 漏洞的整體性能優于其他三種模型。具體而言,與One-hot-CNN、One-hot-RNN 和 Word2Vec-RNN 相 比,Word2Vec-CNN 模型分類準確度分別高1.4%、1.2%和0.4%,F1 評分指標分別高1.7%、1.2%和0.7%。以上實驗結果驗證了Word2Vec-CNN 在漏洞自動分類中的有效性。同時,Word2Vec-RNN 模型的分類效果接近Word2Vec-CNN 模型,比One-hot-CNN 模型與Onehot-RNN 模型的分類效果更好。
取得以上效果的原因,可以歸納為以下2 點:①由于One-hot 生成向量空間并不全面,沒有考慮到上下文詞語間的關系,而Word2Vec 則是根據上下文的詞向量來生成當前詞向量,這樣更好地保留了上下文語義間的關系,使得Word2Vec 的模型在實驗中表現更好。②由于RNN 模型的復雜性,在處理長序列時容易出現梯度爆炸問題,在模型訓練的過程中,RNN 循環神經網絡模型比起CNN 卷積神經網絡模型更難訓練,所消耗的時間更長。因此,提出的Word2Vec-CNN 模型在漏洞類別分類的過程中取得的效果更好。
為了根據漏洞的所屬類別以及單個漏洞屬性更好地分析和管理漏洞,提高系統的安全性能,降低系統被攻擊和損壞的風險,將深度神經網絡應用于軟件漏洞的分類,提出了一種漏洞自動分類模型(Word2Vec-CNN),并詳細討論了Word2Vec 和CNN 的構建過程。用NVD 上的數據集比較了Word2Vec-CNN 模型與三個基線深度學習模型(One-hot-CNN、One-hot-RNN 和Word2Vec-RNN)和傳統的機器學習算法(神經網絡、貝葉斯算法)在單個漏洞屬性上的分類效果,接著比較了Word2Vec-CNN 模型與三個基線深度學習模型在漏洞類別上的分類效果。在這兩方面的綜合評價指標上,Word2Vec-CNN 模型取得的效果更好,展示了Word2Vec-CNN 在漏洞分類中的有效性。