劉金鑫 黃瑋 范文慶 鞏微 董航
(1.中國傳媒大學計算機與網絡空間安全學院 北京市 100024)
(2.中國移動通信集團公司信息安全管理與運行中心 北京市 100053)
根據國家互聯網應急中心(CNCERT)發布的《2019年我國互聯網網絡安全態勢綜述》顯示,2019年全國發現惡意程序的數目超過6200 萬個,單日平均傳播次數高達 824 萬余次,涉及 66 個惡意程序家族,致使我國約 582 萬臺主機遭受感染。惡意程序的不斷傳播嚴重威脅著我國的網絡空間安全,因此如何高效準確檢測惡意程序是一項亟待解決的問題。
惡意程序的檢測方法可以分為靜態檢測方法和動態檢測方法,靜態檢測方法是指在不運行惡意程序的情況下直接分析惡意程序,通常使用的靜態特征包括字符串特征、函數特征和字節碼特征[1]等,但是靜態檢測方法在面對采用混淆技術的惡意程序時,檢測的準確率會下降,因此眾多學者將目光轉向動態檢測方法。
動態檢測方法是指使用虛擬機或者沙箱對計算機的真實環境進行模擬,然后將惡意程序放入構建好的虛擬環境中運行,借助搭建在虛擬環境中的行為監控工具對樣本的行為信息進行捕獲,進而獲得動態特征[2]。目前惡意程序的動態特征通常以API 函數名組成的調用序列為主[3],然而僅使用 API 函數名描述惡意程序行為特征并不全面,需要結合API 參數才能真正反映出一個程序是否具有惡意性,將API 函數名與參數相結合可以更好地理解 API 調用序列之間的關系。因此,本文提出了一種基于動態分析和深度學習相結合的惡意程序檢測方法,通過搭建自動化分析沙箱,從沙箱的分析報告中提取惡意程序的API 調用序列,在此基礎上,基于卷積神經網絡構建惡意程序檢測模型,本文的主要工作概括如下:
(1)構建Cuckoo 沙箱模擬惡意程序運行環境,通過沙箱提供的json 格式分析報告獲取惡意程序運行時的API 調用序列;
(2)改進API 調用序列提取方法,提取惡意程序運行時的API 類型、API 函數名和參數,從而全面獲取惡意程序的行為特征;

圖1:惡意程序檢測框架

圖2:卷積神經網絡結構圖

圖3:引入參數特征的準確率曲線

圖4:引入參數特征和未引入參數特征的結果對比
(3)對提取的API 調用序列進行預處理,將API 調用序列視為單詞,提出了基于詞嵌入的方法,將API 調用序列轉換為詞向量;
(4)針對于獲得的特征向量,構建卷積神經網絡檢測模型實現對惡意程序的檢測,并與未考慮參數特征的檢測結果進行對比。
本文設計的基于動態分析與深度學習結合的惡意程序檢測框架如圖1 所示,在動態分析階段,將由良性程序與惡意程序組成的樣本數據集上傳至Cuckoo 沙箱[4]進行動態分析后,得到被檢測程序的分析報告。在特征提取與預處理階段,從沙箱提供的分析報告中提取API 序列特征,具體包括API 函數的類型、API 函數名和API參數,把參數中的特殊字符去除后,將API 調用序列看作單詞,使用Word2vec 模型[5]將API 調用序列轉化為詞向量作為檢測模型的輸入。在模型訓練與檢測階段,本文選擇使用卷積神經網絡來構建惡意程序檢測模型,將動態分析提取的樣本數據對模型進行訓練和測試,驗證該檢測框架的有效性。
應用程序在Cuckoo 沙箱內分析完成后沙箱會提供json 格式的動態分析報告,良性程序和惡意程序運行時的行為特點可以從API函數調用上進行體現,由于分析報告的信息量巨大,因此需要對分析報告進行預處理,由于分析報告的內容高度格式化,預處理的重點是提取運行過程中的所有API 調用包括API 類型、API 名稱以及API 參數,通過對分析報告的結構和各字段的含義進行研究總結,API 調用情況在分析報告中的“/behavior/processes/calls/”字段下展開,其中字段“category”為API 的類型,主要包含了網絡(network),進程(process),文件(file),注冊表(registry),服務(services)和資源(resource)6 大類,字段“api”表示API 的名稱,字段“arguments”為API 的參數,而程序運行時進程之間的調用關系可以在 “/behavior/processtree”字段下找到,依據“processtree”字段可以掌握進程之間的調用關系,再結合“/behavior/processes/calls/”下的“api”字段,可以得到某一進程下的API 調用序列,再根據進程調用的時間先后順序對所有的API 調用序列進行排列和記錄。
對于API 函數的類別和API 函數名稱均為獨立的單詞,但是對于提取到的API 的參數來說,則存在多種類型例如文件路徑,URL鏈接,注冊表鍵值等,因此需要通過正則表達式對參數中的特殊字符進行處理,將參數分割成單詞的形式。對于文件路徑來說,通常以盤符開頭,以“\”符號將路徑完整串聯起來,因此在處理的時候需要將盤符和“\”符號進行刪除,對于URL 鏈接,通常以“http://”或者“https://”開頭,以“.”進行連接,以“/”符號結尾,因此也需要刪除這四個部分,對于注冊表鍵值通常以“HKEY_”開頭以“”進行連接,需要將“_”和“”符號進行刪除,此外對于文件的擴展名,例如“.exe”、“.ini”等,本文的處理方法是將“.”去除,保留擴展名。通過對惡意程序API 調用序列進行處理之后,就將所有的API 調用信息轉變成了獨立的單詞,也就便于后續借助自然語言處理方法,從語義層面對API 調用進行分析,挖掘區分惡意程序與良性程序的行為模式。
在基于卷積神經網絡的檢測模型中,需將從Cuckoo 沙箱分析報告中提取的API 調用記錄轉換成特征向量作為算法的輸入,API調用記錄經過預處理后由單詞組成,而將單詞或者是詞語映射成的數字向量被稱為詞向量,因此本文考慮使用Word2vec 詞向量模型,模型的原理是通過從一段無標注的自然文本中統計詞頻和詞的搭配來建立一個語言模型,Word2vec 的本質是簡單的神經網絡模型,由輸入層、隱藏層和輸出層組成,經過訓練學習之后得到的詞向量模型,包含了輸入文本的語義和語法信息。具體做法是將預處理階段處理好的API 調用信息構成語料庫作為訓練數據來訓練Word2vec 模型。利用訓練出的詞向量模型,對API 調用中的每一個單詞元素進行向量化處理,得到一個float 型數組,這樣將所有單詞轉換成向量之后,也就得到了由完整API 調用序列轉換成的特征矩陣,進而輸入卷積神經網絡模型進行分類。
卷積神經網絡(Convolutional Neural Network,CNN)是深度學習算法之一,廣泛應用于文本分類,語音識別,圖像處理等領域[6],由于本文提取的API 調用序列可以視為文本信息,因此可以借助卷積神經網絡將惡意程序檢測問題轉變為文本分類問題,本文設計的網絡模型結構如圖2 所示:輸入層是由API 調用序列經過Word2vec 模型訓練得到的特征向量矩陣,將其作為卷積神經網絡的輸入,在本文的網絡設計中,對于卷積層與池化層層數的設計需要考慮惡意代碼的API 調用數目,如果卷積池化的操作過少會出現模型難以提取到高階特征的情況,但是如果卷積池化的操作過多,會造成設計的網絡冗余,耗費計算資源。綜合考慮,本文選擇設計三層卷積層和三層池化層,即連續進行三次卷積和池化的操作來不斷迭代高階特征,卷積核的大小按照卷積層層數的增加逐層遞增,第一層卷積層使用16 個3*3 的卷積核,第二層卷積層使用32 個4*4 的卷積核,第三層使用64 個5*5 的卷積核。
關于激活函數的選擇,由于ReLU 函數相較于Sigmoid 函數和Tanh 函數具備收斂快,計算量小,可以降低參數間的耦合關系的優勢,因此本文選擇ReLU 函數。
關于池化層的設計,本文將池化窗口大小設置為2*2,在池化方法的選擇上考慮到傳統的最大池化方法的缺點在于會丟失特征項頻次信息和位置信息,因為最大池化方法只保留最大值,而在本文的研究內容中,API 的調用次數和API 調用出現的先后順序對于判別程序的惡意性是有一定影響的。因此選用K-max-pooling 池化方法,在本文中K 設置為2,即保留特征值排名第一和第二的特征,選擇這種池化方式的目的是為了盡可能多地保留特征的頻次和位置信息,并且綜合考慮時間和空間消耗,這種池化方式對模型的檢測效率并無太大影響。
在經過三次卷積和池化處理后接入一個丟棄層,目的是為了防止出現過擬合的情況,丟棄層的參數通常設置為0.5,最后連接一層softmax 全連接層給出分類的結果,關于全連接層的損失函數的選擇,由于本文的研究問題是對未知程序進行二分類,即最后的分類結果只有正例(惡意樣本)和負例(良性樣本),并且兩者預測概率之和為1,因此損失函數選擇交叉熵函數。
為了驗證本文提出的惡意程序檢測模型的有效性,本文使用公開數據集對檢測模型進行評估,數據集包含惡意程序和良性程序,惡意程序選取自免費惡意樣本網站VirusShare,惡意程序樣本數為3270 個,良性程序選取自PortableFreeware,良性程序樣本數為1890 個,共計5160 個。本文選擇Cuckoo Sandbox 2.0.7 作為驅動惡意程序動態分析的基礎環境,Cuckoo 沙箱主機端部署在硬件環境為Ubuntu 服務器的物理機器上,操作系統為Ubuntu 16.04 LTS(64位)。Cuckoo 沙箱客戶端部署在硬件環境為基于Virtualbox 搭建的Windows 主機上,操作系統為Windows7 專業版(64 位)。算法模型驗證環境搭建在基于Windows10(64 位)的個人PC 中,算法實現部分基于Python3.7、Tensorflow 1.14.0 和Keras 2.4.3 進行構建。
為了驗證本模型的檢測效果,本文使用3.1 中介紹的數據集進行實驗,算法執行時將80%的樣本數據作為訓練集,20%的樣本數據作為測試集,訓練集與測試集的準確率的變化趨勢如圖3 所示。
通過觀察曲線變化規律可以發現,在訓練初期階段,模型在訓練集上的準確率已經達到了98%,隨著訓練次數的增加,訓練集的準確率在96%至99%之間浮動,訓練集上的平均準確率為99.08%。模型在測試集上的準確率通過曲線可知,在測試初期階段達到了92%,而后準確率趨于穩定,模型在測試集上的平均準確率為94.19%,說明本文提出的卷積神經網絡模型能有效檢測惡意程序。同時為了驗證本文提出的結合API 參數的惡意程序檢測方法要優于只提取API 函數名的檢測方法,本文進行了對照實驗,即使用2.2 節介紹的提取方法只提取API 的函數名作為特征,使用相同的卷積神經網絡模型進行實驗,兩種方法的準確率的對比結果如圖4所示。
通過觀察曲線可以發現,在僅使用API 函數名作為特征的情況下,模型在訓練集上的準確率的變化幅度較大,檢測準確率不穩定,而模型在測試集上的準確率根據圖中曲線變化規律可知,在測試階段初期其準確率與增加參數特征的準確率差距不大,但是隨著測試次數的增加,不增加參數特征的模型的準確率開始低于增加參數特征的模型的準確率,平均準確率為92.63%,因此證明了引入API參數特征的檢測方法能提高對惡意程序的識別率。同時由于兩種特征模型的平均準確率均達到了92%以上也證明了本文提出的將動態分析與深度學習相結合的惡意程序檢測方法是行之有效的。
本文提出了一種基于動態分析和深度學習相結合的惡意程序檢測方法,改進了只提取API 函數名的特征提取方式,從Cuckoo 沙箱提供的分析報告中提取API 函數類型、API 函數名以及API 參數,力求全面刻畫惡意程序行為特征。對API 序列進行預處理后,將API 調用序列轉換為單詞,使用Word2vec 模型將單詞轉變為詞向量輸入至卷積神經網絡中。為了評估檢測模型的有效性,本文收集了5160 個樣本數據用于模型的訓練與驗證,在測試集上的平均準確率達到了94.19%。同時為了驗證改進的特征提取方法的檢測效果,本文僅使用API 函數名作為特征,進行同樣的實驗,在測試集上的平均準確率為92.63%,證明了本文提出的改進方法能提高對惡意程序檢測的準確率。