彌補傳統惡意代碼檢測短板,機器學習技術還能這樣做?

csdn 發佈 2020-08-03T20:20:28+00:00

Tobiyama, S., Yamaguchi, Y., Shimada, H., Ikuse, T., & Yagi, T. . Malware detection with deep neural network using process behavior. In 2016 IEEE 40th Annual Computer Software and Applications Conference . IEEE.

作者 | 楊秀璋

來源 | CSDN博客

頭圖 | 視覺中國

出品 | CSDN(ID:CSDNnews)

這篇文章將介紹基於機器學習的惡意代碼檢測技術,主要參考鄭師兄的視頻總結,包括機器學習概述與算法舉例、基於機器學習方法的惡意代碼檢測、機器學習算法在工業界的應用。同時,我再結合自己的經驗進行擴充,詳細分享了基於機器學習的惡意代碼檢測技術,基礎性文章,希望對您有所幫助~

聲明:本人堅決反對利用教學方法進行犯罪的行為,一切犯罪行為必將受到嚴懲,綠色網絡需要我們共同維護,更推薦大家了解它們背後的原理,更好地進行防護。

隨著網際網路的繁榮,現階段的惡意代碼也呈現出快速發展的趨勢,主要表現為變種數量多、傳播速度快、影響範圍廣。在這樣的形勢下,傳統的惡意代碼檢測方法已經無法滿足人們對惡意代碼檢測的要求。比如基於簽名特徵碼的惡意代碼檢測,這種方法收集已知的惡意代碼,以一種固定的方式生成特定的簽名,維護這樣的簽名庫,當有新的檢測任務時,通過在簽名庫中檢索匹配的方法進行檢測。暫且不說更新、維護簽名庫的過程需要耗費大量的人力物力,惡意代碼編寫者僅僅通過混淆、壓縮、加殼等簡單的變種方式便可繞過這樣的檢測機制。

為了應對上面的問題,基於機器學習的惡意代碼檢測方法一直是學界研究的熱點。由於機器學習算法可以挖掘輸入特徵之間更深層次的聯繫,更加充分地利用惡意代碼的信息,因此基於機器學習的惡意代碼檢測往往表現出較高的準確率,並且一定程度上可以對未知的惡意代碼實現自動化的分析。下面讓我們開始進行系統的介紹吧~

機器學習概述與算法舉例

1.機器學習概念

首先介紹下機器學習的基本概念,如下圖所示,往分類模型中輸入某個樣本特徵,分類模型輸出一個分類結果。這就是一個標準的機器學習檢測流程。機器學習技術主要研究的就是如何構建中間的分類模型,如何構造一組參數、構建一個分類方法,通過訓練得到模型與參數,讓它在部署後能夠預測一個正確的結果。

訓練是疊代樣本與標籤對的過程,如數學表達式 y=f(x) ,x表示輸入的樣本特徵向量,y表示標籤結果,使用(x,y)對f進行一個擬合的操作,不斷疊代減小 y』 和 y 的誤差,使得在下次遇到待測樣本x時輸出一致的結果。該過程也稱為學習的過程。

構造分類方法

構造分類方法是機器學習中比較重要的知識,如何設計一種分類模型將f(x)表達出來。比如:

  • 在二維坐標軸中,可以設計一條直線將空間內分布的散點區分開來,如下圖所示。


另外一種方法是構造類別機率輸出(softmax),比如歸一化處理得到A+B=1,最後看A和B的機率,誰的機率大就屬於哪一類,該方法廣泛使用於神經網絡的最後結果計算中。

2. 機器學習算法舉例

作者之前Python系列分享過非常多的機器學習算法知識,也推薦大家去學習:機器學習系列文章(共48篇)。

(1) 支持向量機(SVM)

首先存在很多訓練數據點,包括直線上方和下方兩個簇,支持向量機的方法是尋找這兩個簇分類的超平面。如何尋找這個超平面呢?支持向量機先求解每個簇離對面最近的點,然後通過擬合方法計算出兩邊簇的邊界,最終計算出中間的平面,其基本思路就是這樣,而這些點就是支持向量。支持向量機往往用來處理超高維的問題,也不一定是類似直線的平面,也可能是圓形的分類邊界。

(2) 神經網絡(Neural Network)

神經網絡基本網絡結構如下圖所示,包括三個常用層:輸入層、隱藏層、輸出層。在神經網絡中,最基本的單位是人工神經元,其基本原理是將輸入乘以一個權重,然後將結果相加進行激活,最後得到一個機率的輸出,其輸出結果誰大就預測為對應的結果。

(3) 深度卷積神經網絡

普通的神經網絡通常只包括一個隱藏層,當超出之後可以稱為深度神經網絡。現在比較流行的包括CNN、RNN、RCNN、GRU、LSTM、BiLSTM、Attention等等。其中,卷積神經網絡常用於處理圖片,應用了卷積技術、池化技術,降低圖片維度得到很好的結果。

如上圖所示,將手寫數字「3」(32x32個像素)預測為最終的數字0-9的結果。模型首先使用了6個卷積核,對原始圖片進行固定的計算,如下5x5的圖像卷積操作後變成了 3x3 的圖像。其原理是將特徵提取的過程放至神經網絡中訓練,從而得到比較好的分類結果。卷積之後進行了一個2x2的下採樣過程,將圖片進一步變小(14x14),接著降維處理,一般採用平均池化或最大池化實現,選定一個固定區域,求取該區域的平均值或最大值,然後將向量進行組合,得到一個全連接網絡,最終完成分類任務。

深度神經網絡是深度學習中模型,它主要的一個特點是將特徵提取的過程放入到真箇訓練中,之前對於圖片問題是採用手工特徵,而CNN讓在訓練中得到最優的特徵提取。

3. 特徵工程-特徵選取與設計

特徵工程:選取特徵,設計特徵的過程。

例如,在路邊預測一個人是否是學生,假設我們不能去詢問,只能通過外表去預測他是否是一個學生,包括:年齡(低於15歲就是學生)、性別(不影響學生)、衣著(穿著活潑年輕的可能是學生,如果穿著西裝可能性就小)等等,然後根據這些特徵輸入機器學習模型,從而判斷是否是學生。

在這些特徵中,顯然有些特徵是非常重要的,比如年齡和衣著。數據和特徵決定了機器學習的上限,而模型和算法只是逼近這個上限,所以如何選取特徵是機器學習的一個關鍵性因素。再比如淘寶的推薦系統,購買電腦推薦滑鼠、鍵盤等。

當然,上面僅僅是一個比較簡單的問題,當我們推廣到惡意代碼檢測等複雜問題時,如果不了解這個領域,可能就會導致模型的結果不理想。

特徵設計——人臉識別

局部二值特徵(Local Binary Pattern),再舉一個人臉識別例子,深度學習出來之前,圖片分類都是使用一些特徵算子提取特徵的。比如存在一個3x3的窗口,我們取閾值5,比5小的窗口置為0,其他的置為1,然後順時針轉換為一個8位的二進位數字,對應的十進位就是19。顯然,LBP特徵進行了一個降維的操作,左邊的圖片顯示了人臉識別不應該受光照影響,不同光照的圖片進行LBP特徵提取後,顯示結果都一樣。

該部分的最後,作者也推薦一些書籍供大家學習。

  • 《統計學習方法》李航,數學理論較多

  • 《機器學習》周志華,西瓜書,較通俗透徹

  • 《Deep Learning》Ian Goodfellow,花書,深度學習內容全面

  • 《精通特徵工程》結合惡意代碼特徵學習,包括如何向量化

再看看我的桌面,這些都是作者最近看的一些安全、AI類書籍,希望也您喜歡~

基於機器學習方法的惡意代碼檢測

1.惡意代碼的靜態動態檢測

(1) 特徵種類

首先,特徵種類如果按照惡意代碼是否在用戶環境或仿真環境中運行,可以劃分為靜態特徵和動態特徵。

  • 靜態特徵: 沒有真實運行的特徵

    • 字節碼:二進位代碼轉換成了字節碼,比較原始的一種特徵,沒有進行任何處理

    • IAT表:PE結構中比較重要的部分,聲明了一些函數及所在位置,便於程序執行時導入,表和功能比較相關

    • Android權限表:如果你的APP聲明了一些功能用不到的權限,可能存在惡意目的,如手機信息

    • 可列印字符:將二進位代碼轉換為ASCII碼,進行相關統計

    • IDA反彙編跳轉塊:IDA工具調試時的跳轉塊,對其進行處理作為序列數據或圖數據

  • 動態特徵: 相當於靜態特徵更耗時,它要真正去執行代碼

    • API調用關係:比較明顯的特徵,調用了哪些API,表述對應的功能

    • 控制流圖:軟體工程中比較常用,機器學習將其表示成向量,從而進行分類

    • 數據流圖:軟體工程中比較常用,機器學習將其表示成向量,從而進行分類

舉一個簡單的控制流圖(Control Flow Graph, CFG)示例。

if (x < y){ y = 0; x = x + 1;}else{ x = y;}

(2) 常見算法

普通機器學習方法和深度學習方法的區別是,普通機器學習方法的參數比較少,相對計算量較小。

  • 普通機器學習方法(SVM支持向量機、RF隨機森林、NB樸素貝葉斯)

  • 深度神經網絡(Deep Neural Network)

  • 卷積神經網絡(Convolution Neural Network)

  • 長短時記憶網絡(Long Short-Term Memory Network

    針對序列模型進行建模,包含上下文依賴關係,比如「我 是 一名 大學生」中的「我」和「是」前後出現的條件機率更高。廣泛應用於文本分類、語音識別中,同樣適用於惡意代碼檢測。

  • 圖卷積網絡 (Graph Convolution Network)

    比較新興的方法,將卷積應用到圖領域,圖這種數據類型比較通用,非圖數據比較容易轉換成圖數據,CCF論文中也已經應用到惡意代碼檢測中。

2.靜態特徵設計舉例

首先分享一個靜態特徵的例子,該篇文章發表在2015年,是一篇CCF C類會議文章。

  • Saxe J,Berlin K. Deep neural network based malware detection using two dimensional binary program features[C] // 2015 10th International Conference on Malicious and Unwanted Software(MALWARE). IEEE, 2015: 11-20

文章的主要方法流程如下所示:

該模型包含三個步驟:

  • 特徵抽取

    使用了四種特徵

  • 特徵抽取輸入到深度神經網絡

    包含兩層隱含層的深度神經網絡

  • 分數校正

特徵提取包括以下四種特徵:

  • 字節-熵對統計特徵:統計滑動窗口的(字節,熵)對個數

    在下圖中,假設白框是一個二進位文件,其中紅色框W是滑動窗口,二進位文件如果有100KB大小,每個滑動窗口是1024字節,那麼滑動100次可以將整個二進位文件掃描完。如果對窗口內的數值進行計算,首先計算它的熵值,熵是資訊理論的概念(下圖中的E),它描述了一個數組的隨機性,熵越大其隨機性越大。在圖中,每一個滑動窗口都有固定的熵值,包含了1024字節,標記為(Bi,Ewi),最後滑動得到100x1024的字節熵對。

統計最後滑動得到100x1024的字節熵對個數,得到如下圖所示的二維直方圖結果,橫坐標是熵值最小值到最大值的範圍,縱坐標是一個字節轉換成10進位的範圍0-256,最終得到字節熵對分布的範圍,再將16x16維的二維數組轉換成1x256維的特徵向量。

  • PE頭IAT特徵:hashDLL文件名與函數名為[0-255)範圍第二種特徵是PE頭IAT特徵。它的計算工程是將PE頭的IAT表裡面的文件名和函數名hash到0到255範圍,如果某個文件出現某個函數,就將該位置為1,當然每位對應表示的函數是固定的,最終得到256數組。

  • 可列印字符:統計ASCII碼的個數特徵

    可列印字符和字節熵對比較相似,這裡推薦大家閱讀原文。

  • PE元信息:將PE信息抽取出來組成256維數組,例如編譯時間戳PE元信息是將PE信息的數值型信息抽取出來,組成256維數組,每一個數組的位置表示了一個固定的信息種類,再信息種類將對應的信息填入到元素的位置,比如編譯時間戳。

得到特徵向量之後,就開始進行模型的訓練和測試,一般機器學習任務事先都有一個數據集,並且會分為訓練數據集和測試數據集,按照4比1或9比1的比例進行隨機劃分。訓練會將數據集和標籤對輸入得到惡意和非惡意的結果,再輸入測試集得到最終結果。

下面是衡量機器學習模型的性能指標,首先是一幅混淆矩陣的圖表,真實類別中1代表惡意樣本,0代表非惡意樣本,預測類別也包括1和0,然後結果分為:

  • TP:本身是惡意樣本,並且預測識別為惡意樣本

  • FP:本身是惡意樣本,然而預測識別為非惡意樣本,這是誤分類的情況

  • FN:本身是非惡意樣本,然而預測識別為惡意樣本,這是誤分類的情況

  • TN:本身是非惡意樣本,並且預測識別為非惡意樣本

然後是Accuracy(準確率)、Precision(查准率)、Recall(查全率)、F1等評價指標。

通常Accuracy是一個評價惡意代碼分類的重要指標,但本文選擇的是AUC指標,為什麼呢?

假設我們模型的效果非常差,它會將所有本測試樣本標記為惡意樣本,這樣我有兩個數據集,一個樣本包括100個數據(99個惡意樣本、1個非惡意樣本),另一個樣本包括50個數據(50個惡意樣本、50個非惡意樣本),如果我單純的計算ACC,第一個樣本的結構是0.99,顯然不符合客觀的描述,不能用來評價性能高低的,並且這種情況是很容易產生的。所以論文中廣泛採用AUC指標。

AUC指標包括TPRate和FPRate,然後得到一個點,並計算曲線以下所包圍的面積即為AUC指標。其中,TPRate表示分類器識別出正樣本數量占所有正樣本數量的比值,FPRate表示負樣本數量站所有負樣本數量的比值。舉個例子,我們撒網打魚,一網下去,網中好魚的數量占池子中所有好魚的數量就是TPRate,而FPRate表示一網下去,壞魚的數量占整個池子中所有壞魚的數量比例,當然FPRate越小越好。最好的結果就是TPRate為1,而FPRate為0,此時全部分類預測正確。

該論文測試了六種特徵集合,其計算的TPR和AUC值如下所示。

3.經典的圖片特徵舉例

下面介紹另一種比較新興經典的方法,就是圖片特徵。但一些安全界的人士會認為這種特徵不太好,但其方法還是比較新穎的。

它的基本方法是按照每8位一個像素點將惡意軟體的二進位文件轉換為灰度圖片,圖片通常分為R、G、B通道,每個8位像素點表示2^8,最終每隔8位生成一個像素點從而轉換為如下圖所示的灰度圖片。圖片分別為Obfuscator_ACY家族、Lolipop家族、ramnit家族惡意軟體樣例,這些樣例由微軟kaggle比賽公布的數據生成。

這是因為對於某些惡意樣本作者來說,他只是使用方法簡單的修改特徵碼,從而每個家族的圖片比較相似,最終得到了較好的結果。

4.動態特徵設計舉例

接下來分享一個動態特徵的例子,該篇文章發表在2016年,文章的會議一般,但比較有代表性。

  • Kolosnjaji B,Zarras A,Webster G,et al. Deep learning for classification of malware system call sequences[C] // Australasian Joint Conference on Artificial Intelligence. Springer,Cham,2016:137-149.

下圖展示了該方法的整體流程圖。PE文件進入後,直接進入Cuckoo沙箱中,它是一個開源沙箱,在學術論文中提取動態特徵比較通用;接著進行進行預處理操作,將文本轉換成向量表示的形式,比如提取了200個動態特徵,可以使用200維向量表示,每個數組的位置表示對應API,再將所得到的序列輸入卷積神經網絡LSTM進行分類,最終得到家族分類的結構。

  • Cuckoo沙箱

  • LSTM

下圖展示了實驗的結構,其指標是高於單純的神經網絡和卷積網絡的效果更好,這是一篇比較基礎的文章。

5.深度學習靜態檢測舉例

下面再看一個深度學習靜態檢測的文章。

  • Coull S E,Gardner C. Activation Analysis of Byte-Based Deep Neural Network for Malware Classification[C] // 2019 IEEE Security and Privacy Workshops(SPW). IEEE,2019:21-27.

這篇文章是火眼公司的兩名員工發布的,所使用的也是靜態檢測特徵,其流程如下所示。

  • 首先,原始的字節碼特徵直接輸入一個Byte Embedding層(詞嵌入),對單個元素進行向量化處理,將字節碼中的每個字節表示成一個固定長度的向量,從而更好地將字節標記在一個空間維度中。詞嵌入技術廣泛應用於自然語言處理領域,比如「女人」和「女王」關係比較緊密,這篇文章的目的也是想要在惡意代碼中達到類似的效果。

  • 然後將矩陣輸入到卷積和池化層中,比如存在一個100K字節的二進位文件,得到100102410矩陣輸入卷積神經網絡中,最後通過全連接層完成惡意和非惡意的分類任務。

Fireeye使用了三個數據集進行訓練和測試,其訓練的模型分類效果結果如下表所示,博客Small、Baseline、Baseline+Dropout模型,其網絡結構是一樣的,其中Small表示使用小的數據集,Baseline表示使用大的數據集,Dropout表示對訓練好的神經網絡中隨機丟棄一些神經元,從而抑制過擬合現象,也是比較常用的深度學習技術。

這篇文章的重點是對深度學習的解釋性,就是解釋深度學習是否能學習到惡意軟體的本質特性。下圖展示了不同特徵對於分類結果的影響,橫坐標是Offset偏移,通常用Offset記錄字節,從0到右邊也對應文件大小,前面可能就是PE頭,中間有各種段。

它的橫縱坐標分別表示了某些特徵對於惡意性分類比較重要,還是非惡意性比較重要。如果它的校驗和(CheckSum)是0,就對惡意性分類比較重要,這表示深度學習並沒有學習到惡意軟體為什麼是惡意的,只是通過統計學去發現惡意軟體和非惡意軟體差別最大部分,以此進行數據建模。

深度學習進行惡意軟體檢測的問題:沒有學習到惡意和非惡意特徵,而是學習到區別的統計差異,而這種差異如果被黑客利用是可以被規避的。

6.優缺點

靜態特徵

  • 優點

    特徵提取速度快

    特徵種類豐富,可以組合多種特徵向量

  • 缺點

    易受加殼、加密、混淆干擾

    無法防範無文件攻擊,難以反映惡意軟體行為的惡意性

動態特徵

  • 優點

    提供惡意軟體的動作,調用API

    規避一些靜態的混淆對抗方法

  • 缺點

    反虛擬化,延時觸發等技術的對抗

    測試時間較長,單個樣本2-3分鐘(Cuckoo)

最後給出推薦資料:

  • 404notfound實驗室總結的AI在安全領域應用

  • https://github.com/404notf0und/AI-for-Security-Learning

  • malware data science書籍

    https://www.amazon.com/Malware-Data-Science-Detection-Attribution-ebook/dp/B077X1V9SY

7.靜態分析和動態分析對比

下面簡單總結靜態分析和動態分析與深度學習結合的知識,該部分內容源自文章:深度學習在惡意代碼檢測 - mbgxbz,在此感謝作者,覺得非常棒,故引用至此!謝謝~

惡意代碼的檢測本質上是一個分類問題,即把待檢測樣本區分成惡意或合法的程序。基於機器學習算法的惡意代碼檢測技術步驟大致可歸結為如下範式:

  • 採集大量的惡意代碼樣本以及正常的程序樣本作為訓練樣本;

  • 對訓練樣本進行預處理,提取特徵;

  • 進一步選取用於訓練的數據特徵;

  • 選擇合適的機器學習算法訓練分類模型;

  • 通過訓練後的分類模型對未知樣本進行檢測。

深度學習作為機器學習的一個分支,由於其可以實現自動化的特徵提取,近些年來在處理較大數據量的應用場景,如計算機視覺、語音識別、自然語言處理時可以取得優於傳統機器學習算法的效果。隨著深度學習在圖像處理等領域取得巨大的成功,許多人將深度學習的方法應用到惡意軟體檢測上來並取得了很好的成果。實際上就是用深度神經網絡代替上面步驟中的人為的進一步特徵提取和傳統機器學習算法。根據步驟中對訓練樣本進行預處理的方式,可以將檢測分為靜態分析與動態分析:

  • 靜態分析不運行待檢測代碼,而是通過直接對程序(如反彙編後的代碼)進行統計分析得到數據特徵

  • 動態分析則在虛擬機或沙箱中執行程序,獲取程序執行過程中所產生的數據(如行為特徵、網絡特徵),進行檢測和判斷。

(1) 靜態分析

一般來說,在絕大部分情形下我們無法得到惡意程序的原始碼。因此,常用的靜態特徵包括程序的二進位文件、從使用IDA Pro等工具進行反彙編得到的彙編代碼中提取的彙編指令、函數調用等信息,另外基於字符串和基於API調用序列的特徵也是比較常見的。文獻[i]提出一種對PE文件的惡意程序檢測方法,提取PE文件四個類型的特徵:字節頻率、二元字符頻率、PE Import Table以及PE元數據特徵,採用包含兩個隱藏層的DNN作為分類模型,但是為了提取長度固定的輸入數據,他們丟棄了PE文件中的大部分信息。文獻[ii]使用CNN作為分類器,通過API調用序列來檢測惡意軟體,其準確率達到99.4%,遠高於傳統的機器學習算法。然而,當惡意代碼存在混淆或加殼等情形時,對所選取的靜態特徵具有較大的影響,因此靜態分析技術本身具有一定的局限性。

(2) 動態分析

利用虛擬機或沙箱執行待測程序,監控並收集程序運行時顯現的行為特徵,並根據這些較為高級的特徵數據實現惡意代碼的分類。一般來講,行為特徵主要包括以下幾個方面:文件的操作行為;註冊表鍵值的操作行為;動態連結庫的加載行為;進程訪問的操作行為;系統服務行為;網絡訪問請求;API調用。

文獻[iii]通過API調用序列記錄進程行為,使用RNN提取特徵向量,隨後將其轉化為特徵圖像使用CNN進行進一步的特徵提取,提取其可能包含的局部特徵並進行分類。

關鍵字: