王 濤 李 劍
(北京郵電大學計算機學院 北京 100876)
隨著科技的發展,近年來手機已經成為人們日常生活的必備品.根據IDC季度手機追蹤報告,在2017年第1季度各大公司全球出貨量達到3.443億部[1].自從2010年8月卡巴斯基首次發現短信特洛伊木馬程序以來,Android惡意軟件的數量急劇增加.從那時起,Android惡意軟件不斷發展,越來越復雜,也不斷地增強措施避免被檢測出來.正如Zhou等人[ 2 ]的研究所揭示的,惡意軟件家族通過增加代碼混淆、隱蔽的命令和控制通信通道等正在不斷加強躲避檢測.這些反分析技術不僅降低了傳統基于簽名檢測的效果,而且顯著提高了在Android應用程序中發現惡意行為和代碼的難度.專門針對Android設備的惡意軟件自2010年以來以驚人的速度增長.
研究表明,由于難以發現惡意行為,Android惡意軟件可能在3個月內被忽視[3].大多數反病毒檢測能力依賴于更新的惡意軟件簽名庫的存在,因此,一旦發生未遇到的惡意軟件傳播,用戶就處于危險之中.由于反病毒供應商的響應時間可能在幾個小時到幾天之間,來識別惡意軟件,生成簽名,再更新到其客戶的簽名數據庫,黑客有一個實質性的機會去攻擊中毒用戶,但是基于簽名的防病毒引擎平均需要48 d才能發現新的威脅.盡管谷歌推出了“Bouncer”,為其應用程序商店篩選提交惡意行為的應用程序,很多用戶還是處在風險之中.
顯然,我們需要改進檢測方法,考慮到Android惡意軟件的發展和迫切需要減少出現以前未見過的病毒所帶來的威脅的機會.因此,不同于現有的Android惡意軟件工作,本文提出了一種基于一般深度學習的檢測模型,有效地提高了惡意代碼檢測的性能.
近年來,隨著智能手機市場的不斷增加,基于Android的惡意軟件檢測技術得到了積極的研究.APK文件是在Android操作系統上的安裝軟件,每個APK必須有一個Manifest文件.該文件提供了關于Android操作系統應用程序的基本信息.它聲明應用程序必須具有哪些權限,以便訪問API的受保護部分,并與其他應用程序交互.為了保護Android用戶,應用程序對資源的訪問受到嚴格的權限限制.應用程序必須獲得權限才可以使用,例如藍牙或攝像機之類的敏感資源.Sanz等人[4]通過從應用程序自身提取的權限組合,開發了一種基于機器學習檢測的工具.ADROIT項目[5]中通過查看和分析運行時的meta-data去檢測惡意程序,建立一個高精度的分類器.
文獻[6]提出了一個基于機器學習的Android惡意軟件檢測系統.基于離線方式的支持向量機(SVM)提取和訓練了權限和控制流圖(CFG)特征,然而該實驗在實時檢測時仍不能很好地解決問題.文獻[5,7]分析了權限和其他特性,并應用各種機器學習分類器達到86%的準確率.Zhou等人[2]根據所請求的權限和行為方面的相似性,如安裝方法,檢測Android惡意軟件.
研究的另一個方面是對系統調用的分析.Xiao等人[8]提出了一個新的方案稱為人工神經網絡(ANN)對共生矩陣的機器人(ANNCMDroid),利用共生矩陣挖掘相關的系統調用.他們的主要觀察結果是系統調用的相關性在惡意軟件和良性軟件之間是顯著不同的,它們可以用共生矩陣精確地表達.在DroidAPIMiner[9]中,利用良性應用程序和惡意應用程序的不同API調用頻率進行分析,生成了不同的分類器來識別惡意軟件.
Bartel等人[10]分析了各種應用程序,發現有些應用程序聲明權限,但實際上沒有使用.因此,僅通過對權限的清單文件分析并不能給出準確的結果.在Android框架中,一旦安裝了應用程序,在運行時就會調用一組API.每個API調用都與特定權限相關聯.當調用API時,Android操作系統檢查用戶是否批準了它的相關權限.只有當它匹配時,它才能繼續執行某個API調用.因此API調用提供了一個信息,一個許可是否被實際使用.
動態特征指的是應用程序在移動設備上的安裝行為,包括應用程序在操作系統或網絡中的行為.應用程序使用系統調用來執行特定的任務,如讀、寫和打開,因為它們不能直接與Android操作系統交互.當在用戶模式下發出系統調用時,Android操作系統切換到內核模式以執行所需的任務.此外,大多數應用程序需要網絡連接.在Zhou等人[2]研究中,他們收集的Android惡意軟件樣本中有93%需要網絡連接,以便與攻擊者連接.
淺層學習無法學習到更全面的Android惡意軟件的安全語義信息;本文基于深度學習研究Android惡意軟件檢測問題,提高了特征對Android軟件的安全語義信息的表達,增加模型對安全語義信息的學習和理解能力.本系統采用基于深度學習的SDA方法研究Android惡意軟件的分類問題.SDA方法是多隱層神經網絡結構,可以逐層分析,優化每一層得到的特征向量表示,因此它提取的特征向量可以更準確地表達Android軟件的安全語義信息,提高檢測結果.
本文設計并實現了一種基于深度學習算法的Android惡意軟件檢測的系統SDADLDroid(an Andriod malware detection based on SDA deep learning algorithm),該系統通過對爬蟲爬取到的8 000個良性軟件和7 000個惡意軟件進行特征提取,對數據進行分析降維后將選擇到的961個特征利用深度學習算法SDA(stacked denoising autoencoder)建立一個3層神經網絡后,經過數據集交叉驗證,確定該方法的檢測正確率達到95.8%,豐富了Android惡意軟件的檢測方法,提高了檢測效果.
如圖1所示,系統主要分為三大部分,分別是編寫網絡爬蟲收集數據集,收集每個APK的靜態代碼特征和動態行為特征,特征降維后進行深度學習并建立良好的神經網絡進行檢測.

圖1 系統設計圖
根據研究表明,Google Play上的應用一般被認為是良性的,所以我們編寫了網絡爬蟲,隨機地在其中選取了8 000個APK作為本次研究的良性應用數據集,并且我們已經收集了7 000多個惡意應用軟件.因此本次實驗中,所有的實驗數據都是現實世界中發布的已知的良性和惡意應用軟件,實驗數據有良好的真實性.
我們對于每一個APK都利用Apktool進行了反匯編,生成了Smail文件和Manifest文件,對其中重要的靜態代碼特性(例如權限、IP地址等)進行抽取,然后對于每一個APK都開啟一個虛擬機并使用DroidBox對生成的Log日志中一些敏感的行為信息進行抽取.將這些靜態代碼特征和動態行為特征作為特征庫,利用PCA數據降維,對于降維后的數據集利用SDA算法構建神經網絡,最后利用BP算法微調結果,這樣我們構建的神經網絡就可以用于分類任務了.
2.3.1傳統自編碼
對于BP算法在訓練多層神經網絡所出現的各種問題[11],Hinton等人[12-14]提出了自動編碼機(Autodencoder),為深度學習開創了新思路.自動編碼機是一種無監督的算法,不需要對樣本進行標注,就可以有效利用樣本信息,提高模型性能.傳統的自動編碼機分為編碼和解碼2部分.編碼階段將d維輸人向量x定性映射到d′維隱層表示y,映射函數通常選用Sigmoid:
y=f(x;θ)=s(Wx+b),
(1)
其中W∈d′×d,b∈d′×1.式(1)中s是非線性函數,如Sigmoid.W是輸入層到中間層的連接權值,b為中間層的bias.解碼階段將得到的結果表示為y,并且定性地映射到d維重構向量z:
z=g(y;θ′)=s(W′y+b′),
(2)
其中W′∈d′×d,b′∈d′×1.式(2)中s是非線性函數,如Sigmoid.W′是輸入層到中間層的連接權值,b′為中間層的bias.這樣,自編碼訓練就在于用給定的N個樣本優化重構誤差,優化目標交叉熵或者均方誤差L為

(3)
2.3.2降噪自編碼
Vincent等人[15]指出,傳統自編碼在不加生成約束的情況下,很容易直接將輸入向量復制到輸出向量,或者只能產生微小的改變,此時模型只能產生較小的重構誤差,表現非常差.當測試數據和訓練數據相差很大,并且也不符合同一分布時,訓練效果也表現得非常差.為此,Vincent等人[15-16]提出了新的自編碼算法,即降噪自編碼(denoising autoencoder, DAE)算法,如圖2所示.該算法將樣本x進行毀壞改造,以一定的概率讓某些輸入層節點的值置0,從而使原樣本變為x′,再用x′訓練隱藏層:
y=f(x′;θ)=s(Wx′+b),
(4)
其余過程采用式(2)(3),與傳統AE相同.

圖2 降噪自編碼(DAE)
2.3.3構建分類模型
使用隱層輸出y作為新的輸人特征,多次重復DAE,就構成了SDA深度結構.Bengio等人[17-18]指出,不同的特征表示能突顯或剔除數據的某些解釋因子,從而具有不同的表示能力. 因此,SDA過程的目的在于尋找到一個比原始特征更適合任務要求的特征表示方法.完成深度結構后,添加節點與類別個數相同的輸出層,將最后得到的特征表示作為該輸出層的輸入.接下來將保存的訓練得到的各層權值矩陣、偏置項等作為初始參數,用BP算法微調整個SDA神經網絡,就能用于分類任務.
在本次實驗中,我們使用自己爬取的7 000個良性軟件和6 000個惡意軟件作為訓練數據,1 000個良性軟件和1 000個惡意軟件作為驗證數據.
本實驗采用準確率ACC,TPR,FPR,查準率P(precision),查全率R(recall),f-measure作為評價指標來衡量模型的效果.TP(true positive),FN(false negative),TN(true negative),FP(false positive).各個標準的計算公式和含義如下.

TPR:被正確分類的樣本數目比率;
FPR:被錯誤分類的樣本數目比率;
查準率:P=提取出的正確信息條數提取出的信息條數;
查全率:R=提取出的正確信息條數樣本中的信息條數;
f-measure:準確率和召回率加權調和平均.
表1展示了各種算法評價指標:

表1 算法評測指標
本次實驗中采用了10份驗證集和5個分類器,表2顯示了5個分類器中不同的準確率ACC、準確肯定率TPR、錯誤肯定率FPR、查準率P、查全率R以及F測度f-measure.
表2實驗結果
%

分類器ACCTPRFPRPRf-measureNB65.654.822.569.954.861.4Logistic73.771.223.874.971.273.0RT83.187.521.380.487.583.8MLP88.091.215.285.791.288.3SDA95.895.23.696.395.295.2
從實驗結果分析可以看出,我們構建的3層神經網絡[700,700,700]能夠達到最好的準確率,是一個良好的分類器,對比其他一般機器學習算法,深度學習能夠更好地完成分類任務.深度學習作為一種特征學習方法,可以把原始數據通過一些簡單的但是非線性的模型轉變成為更高層次的、更加抽象的表達.通過足夠多的轉換的組合,非常復雜的函數也可以被學習.傳統的方法是手工設計良好的特征提取器,這需要大量的工程技術和專業領域知識.但是如果通過使用通用學習過程而得到良好的特征,那么這些都是可以避免的.這就是深度學習的關鍵優勢.而我們的系統恰好就采用深度學習的優勢去避免淺層機器學習的劣勢,從而解決Android安全問題.因此,本系統能達到更高的可信度和更好的效率.
通過全面分析Android應用軟件中的安全隱患問題,提出相應的對策和建議.本文提出了基于深度學習的BP算法微調SDA神經網絡的方法,通過實驗表明,該模型可以調高檢測精度,提升檢測性能,擁有較高的準確率.
[1]IDC. Smartphone OS market share[EB/OL].[2017-04-27]. https://www.idc.com/promo/smartphone-market-share/os
[2]Zhou Y, Jiang X. Dissecting Android malware: Characteri-zation and evolution[C] //Proc of IEEE Symp on Security and Privacy. Piscataway, NJ: IEEE, 2012: 95-109
[3]Tam K, Feizollah A, Anuar N B, et al. The evolution of Android malware and Android analysis techniques[J]. ACM Computing Surveys, 2017, 49(4): 76
[4]Sanz B, Santos I, Laorden C, et al. PUMA: Permission usage to detect malware in Android[C] //Proc of Int Joint Conf on CISIS’12-ICEUTE’12-SOCO’12 Special Sessions. Berlin: Springer, 2013: 289-298
[5]Martín A, Calleja A, Menéndez H D, et al. ADROIT: Android malware detection using meta-information[C] //Computational Intelligence. Piscataway, NJ: IEEE, 2017: 1-8
[6]Sahs J, Khan L. A machine learning approach to Android malware detection[C] //Proc of European Intelligence and Security Informatics Conf. Los Alamitos, CA: IEEE Computer Society, 2012: 141-147
[7]Sanz B, Santos I, Laorden C, et al. MAMA: Manifest analysis for Malware Detection in Android[J]. Cybernetics & Systems, 2013, 44(6/7): 469-488
[8]Xiao X, Wang Z, Li Q, et al. ANNs on co-occurrence matrices for mobile malware detection[J]. KSII Trans on Internet & Information Systems, 2015, 9(7): 2736-2754
[9]Aafer Y, Du W, Yin H. DroidAPIMiner: Mining API-level features for robust malware detection in Android[M] //Security and Privacy in Communication Networks. Berlin: Springer, 2013: 86-103
[10]Bartel A, Klein J, Traon Y L, et al. Automatically securing permission-based software by reducing the attack surface: An application to Android[C] // Proc of IEEE/ACM Int Conf on Automated Software Engineering. Piscataway, NJ: IEEE, 2012: 274-277
[11]Bengio Y. Learning deep architectures for AI[J]. Foundations and Trends in Machine Learning, 2009, 2(1): 1-127
[12]Hinton G E, Osindero S, Teh Y W. A fast learning algorithm for deep belief nets[J]. Neural Computation, 2006, 18(7): 1527-1554
[13]Bengio Y, Lamblin P, Popovici D, et al. Greedy layer-wise training of deep networks[C] //Advances in Neural Information Processing Systems 19. Cambridge: MIT Press, 2007: 153-160
[14]Lecun Y, Bottou L, Bengio Y, et al. Gradient-based learning applied to document recognition[J]. Proceedings of the IEEE, 1998, 86(11): 2278-2324
[15]Vincent P, Larochelle H, Lajoie I, et al. Stacked denoising autoencoders: Learning useful representations in a deep network with a local denoising criterion[J]. Journal of Machine Learning Research, 2010, 11(6): 3371-3408
[16]Vincent P, Larochelle H, Bengio Y, et al. Extracting and composing robust features with denoising autoencoders[C] //Proc of the 25th Int Conf on Machine Learning. New York: ACM, 2008: 1096-1103
[17]Bengio Y, Delalleau O. On the expressive power of deep architectures[C] //Proc of Int Conf on Discovery Science. Berlin: Springer, 2011: 18-36
[18]Bengio Y, Courville A, Vincent P. Representation learning: A review and new perspectives[J]. IEEE Trans on Software Engineering, 2013, 35(8): 1798-1828