李明語,張 軼
(1.南京理工大學計算機科學與工程學院,江蘇南京210014;2.南京理工大學設計藝術與傳媒學院,江蘇南京210014)
Android應用檢測按分類方式來分可分為單一法和集成法兩種。集成學習方法構造的集成分類器與單一基礎分類器相比準確率更高。
集成學習法本質上是多個基礎分類器在分類階段的互補,并加上合適的集成策略。盛杰等人[1]提出了一種使用Stacking集成學習算法對SVM、Logistic、CART決策樹和k近鄰這4個基礎算法進行集成的靜態檢測方法。此外,為了驗證集成學習的效果,Ali Feizollah[2]等人通過使用兩種隨機森林集成學習算法將移動惡意軟件生成的網絡流量實驗與Android惡意應用程序檢測進行對比分析。實例驗證結果顯示集成學習法能夠更好地對樣本進行學習。
然而,這些研究大多停留在粗粒度層面,即只是分析Android軟件的惡意性,卻不能給出惡意軟件的類別。因此,本文研究一種以多分類器集成學習算法為基礎的聚類+分類+鑒定模型。在對Android惡意軟件進行細粒度的分類的同時,提升檢測惡意性的準確率。
現在,為了使Android惡意攻擊更有效,攻擊者會利用機器學習算法的漏洞來欺騙Android惡意應用檢測系統的分類器,使得分類器對這些Android惡意應用的檢測結果出錯。
混淆技術是很多攻擊者為了保護惡意代碼而使用的方法,由此所得的Android惡意應用程序為了逃避檢測系統的檢測會隱藏其惡意行為。因此,為了提升檢測系統在對抗性環境下檢測惡意軟件的能力,需要采用對抗性防御策略。
使用以L0攻擊[3]為基礎的修改特征的方法來生成對抗樣本的對抗樣本生成策略是一種常見的對抗性攻擊手段。L0攻擊通過被修改的特征數量來衡量逃避檢測所付出的代價。
以L0攻擊策略為基礎的方法首先通過特征選擇算法衡量每一個特征在分類器中對于惡意性鑒定結果的影響程度,稱這種影響程度為特征重要性,以此對所有特征進行排名,通過參照那些排名靠前的特征對Android應用程序樣本中對應的特征進行修改,可以讓攻擊者在付出較小的逃避代價的前提下達到較高的逃避檢測的效果。不過,為了不影響惡意軟件原本的功能,這種修改只能是對特征的添加。
由于對抗性樣本都是根據特征重要性進行修改的,對于分類器的迎合度很高,所以平常精度越高的分類器,在面對對抗性樣本時,抵抗力越弱。Barreno等[4]分別提出了針對幾種不同的攻擊模型的防守方法,由于對抗性樣本常常利用機器學習分類器的過擬合性來欺騙分類器,因此可以得出結論:限制部分信息有助于提升分類器的魯棒性。所以本文提出,削弱學習器在軟件惡意性判定中的影響程度,可以提高對惡意對抗性樣本的檢測準確率,即增強分類器的抵抗力。
本章研究的對抗環境下基于集成學習的細粒度惡意應用分類檢測方法分為動態集成學習和對抗性學習兩部分。
動態集成學習可以分為3部分:第一部分是對已有樣本進行聚類操作以劃分樣本空間的類別;第二部分是利用代價函數來給未知樣本進行分類;第三部分是先根據聚類的結果構造對應的集成分類器,然后根據分類結果選用合適的集成分類器判斷未知樣本惡意性。
對抗性學習分為兩個部分:先從攻擊者的角度出發,為了使惡意樣本逃避檢測系統的防御,設計了對樣本特征的混淆方法,生成有效的對抗樣本;其二是研究在對抗環境中應對攻擊者生成的對抗樣本的防御策略。
本文對Android應用程序進行逆向操作,通過對Android Manifest.xml文件進行分析,可以獲取顯式意圖特征和權限特征,然后在smali文件中獲取隱式意圖特征和API。最終將每個Android應用程序轉化為一組0/1特征向量。
聚類是基于距離度量。采用自組織聚類的方法有SOM、K-Means等。樣本在特征空間被劃分為分布最為集中的一些類別。而重要的特征應該給予較大的權重,即距離度量應該反映不同特征對性能影響的不同程度。
本文采用python里的scikit-learn包來幫助研究的展開,我們調用了其中的K-Means模型,但是在使用它聚類之前,我們需要弄清楚最佳的聚類區域數量n_cluster,假設其最佳值為k。
通過兩個指標來衡量每一種k值的效果,一個是輪廓系數,另一個是肘系數。
K-Means模型中,某個點的輪廓系數為:

其中,disout為該點與本類其他點的平均距離,disin為該點與非本類點的平均距離。s表示在一次K-Means聚類后,所有樣本點的平均輪廓系數,該系數取值范圍為[-1,1],越接近1則說明不同類的樣本點之間差距越大,分類越優秀。
肘系數指每個簇的質點與簇內樣本點的平方距離誤差和,又稱為畸變程度。對一個簇而言,其畸變程度越低,說明其內部成員之間的聯系越密切,不然,就說明其內部構成越松散。因此,該值越低越好。
這兩個指標都會隨著聚類數量的增加而變化,可是如果數據內部存在區分度,輪廓系數和肘系數會在某個值處變得很好,隨后變化趨勢逐漸變緩。這個值所對應的點就是臨界點,認為其可以使聚類性能變得更好。隨后便可以用該臨界點對應的k來給n_cluster賦值,并調用K-Means模型,完成聚類。
現有的KNN模型可以實現對于未知樣本的分類,但是卻存在一個缺陷。KNN模型判斷未知樣本所屬類別的依據比較單一,它先找出距離未知樣本最近的K個樣本點,稱這K個樣本點為“近鄰”,然后統計這K個樣本點的所屬類別,最后選擇擁有最多近鄰的類別,將其作為未知樣本的分類結果。
這會產生兩個問題,首先,僅考慮屬于同一類別的近鄰數量,卻不考慮未知樣本與近鄰之間的距離,會影響分類的準確率。如圖1所示,圓形代表未知樣本,矩形與三角形代表K=5時KNN模型選出的5個近鄰,其中3個矩形屬于a類,2個三角形屬于b類。雖然a類的近鄰更多,但很明顯b類的近鄰與未知樣本的距離要比a類的近鄰與未知樣本的距離小得多。由此可見,在分類時僅僅考慮近鄰的數量并不準確,還應該考慮未知樣本與近鄰的距離。

圖1 未知樣本與近鄰
其次,KNN模型只能將樣本分到已知類別中,但Android惡意應用的發展很快,新的惡意應用類別層出不窮,如果不能采取措施識別新的應用類別,勢必會給用戶安全帶來隱患。
為了使分類結果更準確,同時提高Android檢測系統辨別新樣本類型的能力,我們設計了代價函數來評估樣本被錯誤分類的可能性。
計算未知樣本屬于某一個類a的代價,就是用屬于a的近鄰與未知樣本間的最短距離,除以未知樣本的近鄰中屬于a的近鄰數。在計算完未知樣本屬于每一個類的代價后,選擇最小的非零值作為最小代價。最小代價對應的類就認為是未知樣本所屬的類。
但是考慮到未知樣本有可能屬于一個新的樣本種類,因此在用最小代價對應的類給未知樣本分類之前,還需要判定其是否屬于已有的樣本類型。
本文計算了樣本集中所有已知樣本的最小代價,若未知樣本的最小代價小于已知樣本的最小代價的最大值,就認為該未知樣本屬于已知類型;不然,就發出提示,示意未知類型出現。具體算法如算法1所示。
算法1:
輸入:待聚類的樣本空間f,每個樣本對應的類別result,Android待檢測樣本fx。
初始化:聚類后所得類別數量k,分類系數c。1.計算未知樣本的最小代價nx,并記錄其對應的類別m'
圖5所示為某型雷達天線舉升機構重載轉動副裝配示意圖,采用的軸承型號為30210,選用的精度等級為0級。底座內孔同軸度及中心距如圖4,分別為0.025mm及152±0.1mm。
2.if n<nx+c do
3.m=m';
4.else do
5.m=未知;
6.print(“未知樣本類型”);
7.end if
輸出:Android待檢測樣本fx所屬的類別m。
多分類模型動態集成預測是指樣本經過某種機制實現預測過程中動態選擇一個或者一組預測性能優良的分類模型,或者動態調節多個分類模型的集成權重系數。所以,該方法的預測結果和魯棒性都很好[5]。
本文的集成分類器動態選擇分兩步構建。
具體做法是,將多個基礎分類器用軟投票法按一定權重集合成一個集成分類器,再用該集成分類器對相應類別的Android樣本進行K折檢測,記錄每一種權重對應的集成分類器的準確率,最終,取準確率最高的集成分類器作為該類的專屬集成分類器。因為選用的基礎分類器固定為決策樹(DT)、隨機森林(RF)、線性支持向量機(SVC)和伯努利樸素貝葉斯(NB),所以在記錄專屬集成分類器時,只需要記錄其各基礎分類器之間的權重即可。具體計算方法如公式(2)所示。

其中,m表示樣本所屬的類別;score表示集成分類器對于類別m中的樣本的惡意性的判斷結果的準確率;clf_weight_mum[m][]=[i1,i2,i3,i4]是每個樣本類別對應的專屬集成分類器的內部權重,其中i1表示DT的權重,i2表示RF的權重,i3表示SVC的權重,i4表示 NB 的權重。score1、score2、score3、score4分別是用DT、RF、SVC和NB對 m類中的所有樣本進行K折檢測后得出的判斷結果準確率。
第二步,就是對已經完成分類的未知樣本鑒定其惡意性了,根據其分類結果,選擇相應的集成分類器權重對其惡意性進行預測。具體算法如算法2所示。
算法2:
輸入:clf_weight_mum[][],m,fx。
輸出:預測結果SCORE。
1.用 DT、RF、SVC、NB 分別檢測 fx,分別得到 fx為惡意樣本的可能性 SCORE1,SCORE2,SCORE3,SCORE4;
2.SCORE=(clf_weight_mum[m][0]×SCORE1+
clf_weight_mum[m][1]×SCORE2+
clf_weight_mum[m][2]×SCORE3+
clf_weight_mum[m][3]×SCORE4)/
(clf_weight_mum[m][0]+
clf_weight_mum[m][1]+
clf_weight_mum[m][2]+
clf_weight_mum[m][3])
3.if SCORE>0.5 do
4.SCORE=1;
5.else do
6.SCORE=0
7.Return SCORE
制作對抗性樣本分為兩步。第一步,需要根據特征重要性給特征排序。我們假設檢測系統處在最不利的情況下,也就是敵人精準地知道模型與參數。通過這種方法制作出的對抗性樣本代表了攻擊者最強的攻擊水平,可以很好地檢驗檢測系統應對對抗性樣本的能力。本文的集成分類器由4種基礎分類器按一定權重組合得到,所以可以通過求每個基礎分類器中的特征重要性來組合成集成分類器的特征重要性。
1.DT,RF:直接調用屬性feature_importances_,然后歸一化,表示每個特征在DT、RF中的重要性。
2.SVC:直接調用屬性coef_(因為我們將SVC的kernel調為linear,所以其內部函數為一個線性函數,這里的coef_就是調出每個特征的系數值),對coef輸出的值取絕對值,然后歸一化,表示每個特征在SVC中的重要性。
3.NB:feature_log_prob,這個屬性值輸出的是指定類的各特征概率(條件概率)對數值。在得到這些值之后,先將每個值作為e的指數,得到原本的概率;之后,對于同一特征不同種類所得的兩個值,取較大的一個作為該特征的影響力;然后對所有特征的影響力,做歸一化處理,用來表示每個特征在NB中的重要性。
這樣,4個分類器各自輸出一個表現特征重要性的值,將這些值按照集成分類器中各個基礎分類器的權重分配相加,即可得到每個特征的綜合影響力,也就是特征重要性。
第二步,修改樣本。將特征重要性由大到小排序,根據需要取前幾個特征。制作對抗性樣本時,查詢這些特征值對應的原coef值,因為coef值越大,表明該特征導致樣本被判定為惡意性的概率越大。又因為本文使用的數據均為0/1矩陣的形式,若某一樣本的某一特征值為1,表明該樣本具有該特征。所以,若coef為正,則特征值不變;若coef為負,則將特征值改為1。
理想的防御策略應該使敵手付出昂貴的代價,即需要修改大量特征才能逃避檢測,并且還要兼顧對惡意程序的本身功能不能有較大影響。
由于對抗性樣本都是根據特征重要性進行修改的,對于分類器的迎合度很高,所以平常精度越高的分類器,在面對對抗性樣本時,抵抗力越弱。因此要想增強分類器的抵抗力,就需要在做出判斷時適當減弱特征的影響力,從而削弱對抗性樣本更改特征后對于最終結果的影響程度。同時,還需要適當調整用于鑒定樣本惡意性的閾值,以使結果更加精確。具體算法如算法3所示。
算法3:
輸入:每個聚類區域包含的樣本class_if[][],對抗性樣本的分類m,對抗性樣本fx。
初始化:用于減弱特征影響力的參數x,用于判斷樣本惡意性的閾值y。
1.用 DT、RF、SVC、NB 分別檢測 fx,分別得到 fx為惡意樣本的可能性 scorel,score2,score3,score4;2.SCORE=
(class_if[m][0]×scorel+
class_if[m][1]×score2+
class_if[m][2]×score3+
class_if[m][3]×score4)×(1-2x)/
(class_if[m][0]+class_if[m][1]+
class_if[m][2]+class_if[m][3])+x
3.if SCORE>y do
4.SCORE=1;
5.else do
6.SCORE=0;
輸出:預測結果SCORE
本節將對第2節中介紹的Android應用分類與檢測方法的效果進行實驗驗證。首先,將本文提出的專屬集成分類器檢測未知樣本時的準確率與基礎分類器的準確率進行對比,以體現Android應用分類與檢測方法在鑒定未知樣本惡意性時的效果。然后,我們將比較本文提出的Android應用分類與檢測方法在檢測屬于未知類型的未知樣本時的效果,以驗證其預知未知類型樣本的能力。
2.1.1 實驗數據
本文實驗中使用的Android應用來自多個不同權威的應用市場,每個應用被分為良性的或惡意的。良性樣本數量為3 000個,它們來自Google Play,因為Google Play上有自己的檢測系統,所以可以認為在其上面發布的Android應用程序都是良性的。而惡意樣本的來源是多樣的,共收集了10 153個惡意應用程序,它們來自AMD[6]、VirusTotal[7]、F-Droid[8]等。
2.1.2 結果與分析
對于比較本文提出的系統與單一基礎分類器的準確率這一實驗,將聚類所得的class_if[][]的每個子集按照1:3的比例隨機地分為測試集與訓練集。用訓練集分別訓練本文提出的系統以及另外 4個基礎分類器(DT,RF,SVC,NB),然后用測試集分別測試。實驗結果顯示,本文提出的系統在檢測樣本的惡意性時,擁有更高的準確率。
數據如表1所示,本文所提出的基于集成學習的Android惡意應用分類檢測系統的平均準確率高達93.10%,比單一的基礎分類器都要高。

表1 不同模型的準確率
驗證基于集成學習的軟件分類檢測系統判斷未知樣本類型的能力時,需要在class_if[][]中,任選5個類別的全部樣本作為訓練集,其余數據均作為測試集,檢測測試集中的樣本被判斷為未知樣本類型的樣本的比率。
需要注意的是,本文之前的聚類結果共包含9個樣本類型,因此可以認為,如果檢測系統只學習了其中部分類別的樣本,那么其余沒有被學習的類型的樣本對于該系統而言,均屬于未知類型。因此,比率越高,說明該系統發現屬于未知類型的未知樣本的能力越強。最終結果顯示,本系統在面對未知樣本類型時,檢測的平均比率為90.25%。
本節對基于對抗學習的反惡意混淆檢測方法進行實驗評估。
對于沒有使用對抗性防御策略的基于集成學習的Android惡意軟件分類檢測系統,稱其為原始系統。
對于使用對抗性防御策略的基于集成學習的Android惡意軟件分類檢測系統,稱其為對抗性系統。
首先根據對抗性樣本生成的攻擊策略來制作對抗性樣本,然后將這些對抗樣本作為測試集分別直接送到原始系統與對抗性系統中進行檢測,比較兩者的準確率。
測試結果顯示,原始系統對于對抗性樣本的防御能力很弱,當修改的特征數量分別為5和10時,檢測準確率分別只有76.23%和38.54%。
至于對抗性系統,若想使其準確率盡可能達到最大,需要確定算法3中x,y的取值,實驗中x的取值范圍是[0,0.5),y的取值范圍是(0,1.0)。經過實驗,當x=0.42,y=0.46時,該系統在對抗性環境下具有較強的魯棒性,對于對抗性樣本的檢測準確度最高,達到91.85%,與原始系統相比,準確率得到了極大的提高。
本文提出了一種Android惡意應用分類與檢測方法,該方法不僅對靜態特征進行了全面準確的提取,還研究了一種聚類+分類模型,以實現對Android未知樣本的分類與檢測;最后本文研究在對抗環境下敵手的攻擊策略與分類器的防御策略,進一步加強了分類器的魯棒性。在未來工作中,還需要對靜態資源進行進一步挖掘,并且進一步探索對其他類型攻擊的防御策略,從多方面來提升本文研究的分類器的魯棒性。