王玉聯,魯鳴鳴
中南大學 計算機學院,長沙 410083
Android系統因開源與設備售價低廉的特點,在全球范圍內擁有廣泛的用戶。然而,Android的開源特性也使得其極容易受到攻擊,這嚴重威脅用戶個人信息安全甚至國家信息安全。2019年全年,360安全大腦共截獲移動端新增惡意程序樣本約180.9萬個,為中國用戶攔截惡意程序攻擊約9.5億次。如此數量的惡意軟件及其頻繁的攻擊將更加促進有效惡意檢測方法的開發。
越來越多惡意軟件檢測手段借助深度學習的方法,不僅實現了自動化檢測,而且達到了很高的精度。深度學習在安全領域也越來越被認為是強大且有效的工具,而其模型的決策過程對研究人員來說是不透明的。透明性的缺乏,一方面意味著模型難以分析,而且很難防止攻擊[1],另一方面,模型的決策過程難以解釋,難以取信于人,限制了其在實際中的應用。面對這一問題,一些工作通過分析模型獲取最大影響的特征,為深度學習模型提供了一定的可解釋性。這些方法基于特征相互獨立的強假設,僅僅考慮特征各自對模型的影響,但是在實際中特征之間總是存在著耦合,僅考慮單個特征對模型的影響,難以反映耦合作用。為反映不同類型軟件中敏感API的耦合作用,挖掘敏感API的組合模式,本文提出了一種可解釋的基于圖嵌入學習的方法。首先,從細粒度函數調用圖(FFCG)中提取路徑,將每一條路徑嵌入到一個固定長度的高維向量中。然后使用注意力機制獲取每一條路徑的注意力,作為該路徑的重要性程度指標。最后使用多層感知機做分類任務。本文做出了以下貢獻:
(1)提出了一種新的特征FFCG。該特征相比于傳統函數調用圖,不僅包含軟件結構信息,還融合了程序語義信息。
(2)在FFCG上采用基于圖嵌入的學習方案。通過注意力機制可獲取軟件的關鍵路徑并定位惡意行為所涉及的敏感API序列。
現有Android惡意檢測方法一般可分為三類:(1)靜態分析;(2)動態分析;(3)混合分析。靜態分析一般是指在Anroid軟件安裝和執行之前,使用靜態資源進行惡意檢測的方法,常見的靜態資源由權限[2]、組件[3-4]、靜態API[5]等;動態分析利用軟件運行時的動態特征,如系統調用[6]、動態API[7]等;混合分析[8-9]則同時利用靜態特征和動態特征。動態檢測行為難以觸發,計算代價較大,且對實時性要求較高。因此本文使用靜態檢測方法。
Suarez-Tangil等人[10]通過從代碼中提取一系列靜態特征,包括API函數調用、代碼結構、權限和被調用組件集合,使用機器學習算法檢測惡意軟件。Kong和Yan[11]提取惡意軟件的FCG,并提取圖中每個節點的6類特征。對于每一種特征,分別采用度量學習算法構建分類器,最后利用各分類器的權值組合構建集成的檢測模型。Dam和Touili[12]構建了軟件的API調用圖,并利用隨機游走圖核結合支持向量機來學會如何檢測惡意軟件。深度學習作為機器學習的一個新領域,在Android惡意檢測中相比于傳統的方法擁有更好的性能。Karbab等人[13]和McLaughlin等人[14]分別通過對DEX文件中函數的API序列和反匯編程序中的原始操作碼序列編碼,使用卷積神經網絡(CNN)做分類任務。Wang等人[15]提出一種基于深度自動編碼器(DAE)和CNN的混合模型,提高了大規模Android惡意軟件檢測的準確性和效率。
然而,深度學習的不透明性使得模型難以解釋,難以取信于人,這使其在實際中的應用受到限制。面對這一困境,有很多工作開始考慮惡意軟件檢測的可解釋性問題。Melis等人[16]使用基于梯度的方法來識別最有影響力的局部特征,并基于梯度的方法,提出了全局解釋的方法。Guo等人[17]通過使用混合回歸模型近似復雜模型的局部決策函數,解釋復雜模型的局部行為。Zhu等人[18]使用基于融合卷積神經網絡的惡意軟件檢測模型,并提出一種回溯方法,該方法通過訓練一個類似于模型性能的簡單網絡定位關鍵特征,解釋模型的決策。這些工作為深度學習模型引入了可解釋性,但是僅考慮單一特征模型的影響,無法反映實際情況中特征耦合的作用,難以刻畫特征間的組合模式。
與現有工作不同,本文受一些圖嵌入工作[19-20]的啟發,通過在FFCG上隨機游走,獲取一些組合特征——敏感API序列。同時在模型中引入了注意力機制,不需要近似模型或計算梯度便能夠通過注意力分數尋找影響模型決策的模式。
如圖1所示,使用Androguard獲取每個軟件的函數調用圖(FCG),挖掘圖中每個節點的API序列,并提取其中的敏感API序列,可得FFCG。通過隨機游走提取敏感API路徑,使用sent2vec獲取每條敏感API路徑的向量表示。并引入注意力機制,學習敏感API路徑的注意力分數。注意力分數越大則該路徑對模型決策影響越大。將各路徑信息融合以獲取Android軟件的低維稠密嵌入表示z。

圖1 模型Fig.1 Model
FCG反映了軟件中函數的調用關系。由于軟件的功能主要由庫函數和系統調用來實現,因此FCG能夠為軟件的實際行為提供靜態的有效近似。通過研究FCG的結構特性,可以進一步挖掘軟件的靜態特征。用有向圖G=(V,E)表示FCG,其中V是節點的集合,E為邊的集合。圖2是一段簡單的Android代碼實例,其對應的FCG如圖3(a)所示。FCG中每一個節點都對應該軟件中的一個函數,譬如節點1的函數名為doSentMsgTo。邊表示函數之間的調用關系。

圖2 代碼段Fig.2 Code snippet

圖3 FCG與FFCGFig.3 FCG and FFCG
對于FCG中的每一個節點對應的函數,通過函數中的Davilk指令獲取函數調用的API序列。同時,由Arzt等人[21]通過捕獲敏感數據流獲取的敏感API庫,使用敏感API庫篩選出每個函數的敏感API序列。
由于FCG僅使用序號或函數名表示節點,其只能反映軟件的結構特性。而FFCG通過獲取節點中的敏感API序列,融合了節點的內容信息。如圖3(b)所示,圖中節點不再用函數名或節點標號表示,而是使用函數中的敏感API序列來標記,譬如圖中節點1對應的敏感API序列為getdefault->sendtextmessage(省略了敏感API的包路徑,詳情見圖3(b))。
通過在FFCG隨機游走可獲取一些節點路徑。將節點路徑中節點對應的敏感API序列拼接起來,即得到一系列的路徑,稱之為敏感API路徑。如圖3(a)所示,節點路徑(1→2)中節點的敏感API序列拼接后即可得到一條敏感API路徑:
getdefault→sendtextmessage→dividemessage
本工作將自然語言處理(NLP)領域的模型sent2vec[22]應用到惡意軟件檢測任務中來向量化敏感API路徑。
采用K條敏感API路徑向量(x1,x2,…,xi,…,xK)作為輸入,則這K條敏感API路徑的權重(α1,α2,…,αi,…,αK)由下式可得:

Att為注意力的神經網絡。在Att內部使用下式計算每條敏感API路徑i的注意力分數:

其中Wα是一個權重矩陣,b和vTα分別是偏置向量和注意力向量。這三種參數都是超參數。為了在同一尺度下進行比較,softmax函數被用來規范化注意力分數αi:

顯然,αi越大就代表敏感API路徑xi對模型的分類決策影響越大。利用αi融合xi的信息,可獲取Android軟件的嵌入表示z:

之后,使用多層感知機(MLP)進一步分類任務,并使用交叉熵作為損失函數。
本文通過兩種類型的分類任務評估檢測流程,分別是:(1)惡意軟件檢測,從軟件集合中檢測出惡意軟件;(2)惡意軟件家族識別,識別惡意軟件所屬惡意家族。惡意軟件檢測數據集共包含26 000個樣本,惡意軟件和正常軟件比例為1∶1,其中惡意軟件和正常軟件分別來自amd數據集[23]和androzoo數據集[24]。惡意軟件家族識別數據集是從drebin數據集[25]中選取樣本數量最多的9個家族。表1展示了更詳細的信息。實驗中按照10折交叉驗證訓練模型。
惡意軟件檢測任務將惡意軟件視為正類,正常軟件視為負類;而惡意軟件家族識別任務則是識別惡意軟件所屬的惡意家族,評估時將每個類別單獨視為正類,所有其他類型視為負類。如表2所示,使用混淆矩陣評估分類結果,這些指標是分類任務中評估模型的經典指標。精度是正確識別的樣本數量在總樣本中的比例。查準率是正確識別的正類樣本在所有正類樣本中所占比例。查全率為正確識別的正類樣本在所有識別為正類的樣本中所占比例。F1分數是查準率與查全率的調和平均,更能反映模型的整體表現。

表1 數據集Table 1 Dataset

表2 不同算法的實驗對比Table 2 Experimental comparison of various algorithms
為了評估本文提出的模型,實驗中利用兩種機器學習分類算法作為基準進行對比:KNN、xgboost。在實驗中,KNN取k為5,設置xgboost子樹個數為100。同時,在本文提出的模型中,將敏感API路徑嵌入向量設置為64維,MLP層數設置為1,并在檢測和識別任務中分別使用sigmoid和softmax激活函數。表2總結了以各分類器在不同數據集上的查準率、查全率、分類精度等評價指標上的性能,可看出本文提出的模型在各項指標中均優于其他算法,在惡意軟件檢測和惡意家族識別方面都具有更好的性能。
本文從FFCG中提取敏感API序列,對其進行編碼,并作為神經網絡的輸入。本節嘗試使用類似的方法在傳統FCG上提取路徑,通過在傳統FCG上游走得到用戶自定義函數名序列,并同樣基于sent2vec[22]進行編碼。實驗中按照10折交叉驗證訓練模型,在惡意軟件檢測數據集上每次完整的10折交叉驗證所需時間如表3所示。

表3 FFCG和傳統FCG的時間消耗對比Table 3 Time consumption of FFCG versus traditional FCG
從表3可知,由于FCG中的函數名是由用戶自定義的,函數名的數目非常龐大,這使得提取的路徑也更加多樣,導致基于傳統FCG的模型在運行時基本處于停滯狀態。而且,基于傳統FCG特征訓練得到的模型依賴于用戶自定義的函數名,致使模型健壯性不足。
保真度測試是為了評估所選特征的保真度(正確性)。若特征ft對某類別是重要的,則刪除ft或在另一個類別樣例中添加ft會導致誤分類,或構造一個僅包含ft的樣例也能將該樣例分類正確。基于上述直覺,文獻[17]設計了三個保真度測試:
(1)特征演繹測試:通過將樣本x的關鍵特征歸零構造樣本t(x)1,檢驗分類正確率(PCR)。
(2)特征增強測試:從類別A中隨機選擇一個樣本x。用類別B的關鍵特征替換x的關鍵特征,來構造樣本t(x)2。
(3)合成測試:保留樣本x中的關鍵特征,對其他特征隨機賦值,來構造樣本t(x)3。
在每個測試后,檢驗正分類率(PCR)。PCR可測量仍歸為x原始標簽的樣品所占的比例。
本工作可以通過模型中注意力分數獲取模型判斷惡意軟件的依據,以便于進一步的分析。首先將APK文件輸入到訓練好的神經網絡中,保留神經網絡預測正確的樣本并按照注意力分數(應大于某一閾值)獲取關鍵的敏感API路徑。即任一敏感API路徑對應的注意力分數大于某閾值(實驗中設置該閾值為1/該敏感API路徑所在軟件中敏感API路徑數目),則認為該路徑對模型的最終決策起到了關鍵作用,稱之為關鍵路徑。
為了驗證通過注意力機制獲取的關鍵路徑確實是分類結果的主要貢獻者,使用保真度測試評估關鍵路徑的重要性。上述3個保真度測試,若關鍵路徑是關鍵特征,則特征演繹測試和特征增強測試會產生較低的PCR,而合成測試的PCR應較高。對于數據集1,3個測試產生測試數據集依次為T1、T2和T3,而對于數據集2,隨機選取其中的兩個家族FakeInstaller和Plankton進行測試,產生的測試數據集依次為T4、T5、T6。表4中綜合測試的PCR為87.63%、83.03%,均分別遠高于特征演繹測試和特征增強測試的PCR 65.4%、19.96%和30.05%、13.21%。這證明關鍵路徑是有效且值得信賴的,為接下來的進一步分析提供了保障。

表4 有效性測試Table 4 Fidelity evaluation
現有的大部分模型的決策過程對研究人員來說是不透明的,因此很難理解為什么樣本被標記為安全、惡意或具體的家族。本文通過注意力機制解決了這一問題。這種機制的優點在于能夠自動地學習到每條路徑的重要性——注意力分數。這使本工作能夠將更多的分析和研究放在關鍵路徑上。接下來,本文將從兩個層面分析關鍵路徑。
(1)總體分析
分別取10 000個分類正確的惡意軟件和正常軟件,統計惡意軟件和正常軟件的關鍵API路徑中敏感API的分布情況。如圖4所示,橫軸是不同的敏感API,縱軸為敏感API在惡意軟件和正常軟件中出現頻次的差值,因此紅色部分代表對應的敏感API更頻繁的被惡意軟件調用,藍色則相反。表5列出了前12個兩者頻次相差較大的敏感API以及其相差頻次。這符合人們的直覺,即惡意軟件與正常軟件在調用敏感API時,會表現出不同的傾向。

圖4 敏感API的分布在正常軟件和惡意軟件中的差別Fig.4 Distribution of sensitive APIs difference between normal software and malware

表5 惡意軟件和正常軟件調用頻次差別較大的敏感APITable 5 Sensitive APIs that vary widely in frequency of malware and normal software calls
API調用不僅可以用來表示Android應用程序的行為,它們之間的相互關系也可能反映了惡意軟件中的重要惡意行為特征。為驗證上述觀點,本文通過使用FP-growth算法[26]挖掘關鍵路徑中的頻繁項集(模式),以尋找敏感API之間的關系。圖5展示了在數據集1的關鍵路徑中挖掘得到的正常軟件和惡意軟件中的模式(更多惡意家族模式可見表6)。由圖中的模式可看出,正常軟件中是一些日志和獲取時間日期的組合操作,而惡意軟件中更多的是一些獲取設備信息、寫文件、上網等組合操作。

圖5 由關鍵路徑挖掘的模式Fig.5 Patterns mined by critical paths

表6 惡意軟件檢測關鍵路徑中的模式Table 6 Patterns in critical paths in malware detection
drebin數據集中不同的惡意家族表現出不同的惡意行為傾向。以FakeInstaller家族為例,FakeInstaller是一種特洛伊惡意軟件,它會在安裝過程中向付費號碼發送短信。結合API原型的知識,由關鍵路徑獲取的該家族模式(更多惡意家族模式可見表7)中也存在類似的行為,譬如android.telephony.smsmanager:getdefault可以管理短信息服務(SMS)的操作,還有對應的具體發送短信的敏感API(android.telephony.smsmanager:sendtext-message)。BaseBridge家族常常將機密信息(IMSI、IMEI等)發送到遠程服務器。由關鍵路徑獲取的該家族模式中也反映了這一點,包括獲取設備信息(android.telephony.telephonymanager:getsubscriberid)和連接上網(java.net.httpurlconnection:*)等操作(更多模式在表8中展示)。

表7 惡意家族識別中的模式Table 7 Patterns in malicious family identification

表8 關鍵路徑Table 8 Critical paths
(2)具體分析
總體分析以類別(或家族)進行了分析。這一部分將會針對某一特定樣本進行分析,以說明對于某一惡意軟件,本文提出的模型能夠利用軟件的關鍵路徑,定位惡意行為所涉及的敏感API序列。
例1隨機選取一個模型正確識別的惡意軟件,該軟件為FakeInstaller家族中的一員。可使用模型獲取了其關鍵路徑:getNetOp→getBroadcast→…→getSMSManager→sendTXTMsg。從該關鍵路徑中可以看出惡意軟件進行了獲取運營商名稱,管理SMS并發送信息的一系列操作,這反映出該惡意軟件極有可能存在發送收費短信的行為,這是FakeInstaller的典型惡意行為。
例2Iconosys是一種竊取個人信息的軟件。從Iconosys家族的某一模型正確識別的惡意軟件中提取關鍵路徑,取其中兩條為例:①…getDefault→divide-Msg→…→sendMultiMsg→query…;②getFrom-Loc→…→getCountryName→getAddrLin。兩條關鍵路徑分別是查詢數據庫并發送多條信息和獲取位置信息,這也正與Iconosys的常見惡意行為相匹配。
本文引入了一種基于圖嵌入和注意力機制的神經網絡,可以準確地進行Android惡意軟件的檢測與識別。該神經網絡可以尋找影響模型決策的模式以及定位惡意行為所涉及的敏感API序列。同時,本文提出了一種新的特征——FFCG,相比于傳統的FCG,它擁有更加細粒度的特征。本文的研究結果表明,正常軟件與惡意軟件間、不同惡意家族間敏感API傾向于呈現不同的組合模式。這些組合模式與涉及的惡意行為密切相關。在未來的工作中,將嘗試結合動態的信息,并探索更加高效的算法來完成檢測和識別任務。