1. 程式人生 > 其它 >Android惡意軟體檢測

Android惡意軟體檢測

0x01前言

本文將介紹如何利用機器學習技術檢測安卓惡意軟體,在前文會介紹相關基礎知識,在後文則以實戰為導向,介紹如何使用支援向量機檢測安卓惡意軟體,以及通過可解釋性技術解釋模型的決策結果,最後介紹如果對該模型發動對抗樣本攻擊。

0x02 支援向量機

在機器學習中,支援向量機(英語:support vector machine,常簡稱為SVM,又名支援向量網路)是在分類與迴歸分析中分析資料的監督式學習模型與相關的學習演算法。

給定一組訓練例項,每個訓練例項被標記為屬於兩個類別中的一個或另一個,SVM訓練演算法建立一個將新的例項分配給兩個類別之一的模型,使其成為非概率二元線性分類器。SVM模型是將例項表示為空間中的點,這樣對映就使得單獨類別的例項被儘可能寬的明顯的間隔分開。然後,將新的例項對映到同一空間,並基於它們落在間隔的哪一側來預測所屬類別。

相關實驗:<支援向量機檢測DGA>:https://www.hetianlab.com/expc.do?ec=ECIDd5fb-5379-4f4b-862e-db7ab18b3a19(瞭解支援向量機的原理,學習SVM是怎麼應用於檢測DGA的。)

0x03 可解釋性技術

接著介紹本文用到的可解釋性技術,來自於[2][3]兩篇論文。

我們使用的資料集是Drebin,該資料集包含來自 179 個不同惡意軟體家族的 5,560 個應用程式,樣本是在2010年8月至 2012年10月期間收集的,由MobileSandbox 專案提供。其主頁為:https://www.sec.cs.tu-bs.de/~danarp/drebin/

資料集的每個特徵都是一個布林變數,0表示不存在該特徵,1表示存在該特徵。

如下所示:

安卓樣本(apk檔案)在特徵空間中表示為向量,然後用一組帶有標籤的資料集進行訓練,來區分良性樣本和惡意樣本。在測試時,則用訓練得到的分類器判別樣本檔案。如果其輸出f(x)>0,則將其歸類為惡意樣本,否則歸類為良性樣本。我們希望利用可解釋性技術解釋模型做出對應決策的理由。

以前的可解釋性技術關注梯度,更一般的說法就是圍繞輸入點x的線性近似值給解釋技術提供了有用的資訊。設f是與預測類別相關的置信度,其認為與區域性梯度∇f(x) 的最大絕對值相關的那些特徵識別是最能影響決策結果的特徵。然而,對於稀疏資料(比如安卓惡意軟體)來說,那些方法給出的最有影響力的特徵往往不在給定的樣本中,從而難以解釋相應的預測結果。

因此,我們採用不同的方法。我們將梯度∇f (x) 投影到 x 上以獲得特徵相關(feature-relevance)向量 ν = ∇f(x) ·x ∈Rd,其中 · 表示元素乘積。然後我們將 ν 歸一化為一元 l1 範數,即 r =v/||v|,以確保只有x 中的非空特徵被識別為與決策結果相關。 最後,可以將 r 的絕對值按降序排列以識別對決策結果最具影響的特徵。

應用提出的解釋性技術,下表中給出了SVM(頂行)和 RF(底行) (i) 良性樣本(第一列),(ii)SM SWA TCHER 家族的惡意軟體樣本(第二列),以及(iii) PL ANKTON家族的惡意軟體樣本(第三列)的最能影響判決結果的前10個特徵,並給出了每個特徵BENING (pB ) 和惡意軟體 (pM ) 中存在的可能性。

0x04 對抗樣本技術

然後介紹本文用到的對抗樣本技術,來自於[4][5]兩篇論文。

我們可以將生成的對抗樣本形式化為:

其中,x’是與生成的對抗樣本z’相關的特徵空間,wˆ 是攻擊者估計的權重向量。

這個式子本質上告訴攻擊者應該修改哪些特徵以最大程度地降低分類函式的值,即最大化逃避檢測的概率。注意,根據操作約束Ω(z)(例如如果特徵值是有界的),要操作的特徵集對於每個惡意樣本通常是不同的。

攻擊者的目標是最小化上面的式子,但是對於每個特徵獨立地估計wˆ 的每個分量為:

這相當於鼓勵攻擊者新增(刪除)在良性樣本中更頻繁出現(不存在)的重要特徵,使惡意樣本的概率分佈更接近良性資料的概率分佈。

在本部分最後,再捎帶介紹後文會提到的兩個概念。

F1分數:

F1分數(F1 Score)是統計學中用來衡量二分類模型精確度的一種指標。 它同時兼顧了分類模型的精確率和召回率。 F1分數可以看作是模型精確率和召回率的一種調和平均,它的最大值是1,最小值是0。

ROC曲線:

ROC 曲線(接收者操作特徵曲線)是一種顯示分類模型在所有分類閾值下的效果的圖表。該曲線繪製了以下兩個引數:真正例率TPR(在我們下面的實戰中,就是惡意樣本的檢出率),假正例率FPR。

0x05實戰

我們下載該資料集並解壓:

簡單檢視一下資料:

可以看到共下載了12550個樣本,其中良性樣本數量為12000,惡意樣本數量為550。

我們使用支援向量機對其進行檢測,首先用一半的資料集作為訓練集,在其上進行訓練:

其中,CClassifierSVM類的定義如下:

訓練完成後列印其F1分數:

繪出ROC曲線:

接著我們來嘗試使用XAI技術(可解釋性AI)來解釋訓練得到的模型是以什麼為依據將樣本判定為良性或惡意。

我們使用基於梯度的解釋方法:

CExplainerGradientInput類定義如下,我們在下面會用到其explain方法:

我們嘗試對於一個良性樣本和一個惡意樣本,給出解釋並分別列出對決策結果最大的前10個特徵。

先來看對良性樣本的解釋:

這裡的true class:0,是說該樣本為良性樣本。對應地,下圖中true class:1則說明其為惡意樣本。

我們來看看返回的結果,負號說明這些特徵是與決策結果負相關,或者換句話說,如果出現這些特徵,那麼樣本是良性的可能性大。

從上圖可以看到與之前相反的結果,大多數特徵具有正相關的值,這意味著,出現了這些正相關的特徵,則樣本極有可能是惡意的。

前面我們在檢查資料的時候已經知道,這批樣本共有1227080個特徵。而從此處的結果可以看到,打印出的前10個特徵已經佔據了50%左右的相關性了,說明該機器學習模型傾向於將大部分權重分配給一組小的特徵。

如果攻擊者發現了這一點,這時候只需稍微改動惡意樣本中正相關性較大的特徵,就能欺騙模型將其分類為良性樣本。當然實際中不需要手動去修改,我們還有對抗樣本的技術,可以自動修改特徵來欺騙分類器。

我們這裡使用帶線性搜尋的投影梯度下降技術來建立可以對抗檢測安卓惡意軟體的SVM分類器的對抗樣本。這裡需要注意,和圖片不同,在生成圖片的對抗樣本時,基本是不受約束的,圖片不論怎麼修改,還是一張圖片。但是對於程式來說,新增或者刪除某些特徵,可能程式就不可用了。比如我們在一個惡意程式上做對抗樣本,如果改動幅度過大,可能生成的對抗 樣本確實被分類器認為是良性的,但是該對抗樣本可能已經失效的,即無法執行惡意行為,那麼就失去了對抗樣本的意義。

我們的經驗就是一般不要輕易刪除某些特徵,尤其是不要刪除manifest元件,因為容易破壞程式的功能。相對地,新增特徵更安全一些,比如新增許可權就不會影響任何現有功能。

我們來設定攻擊引數:

這裡主要關注distance和y_target。

distance我們設為l1,因為每個特徵是一個布林變數(0或1),我們希望在一次迭代時只改變一個特徵(從0到1,或者從1到0)。

y_target設為0,是希望生成的對抗樣本被歸類為良性。(這裡我們指定了攻擊目標,在對抗樣本中稱為定向攻擊)

接著發動攻擊:

該類定義如下:

畫出攻擊後的情況:

從圖中可以看到,在改變了不到10個特徵之後,惡意樣本的檢出率就低於50%了,證實了對抗樣本攻擊的有效性。

相關課程:《基於機器學習的網路安全應用實踐》

(學習如何將機器學習與網路安全結合起來,使用機器學習來輔助網路安全問題的解決。)

0x06參考

1.https://zh.wikipedia.org/wiki/%E6%94%AF%E6%8C%81%E5%90%91%E9%87%8F%E6%9C%BA

2.Not just a blackbox: Learning important features through propagating activation differences

3.Explaining Black-box Android Malware Detection

4.Is Deep Learning Safe for Robot Vision?Adversarial Examples against the iCub Humanoid

5.Yes, Machine Learning Can Be More Secure!A Case Study on Android Malware Detection

6.《機器學習》、《深度學習》

合天智匯:合天網路靶場、網安實戰虛擬環境