任家東,王 倩+,王 菲,李亞洲,劉佳新
1.燕山大學 信息科學與工程學院,河北 秦皇島066001
2.河北省計算機虛擬技術與系統集成實驗室,河北 秦皇島066001
計算機網絡技術的迅猛發展,使得計算機網絡在經濟生產、社會生活、教育、科技、國防等領域發揮著極其重要的作用。網絡在為人們帶來諸多便利的同時,也隨之產生了一系列的安全問題,如惡意攻擊、盜竊機密數據、種植病毒等。通過網絡漏洞進行網絡攻擊是攻擊者最常采用的手段之一,不僅會對大眾的生活產生嚴重的影響,威脅人們的信息安全、財產安全,甚至會泄漏國家機密等,嚴重危害國家安全。近年來新發現的未知漏洞數量相比過去增長迅速,根據國家信息安全漏洞庫數據(China National Vulnerability Database,CNNVD),網址為http://www.cnnvd.org.cn/,2018 年每個月平均發現未知漏洞多達2 013 個。當網絡管理者發現未知的漏洞時,需要整合漏洞信息以郵件的方式提交到國家信息安全漏洞庫,再由工作人員進行漏洞分析,若干個工作日后才可以將漏洞的類別、危害值等信息發布在漏洞平臺。這不僅會給工作人員造成巨大的工作量,更重要的是無法及時獲取未知漏洞的類型及危險值,進而無法采取防護措施。面對海量增長的漏洞,如何對新發現的未知漏洞進行及時有效的分析和管理,是十分重要且有待解決的問題。低效率的人工分類方法已無法滿足目前的需求,漏洞自動化分類成為漏洞相關研究的重點。
目前,機器學習算法被大量應用在文本數據的研究中[1-2],如分析文檔數據的相似度、文本的語義以及情感態度等。比如,Baharum等人總結了機器學習在文本分類領域的研究進展[3],并探討了在處理文本分類中所遇常見問題的可能解決方法,肯定了這項技術未來的發展。在計算機漏洞描述的文本信息中,也包含了大量關于漏洞特征的信息,因此很多研究者利用機器學習的方法,對漏洞文本進行有效的分析,從而實現對漏洞的自動分類,并取得了進展。Li 等人提出了一種基于漏洞特征包括錯誤、資源的積累消費、嚴格的時間要求和復雜的環境與軟件之間的互動的軟件漏洞分類方法[4]。Gawron 等人提出了基于機器學習的漏洞分類方法[5],該方法中應用了文本預處理技術對漏洞文本進行預處理,分別介紹和構建了基于樸素貝葉斯和神經網絡的漏洞分類器,評估了機器學習算法在漏洞分類上的可行性。Shuai 等人提出了一種基于隱含狄利克雷分布模型(latent Dirichlet allocation,LDA)和支持向量機算法(support vector machine,SVM)的漏洞自動分類器[6],該方法將單詞位置信息引入加權位置LDA 模型(weighted location LDA,WL-LDA)中,通過在主題之外生成向量空間,然后再構建基于漏洞分布的HTSVM(Huffman tree SVM)多分類器;在美國國家通用漏洞數據庫(National Vulnerability Database,NVD)上進行實驗,實驗表明該方法可以獲得更高的分類精度和效率。Davari 等人提出了一種基于激活漏洞條件的自動漏洞分類框架[7],使用不同的機器學習技術,來構建具有最高F-度量的分類器,以標記未知漏洞。基于漏洞之間相關性的漏洞分類方法被Zhang等人提出[8]。該方法是基于詞頻-逆文本頻率(term frequency-inverse document frequency,TFIDF)和貝葉斯算法的漏洞自動分類模型,在Linux漏洞數據上進行實驗,實驗結果表明了該方法的有效性,使用這種方法能有效分析漏洞之間的相關性并將漏洞進行分類。
這些機器學習分類算法在許多領域取得了很好的效果,而且許多研究人員已經驗證了機器學習算法在漏洞分類領域的有效性。但由于漏洞的描述信息為短文本,漏洞的數量和種類又較多,使得漏洞特征詞的提取變得困難,以至漏洞分類效果的提升并不明顯。因此本文提出的S-C特征提取方法,通過結合詞語的類間重要程度和類內重要程度的綜合函數C,計算出詞語對于類別的重要程度。再利用詞語對于類別間的信息熵S,來弱化對于分類較為混亂的詞語的重要程度。最終選取得到較好的特征詞集。并利用關聯了特征詞集間相互關系的平均一階依賴貝葉斯模型(averaged one-dependence estimators,AODE)對漏洞數據集進行分類。使用美國國家漏洞數據庫(National Vulnerability Database,NVD)中的文本數據進行訓練模型和測試,網址為http://nvd.nist.gov/。實驗顯示,本文構建的漏洞自動分類模型能有效提高漏洞分類性能。
數據預處理是對數據分析的第一步。圖1 是數據預處理流程圖。首先,對漏洞數據進行獲取,提取有效字段;其次,對描述漏洞的文本進行分詞操作,去除停用詞以減少數據冗余;再次,利用基于熵改進的S-C算法提取特征詞;最后,通過特征集合建立樣本的詞語向量,完成漏洞文本數據預處理。

Fig.1 Data preprocessing flow chart圖1 數據預處理流程圖
目前的漏洞數據庫主要是結構化的漏洞數據庫,結構化漏洞庫中的漏洞數據具有統一的格式,以統一格式收集、存儲和發布。主要包括:美國國家漏洞數據庫NVD、開源漏洞數據庫(Open Source Vulnerability Database,OSVDB)和中國國家漏洞數據庫CNNVD。中國國家信息安全漏洞庫將漏洞分為SQL(structured query language)注入、資源管理錯誤、數字錯誤、緩沖區溢出等26個類別,實現了對漏洞的分類化管理。本文以國際公認的美國國家計算機通用漏洞數據庫NVD 中的descript 漏洞描述字段作為實驗數據。并依據中國國家漏洞數據庫CNNVD 中的漏洞類別,根據NVD 與CNNVD 中每條漏洞的CVE(common vulnerabilities&exposures)編號,確定漏洞的漏洞類型,完成漏洞數據的獲取。
文本特征提取[9]是指基于一定的評估標準,從漏洞文本描述的詞語中,選擇出能夠有效描述漏洞的類別信息的關鍵詞。由于本文分析的數據是文本類型的數據,在對漏洞進行分詞后,產生了大量的詞語,多達6萬多個。這使得漏洞樣本在向量化時產生了巨大維度的向量,在后續利用機器學習算法進行文本挖掘時,效率以及準確率變得異常低下。因此要對文本樣本進行特征詞的提取,選出對分類貢獻較高的詞語,作為樣本的特征。通過特征詞選取,可大大降低漏洞特征的向量維度,節省時間和空間資源,提高分類器的準確率和效率。本文通過分析漏洞樣本文本的特征,定義了綜合函數C來表示詞語對于類別的重要程度,并結合信息熵S最終確定出S-C算法來提取數據集的特征集。
2.2.1 綜合函數C
一個詞語對于類別的重要程度,通過兩方面確定。一方面是詞語對于類別內部的重要程度,詞語在本類中出現的文檔數越多,并且分布得越均勻,說明這個詞語能夠很好地代表本類。但若某個詞語在其他多數類別中,都很頻繁地出現,則也不能很好地代表本類漏洞。因此另一方面,是詞語在類間重要程度,若詞語在本類出現的頻率大于在全部樣本中出現的頻率,說明這個詞語可以更好地代表本類漏洞,通過這兩方面確立出綜合函數C。以下給出公式中用到的符號說明以及相關定義:N表示漏洞樣本的總數量;Di表示類別i的漏洞樣本數量;dit表示類別i中詞語t出現的漏洞樣本數量;ft表示詞語t出現的頻數;fit表示類別i中詞語t出現的頻數;pit=表示在類別i中詞語t的平均分布頻數;pt=表示在總樣本中詞語t的平均分布頻數。
定義1(類內重要程度I)若詞語t在第i類漏洞中頻繁出現,且均勻分布在各個漏洞上,則說明詞語t對i類內的重要程度越高,對于漏洞類別i的判定有著更加重要的意義。公式如下:

定義2(類間重要程度E)若詞語t在第i類漏洞中的分布頻數大于詞語t在總樣本中分布頻數,則認為詞語t對第i類別有著比對其他類別更重要的意義。公式如下:

定義3(綜合函數C)代表詞語t對于類別i的重要程度,由類間重要程度與類內重要程度相乘得出。公式如下:

2.2.2 S-C 特征提取算法
在選取漏洞特征詞時,是根據詞語對分類的重要程度的值來選取,但是由于特征詞和漏洞類別之間不是非此即彼的關系,即同一特征詞可能對多個類別都表現出具有重要的意義。此時若依舊選取此詞語作為關鍵詞,則會對分類的效果產生負面影響。為了解決這一問題,引入信息熵來弱化這些詞語的重要程度。使用信息熵S與綜合函數C相結合的方式,應用于特征提取上。
定義4(信息熵[10])用于信息論中,是度量信息量大小的一個概念。越是有序的系統,信息熵越低;相反,越是混亂的系統,信息熵就越高。因此,也用信息熵來度量系統有序化的程度。其公式如下:

定義5(特征詞t的信息熵S(t))表示特征詞t隸屬類別的混亂程度。S(t)越大,表示特征詞t越無法較好地區分出類別。n表示漏洞類別數,公式如下:

定義6(特征詞的S-C值)表示利用S-C算法計算出的特征詞t對于類別i的重要程度值。公式如下:

算法1S-C特征提取算法

目前有大量的機器學習模型以及算法應用于文本分類的研究中,大量學者將貝葉斯分類器運用到文本分類的領域中。貝葉斯是一種結構簡單且分類效率高的分類技術,在應用于某些領域的分類問題中能夠與決策樹、神經網絡相媲美,且運行效率很高。貝葉斯分類器的原理,是根據樣本的先驗概率以及條件概率,計算出待分樣本的后驗概率。由于不是將樣本絕對地分給某一類,而是通過計算待分樣本的后驗概率,去確定樣本的類別,具有最大概率的類就是待分樣本所屬的類別。這在理論上保證了分類器具有最小概率誤差。因此貝葉斯分類器非常適用于處理多分類問題。考慮到本文研究數據集的特征,由于漏洞分類是多分類問題,且數據量龐大,為了保證準確率以及運行效率,本文選取貝葉斯分類器作為研究對象。
樸素貝葉斯分類模型(naive Bayes classifier,NB)[11]的核心是具有條件獨立性假設,也就是每一個屬性獨立地對分類結果發生影響。這樣的假設降低了模型計算過程的復雜性,從而大大提高了分類的效率。樸素貝葉斯分類模型的原理,是根據樣本中類別ci的先驗概率p(ci)和類別ci與樣本X的條件概率p(X|ci),計算出后驗概率p(ci|X),選擇后驗概率最大的類別即為樣本所屬類別。
假設數據集D={(X1,X2,…,Xm,ci),…},其中X={X1,X2,…,Xm}為某一個樣本的特征向量,ci為此樣本所屬類別。在對一條未知類別的樣本x={x1,x2,…,xm}進行分類時,選取p(ci|x)最大的ci作為其所屬的類別。計算公式如下所示:

由于樸素貝葉斯分類模型的條件獨立性假設,計算公式簡化為:

樸素貝葉斯的條件獨立假設,假定了屬性之間是相互獨立的,即詞與詞之間不存在任何依賴關系。顯然,這樣的獨立性假設在實際的漏洞描述文本中是不成立的。在有些類別中,多個詞語經常同時出現,因此不能忽略詞語之間的依賴關系。本文使用樸素貝葉斯的改進算法——平均一階依賴貝葉斯模型(AODE)[12]來對漏洞進行分類。AODE 的分類準確度要優于樸素貝葉斯,這主要得力于其自身的集成學習機制。AODE 是一個集成的一階依賴貝葉斯模型,在其每一個子模型中,令所有特征詞都依賴于同一個特征詞節點,即超父節點,每一個特征詞都輪流做一遍超父節點。這樣就關聯了所有特征詞之間的關系,改善了樸素貝葉斯中認為每一個特征詞都相互獨立的缺點。
AODE分類器中有兩個公共的父節點,除了類別節點作為父節點外,每個特征詞節點都會輪流作為其他剩余特征詞節點的父節點。若樣本的特征向量中,有m個特征,AODE分類器就會形成m個分類器子模型,其中每一個子分類器結構都是一個1-依賴分類器,最終將這些1-依賴分類器進行平均。假設給定一個具有4 個特征值的樣本集D={(X1,X2,X3,X4),(X1,X2,X3,X4)…},其AODE分類器中的4個子分類器如圖2 所示,4 個子分類器分別以類別和一個特征詞節點作為父節點。

Fig.2 AODE submodel diagram圖2 AODE子模型圖
具有m個特征{x1,x2,…,xm},n個類別的數據集,共構成m個子模型。子模型的后驗概率計算公式如下:

接下來對子模型求平均值,選擇后驗概率最大的類別作為樣本所屬類別,AODE 分類器計算公式如下:

算法2AODE漏洞分類器算法
輸入:漏洞訓練數據集D={X1,X2,…,Xm},漏洞測試數據集X。
輸出:每個漏洞測試樣本的類別C(X)。
步驟1輪流使每個特征詞節點作為父節點,構造m個1-依賴分類器;
步驟2對每一個1-依賴子分類器,利用式(9)計算漏洞樣本的后驗概率;
步驟3得到每一個1-依賴子分類器后驗概率后,利用式(10)求平均值;
步驟4選擇平均后驗概率最大的漏洞類別存儲于C(X)中;
步驟5輸出測試集漏洞類別C(X)。
可以看出,與樸素貝葉斯相比,AODE 分類器關聯了屬性間的聯系,弱化了條件獨立性假設,使分類器算法更加符合實際需求。
通過對實驗數據的獲取,得到了漏洞文本分類實驗所用的漏洞數據。包括漏洞ID、漏洞描述文本、漏洞對應的類別標簽。接下來要通過獲取的漏洞樣本,訓練漏洞分類模型,要進行以下步驟。首先,對漏洞文本數據進行預處理,進行分詞和停用詞過濾,去除數據冗余。其次,利用本文提出的S-C特征提取算法進行漏洞特征詞的提取,利用獲取的特征詞集合對漏洞樣本進行向量化。再次,利用AODE 分類器對漏洞樣本進行分類。最后,利用準確率指標對比不同的特征提取算法和不同分類器模型,驗證本文提出模型的優越性。
為了驗證本文提出的漏洞自動分類算法的準確性,實驗在Windows 7操作系統,Intel?CoreTMi7-4510U處理器,主頻為2.60 GHz,內存為8.00 GB的PC上進行。在Anaconda3版本的Spyder上進行編程建模,完成建模。
本文以國際公認的美國國家計算機通用漏洞數據庫NVD 中的descript 漏洞描述字段作為實驗數據。并依據中國國家漏洞數據庫CNNVD 中的漏洞類別,根據NVD與CNNVD中每條漏洞的CVE編號,確定出NVD 漏洞庫中每條漏洞的類型,得到帶有類別標簽的實驗數據。實驗數據總共包含NVD漏洞庫在1999—2018年間發布的72 005條漏洞記錄。截至2018年年底,NVD漏洞數據庫共包含了24種漏洞類型。其中包含了1 個未知漏洞類型,這類漏洞多達15 521 條,且屬于未知類別的類型,因此對漏洞分類并無實際作用,將這類漏洞去除。最終得到本實驗所用的56 484 條漏洞數據。從中選取20%的漏洞數據進行實驗,利用其中90%的數據作為訓練集,10%的數據作為測試集進行實驗,實驗所用漏洞數據的年份分布以及類別分布,如圖3和圖4所示。

Fig.3 Year distribution of experimental data圖3 實驗數據年份分布圖

Fig.4 Class distribution diagram of experimental data圖4 實驗數據類別分布圖
本文根據進行實驗所需的漏洞數據,利用Python導入漏洞信息,包括CVE 編號、漏洞文本描述、漏洞類型三部分。部分數據如表1所示。
4.3.1 漏洞數據預處理
(1)對漏洞文本數據進行分詞
分詞是文本數據預處理過程中最關鍵的步驟之一,目的是將連貫漏洞文本描述語句切分成一個一個的獨立的單詞,以便將整個文本信息轉化為可以進行數學統計及復雜分析的詞語集合。由于本文漏洞的描述信息是英文文本,而英文文本是以單詞為單位,詞與詞之間由空格或者標點符號分隔開來,因此只需要以空格或者標點作為分隔符,便可以將整個英文文本切分成獨立的詞語。

Table 1 Vulnerability data sheet表1 漏洞數據表
實驗使用正則表達式進行漏洞描述文本的分詞。如編號為CVE-1999-1431 的漏洞文本描述為“ZAK in Appstation mode allows users to bypass the"Run only allowed apps" policy by starting Explorer from Office 97...”。經過分詞操作后,得到了單詞的集合為['zak','in','appstation','mode','allows','users','to','bypass','the','','run','only','allowed','apps','','policy','by','starting','explorer','from','office','97'...]。
(2)對漏洞文本數據進行停用詞過濾
停用詞過濾是指去除掉在文檔樣本中頻繁出現,但是對文本的內容、類別等不提供或提供非常少量信息的詞,如連詞、助詞、介詞以及代詞等。另外,對于漏洞描述文本來說,“vulnerability”“allow”等詞對于漏洞的分類幾乎不能提供實質性信息,因此這類詞語也應去掉。通過去除停用詞,以大大減少文本數據的冗余信息,從而提高數據的處理效率以及后續分類算法的準確性。
如編號為CVE-1999-1431 的漏洞文本經過去除停用詞后得到的詞語集合為['zak','appstation','mode','users','bypass''run','only','allowed','apps','policy','starting','explorer','from','office','97','a pplications'...]。此漏洞文本經過分詞處理后,得到52個詞,經過過濾停用詞后詞語個數變為30 個。可見,去除停用詞可以減少數據的冗余。
4.3.2 使用S-C 特征提取法提取特征
實驗數據通過上述的文本預處理操作之后,得到候選的特征詞集。使用本文提出的S-C特征提取法進行特征詞的提取。首先計算每個詞語的綜合函數C與信息熵S,其次計算出每個詞語的S-C值。下面以SQL注入類別中的幾個詞語為例,可以看出,由于信息熵的作用,詞語的重要程度排序發生了改變。本實驗中部分詞語的C值、S值、S-C值,以及詞語重要程度排序如表2所示。

Table 2 WordC/S/S-C value sort table表2 詞語C/S/S-C 值排序表
選取特征時,將每個漏洞類別的特征詞根據S-C值進行降序排序,每個類別分別選取前n個詞語共同構成最終的特征詞集合。本實驗最終選取每個類別前10個特征詞構成特征集合,實驗選取的特征如表3所示。
4.3.3 建立特征詞向量
要通過機器學習算法對文本數據進行分析,要先把文本信息轉化成離散的數字表示的向量,以便利用算法對文本數據進行操作。利用經過預處理得到的一個個漏洞的詞集合,根據S-C特征提取法提取的n個特征,將每一個漏洞描述文本信息轉換成一個n維的向量vi={t1,t2,…,tn}。由于漏洞文本屬于短文本,特征詞是否出現是決定類別的關鍵,本實驗并不關心特征詞出現的頻率。將漏洞樣本的向量化定義為:如果特征詞tj出現在第i個漏洞詞集中,則令vi(j)=1;如果特征詞tj沒有出現在第i個漏洞詞集中,則令vi(j)=0;以此完成漏洞的向量表示。例如,CVE-2001-1376的向量表示如表4所示。
4.3.4 使用AODE分類器分類
實驗利用經過預處理和向量化的漏洞數據作為實驗數據,使用AODE分類器訓練出分類模型。
為驗證本文提出漏洞分類器的有效性,實驗用不同的特征提取方法和不同的分類器算法分別對漏洞數據進行分類,并利用準確率Accuracy作為評價指標,評價分類器的優劣。

Table 3 Set of feature words表3 特征詞集合

Table 4 CVE-2001-1376 vectors表4 CVE-2001-1376的向量表示
4.4.1 評價指標
為了對特征提取算法以及分類器算法進行優劣的比較,需要統一評價標準。本文使用準確率Accuracy作為評價指標,準確率是指漏洞樣本屬于分類器所判定的漏洞類別的概率。公式如下所示:

其中,TPi是指屬于第i類的漏洞樣本被分類器判定為第i類的漏洞個數;FPi是指屬于第i類的漏洞樣本被分類器判定為其他類別的漏洞個數。因此,利用準確率這一評價指標,可以計算出分類器將漏洞分對類別的比例,以判定分類器的優劣。
4.4.2 不同特征提取方法的比較
為了驗證本文提出的S-C特征提取方法的有效性,實驗使用TFIDF 特征提取法[13]、綜合函數C特征提取法和S-C特征提取法分別提取特征,利用樸素貝葉斯分類器進行漏洞分類,最終將漏洞分類的準確性進行比較,實驗結果如圖5所示。

Fig.5 Comparison chart of feature selection accuracy圖5 特征選擇準確率對比圖
由實驗結果可以看出,本文所提出的綜合函數C特征提取法相比較TFIDF 特征提取法,準確率高出2.6 個百分點。驗證了綜合函數C,利用漏洞詞語類間重要程度和類內重要程度,共同作為判定漏洞詞語對區分類別的貢獻程度的合理性。其次,基于信息熵改進的S-C特征提取法,相較TFIDF 特征提取法和綜合函數C特征提取法,準確率分別高出5.6個百分點和3個百分點。驗證了基于信息熵改進的S-C特征提取法能夠有效地提高特征的選取質量,選取出了對分類更加有意義的特征詞。
4.4.3 不同分類算法的比較
為了驗證AODE 分類算法對于漏洞數據集的適用性,本文選取K近鄰分類算法(K-nearest neighbor,KNN)[14]、決策樹(decision tree,DT)[15]分類算法、樸素貝葉斯分類算法(na?ve Bayes,NB)與平均一階依賴貝葉斯分類算法(AODE)進行對比。實驗結果如圖6所示。

Fig.6 Comparison of classifier accuracy圖6 分類器準確率對比圖
根據實驗結果對比可以看出,決策樹分類算法和K近鄰分類算法在漏洞數據集上的準確率分別為70.3%和74.8%,要低于樸素貝葉斯分類器和AODE分類器的準確率。說明在短文本的分類中,貝葉斯分類器有著良好的適用性。S-C-AODE 漏洞分類算法的準確率為86.9%,分別高于S-C-KNN 分類器和S-C-DT 分類器12.1 個百分點、16.6 個百分點,對比S-C-NB 分類器提高了2.1 個百分點。證明了SC-AODE 漏洞分類算法對于漏洞文本分類的準確性,要優于傳統的機器學習算法。
為了對海量增長的計算機漏洞實現有效的自動化分類管理,本文對計算機漏洞數據進行了分析研究。獲取了NVD 和CNNVD 漏洞數據庫中的數據,通過對漏洞描述字段的分析,本文定義了綜合函數C來表明詞語對類別的重要程度,并利用詞語對于類別的信息熵,修正詞語的重要程度。提出了基于S-C特征提取方法,并有效提取了漏洞的特征詞集合。結合AODE分類器對計算機漏洞進行了文本分類。通過實驗對比表明,S-C特征提取法能夠有效提取較優特征詞集,并且結合AODE 分類器的分類效果要優于傳統的分類器模型,驗證了本文提出模型分類的準確性。