陳 鐳,楊章靜,黃 璞
(1.南京審計(jì)大學(xué) 實(shí)驗(yàn)中心,江蘇 南京 211815;2.南京審計(jì)大學(xué) 信息工程學(xué)院,江蘇 南京 211815;3.南京大學(xué) 計(jì)算機(jī)軟件新技術(shù)國家重點(diǎn)實(shí)驗(yàn)室,江蘇 南京 210232)
近年來,全球智能手機(jī)用戶數(shù)量呈指數(shù)級增長,估計(jì)到2021 年將達(dá)到17.7 億部。Android 被設(shè)計(jì)成一個(gè)開放、免費(fèi)和可編程的操作系統(tǒng),設(shè)備和用戶數(shù)量龐大,應(yīng)用程序豐富,已成為目前最為流行的移動智能操作系統(tǒng)。然而,Android 系統(tǒng)的開放性不僅吸引了合法應(yīng)用的開發(fā)者,也出現(xiàn)了眾多的惡意軟件[1]。賽門鐵克公司提供的互聯(lián)網(wǎng)安全威脅報(bào)告指出,每5個(gè)Android 應(yīng)用中就會有1 個(gè)實(shí)際上是惡意軟件,這給Android 用戶帶來了嚴(yán)重的風(fēng)險(xiǎn)。
常用的商業(yè)惡意軟件檢測工具,如“360 手機(jī)安全衛(wèi)士”“騰訊手機(jī)管家”等,一般采用基于簽名的檢測方法。基于簽名的檢測技術(shù)源于模式匹配[2-3]的思想,為每種已知惡意代碼產(chǎn)生一個(gè)唯一的簽名特征標(biāo)記,來創(chuàng)建惡意代碼庫?;诤灻臋z測方法相對簡單,檢測速度快,在惡意代碼庫比較大的情況下,可以獲得較好的檢測效果。但是這種方法對于不在惡意代碼庫中的軟件無法檢測,且隨著惡意代碼庫越來越大,不僅占用大量的存儲空間,還需要大量的人力來更新維護(hù)惡意代碼庫。而且一旦惡意軟件對代碼進(jìn)行微小的修改和偽裝,基于簽名的檢測方法就失去了相應(yīng)的檢測能力。
為了應(yīng)對不斷發(fā)展的Android 惡意軟件攻擊,近年來機(jī)器學(xué)習(xí)技術(shù)越來越多地應(yīng)用到Android 惡意軟件檢測領(lǐng)域[4]。在這些系統(tǒng)中,基于不同的特征表示(如權(quán)限[5]、API 調(diào)用[6-8]、系統(tǒng)調(diào)用圖[9-10]、動態(tài)行為[11]等),可以分為基于靜態(tài)特征[12]、動態(tài)特征和靜動態(tài)特征結(jié)合的方法[13]。采用不同的機(jī)器學(xué)習(xí)算法,如支持向量機(jī)(SVM)[14]、隨機(jī)森林和深層神經(jīng)網(wǎng)絡(luò)[15],構(gòu)建模型來檢測惡意軟件,都取得了不錯(cuò)的效果。
本文采用基于靜態(tài)特征檢測的思路,對機(jī)器學(xué)習(xí)方法引入到Android 惡意軟件檢測領(lǐng)域進(jìn)行了實(shí)驗(yàn)驗(yàn)證,實(shí)驗(yàn)過程如圖1 所示。首先提取Android 應(yīng)用程序的靜態(tài)特征,把特征映射到高維向量,然后采用機(jī)器學(xué)習(xí)算法構(gòu)建并訓(xùn)練模型,訓(xùn)練好的模型可直接部署到用戶的Android 設(shè)備上,最后對待測Android 應(yīng)用軟件進(jìn)行檢測。
圖1 檢測實(shí)驗(yàn)流程圖
Android 平臺上,惡意軟件往往通過重打包的方式偽裝成正常軟件引導(dǎo)用戶下載安裝。通常在后臺撥打電話、發(fā)送攔截服務(wù)短信、推送廣告等,使用戶在毫不知情的情況下被扣去通信費(fèi)用。部分惡意軟件搜集用戶敏感信息,將短信內(nèi)容、通訊錄列表信息、地理位置信息等敏感數(shù)據(jù)發(fā)送到指定服務(wù)器;還有部分惡意軟件通過非法獲取root 權(quán)限,在未經(jīng)用戶允許的情況下惡意刪除用戶數(shù)據(jù)、耗費(fèi)系統(tǒng)資源、刪除系統(tǒng)組件、更改系統(tǒng)外觀、加密文件、勒索錢財(cái)?shù)?,對用戶正常使用造成?yán)重的破壞和影響。
應(yīng)用軟件想要在Android 設(shè)備上運(yùn)行,必須先進(jìn)行編譯,然后打包成為一個(gè)能夠被Android 系統(tǒng)識別并運(yùn)行的APK 文件。一個(gè)APK 文件解壓后通常包含lib 目錄、META-INF 目錄、資源文件(resources)、原生資源文件(assets)、清單文件(AndroidManifest.xml)和Dex 文件(*.dex)等。
清單文件是 Android 應(yīng)用的入口文件,每一個(gè)Android 項(xiàng)目都包含一個(gè)清單文件。文件中包含了應(yīng)用程序中所有申請使用的權(quán)限,這些權(quán)限在軟件安裝時(shí)會展示給用戶授權(quán)。比如一個(gè)游戲軟件可能需要寫入存儲卡或振動的權(quán)限,但通常不應(yīng)該申請讀取通訊錄或者短信記錄的權(quán)限。在這個(gè)環(huán)節(jié),用戶可以根據(jù)需要選擇接受或拒絕。清單文件中還包含了組成應(yīng)用程序的每一個(gè)組件如活動組件(activities)、服務(wù)組件(services)、內(nèi)容提供器組件(content providers)和廣播接收器組件(intent receivers),并使用權(quán)限(permissions)和意圖過濾器(intent)來確定組件之間以及組件和其他應(yīng)用之間的交互。
Dex 文件是應(yīng)用程序的Java 源代碼經(jīng)編譯后形成的字節(jié)碼文件,包含源程序中定義和實(shí)現(xiàn)的所有類和方法,它通過Dalvik 虛擬機(jī)解釋執(zhí)行。從Dex 文件中可以得到應(yīng)用程序的各種行為,包括敏感API 調(diào)用、受限制的API 調(diào)用、字符串常量信息、訪問操作系統(tǒng)敏感資源以及所有與系統(tǒng)相關(guān)的功能要求和許可等。
AAPT(Android asset packaging tool)工具是Android SDK 提供的工具之一,它不但可以編譯和打包原始文件,還可以逆向解壓APK 文件。APK 文件的打包與解壓流程如圖2 所示。
圖2 APK 文件打包與解壓流程
一個(gè)完整的機(jī)器學(xué)習(xí)項(xiàng)目一般流程包括:
(1)把擬解決的問題抽象成數(shù)學(xué)問題。首先要明確問題,是分類問題、回歸問題或是聚類問題。本文實(shí)驗(yàn)要解決的惡意軟件檢測問題屬于典型的二分類問題。
(2)數(shù)據(jù)獲取及分析。獲取的訓(xùn)練數(shù)據(jù)要有一定的代表性,不然會出現(xiàn)過擬合現(xiàn)象。例如分類問題,不同種類的數(shù)據(jù)規(guī)模不能有幾個(gè)數(shù)量級的差距。根據(jù)訓(xùn)練數(shù)據(jù)的量級、樣本的總量、特征的總量,可以估算出內(nèi)存占用率。內(nèi)存占用率過高甚至溢出,則需要考慮改進(jìn)算法或使用特征降維,以及采用分布式系統(tǒng)進(jìn)行訓(xùn)練。
(3)數(shù)據(jù)預(yù)處理。據(jù)統(tǒng)計(jì),數(shù)據(jù)預(yù)處理要占用整個(gè)分析過程50%~80%的時(shí)間,好的數(shù)據(jù)預(yù)處理會讓建模達(dá)到事半功倍的效果。數(shù)據(jù)預(yù)處理階段通常有4 類方法:數(shù)據(jù)的清洗、集成、變換和規(guī)約。
(4)特征工程。其目的是篩選出顯著的特征、排除非顯著的特征。特征工程能使模型的性能得到提升,在機(jī)器學(xué)習(xí)中具有非常重要的作用,有時(shí)在簡單的模型上也能取得不錯(cuò)的效果。特征工程一般包括特征構(gòu)建、特征提取、特征選擇3 個(gè)部分。期間需要用到卡方檢測、信息增益、條件熵、后驗(yàn)概率等與特征有效性分析相關(guān)的技術(shù)和方法。
(5)模型選擇與調(diào)優(yōu)。根據(jù)要解決的具體問題和數(shù)據(jù)的實(shí)際情況來選擇模型。綜合考慮樣本的數(shù)量、特征的維度、數(shù)據(jù)的分布以及要解決的問題屬于分類、回歸還是聚類,采用交差驗(yàn)證方式,觀察測試結(jié)果曲線,分析原因,嘗試找到最優(yōu)模型及參數(shù)組合。
(6)模型評估。從模型準(zhǔn)確率、精確率、召回率、ROC 曲線、均方誤差,時(shí)間復(fù)雜度、空間復(fù)雜度、遷移性、穩(wěn)定性等多個(gè)方面進(jìn)行模型評估。
本文實(shí)驗(yàn)和Drebin 項(xiàng)目[12]一致,從清單文件和Dex 文件中共提取8 類靜態(tài)特征。
1)從清單文件中提取的特征。
硬件特征(hardware components)。應(yīng)用程序請求使用手機(jī)硬件設(shè)備,如相機(jī)、藍(lán)牙或GPS 設(shè)備,則必須在清單文件中聲明這些功能。請求訪問某些硬件組合通常會反映有害行為。
請求權(quán)限特征(requested permissions)。Android平臺上的應(yīng)用和系統(tǒng)、應(yīng)用和應(yīng)用之間被權(quán)限系統(tǒng)隔離開,當(dāng)應(yīng)用想要訪問某些數(shù)據(jù)或準(zhǔn)備執(zhí)行特定操作時(shí),必須申請相應(yīng)的權(quán)限。惡意軟件通常會更頻繁地請求某類權(quán)限,例如申請發(fā)送SMS 相關(guān)的權(quán)限。
應(yīng)用組件特征(application components)。Android系統(tǒng)中存在4 種不同類型的應(yīng)用程序組件:Activities、Services、Providers 和Receivers。這些組件的名稱可能有助于識別同一個(gè)家族演變的惡意軟件。例如,DroidKungFu 病毒的幾種變體共享特定名稱的服務(wù)組件。
意圖特征(filtered intents)。Android 系統(tǒng)進(jìn)程內(nèi)和進(jìn)程間通信主要通過Intent 進(jìn)行。例如startActivity函數(shù)給某個(gè)Activity 組件發(fā)送Intent,以啟動該組件的一個(gè)實(shí)例;startService 函數(shù)給某個(gè)Service 組件發(fā)送Intent 以啟動這個(gè)Service。
2)從Dex 文件中提取的特征。
受限API 特征(restricted API)。指受到權(quán)限保護(hù)的API,Android 權(quán)限系統(tǒng)會對關(guān)鍵API 的訪問進(jìn)行限制。假如一個(gè)應(yīng)用使用受限API,但沒有請求相應(yīng)的權(quán)限,這表明此軟件很可能非法獲得了root 權(quán)限。
使用權(quán)限特征(used permission)。應(yīng)用程序申請了某個(gè)權(quán)限但并不一定真正會使用該權(quán)限。只有在代碼中調(diào)用了受權(quán)限保護(hù)的API,或訪問了受權(quán)限保護(hù)的數(shù)據(jù),才算正在使用了某種權(quán)限。
可疑API 特征(suspicious API)。指人為定義的某些訪問手機(jī)敏感資源,并且經(jīng)常在惡意軟件中出現(xiàn)的API。例如:加解密、發(fā)送Http 請求、獲得設(shè)備信息、讀寫SMS、讀寫外部存儲等相關(guān)API。
網(wǎng)絡(luò)地址特征(network addresses)。某些惡意軟件會定期與遠(yuǎn)程服務(wù)器建立網(wǎng)絡(luò)連接,泄露用戶隱私數(shù)據(jù)等。因此,在反匯編代碼中搜索IP 地址、資源定位符(uniform resoures cocator,URL)、主機(jī)名等字符串特征,其中一些地址可能與僵尸網(wǎng)絡(luò)有關(guān),存在于多個(gè)惡意軟件樣本中。
節(jié)2.2 中從清單文件和Dex 文件中提取的靜態(tài)特征均為字符串形式,由于大多數(shù)機(jī)器學(xué)習(xí)方法是對數(shù)值向量進(jìn)行操作,因此需要先將提取的特征字符串轉(zhuǎn)換成離散的數(shù)值形式。
特征轉(zhuǎn)換:定義一個(gè)大的集合S,集合S包含了提取的8 類特征中的所有字符串。通過向每類特征中的所有字符串添加唯一前綴,確保屬于不同類別的特征元素不會發(fā)生沖突,同時(shí)保證屬于同一種類別的特征元素的唯一性。
和集合S對應(yīng),本文定義了一個(gè)|S|維向量空間,其中的每個(gè)維度取值為0 或1。對于每一個(gè)單獨(dú)的應(yīng)用軟件x來說,是通過構(gòu)造一個(gè)特征向量來對其進(jìn)行描述,這樣對于從x中提取的特征字符串s,若s出現(xiàn)在S中,特征向量相應(yīng)的維度設(shè)置為1,否則為0。
本文嘗試選用SVM、邏輯回歸、樸素貝葉斯、決策樹等幾種常見的機(jī)器學(xué)習(xí)算法進(jìn)行模型構(gòu)建、訓(xùn)練以及分類檢測對比實(shí)驗(yàn)。
硬件環(huán)境:inter i5 8500 8 核3.0 GHz 處理器,8 GB DDR4 內(nèi)存,1TB 硬盤。
軟件環(huán)境:Win10 64 位操作系統(tǒng),JDK1.8,Weka3.8(Weka 是一款開源的,基于Java 環(huán)境的機(jī)器學(xué)習(xí)和數(shù)據(jù)挖掘工具),Python 3.7,Scikit-learn 機(jī)器學(xué)習(xí)庫。
1)獲取數(shù)據(jù)集。
實(shí)驗(yàn)選用Drebin 項(xiàng)目公開的數(shù)據(jù)集,Drebin 收集了2010 年8 月至2012 年10 月期間公開的大量App樣本,最終數(shù)據(jù)集中包含123 453 個(gè)良性應(yīng)用、5 560個(gè)惡意應(yīng)用,并提取了8 類靜態(tài)特征。
2)數(shù)據(jù)預(yù)處理。
由于Drebin 項(xiàng)目中良性應(yīng)用和惡意應(yīng)用的比例相差過大,惡意應(yīng)用只占良性應(yīng)用不到5%的比例,造成樣本類別分布偏差過大,本文使用Scikit-learn 庫提供的隨機(jī)方法 train_test_split(),抽取良性應(yīng)用的1/10,即12 345 個(gè)良性應(yīng)用和全部的5 560 個(gè)惡意應(yīng)用,組成17 905 個(gè)樣本的數(shù)據(jù)集。
劃分訓(xùn)練集和測試集:隨后按照66%和34%的比例劃分訓(xùn)練集和測試集,最終的訓(xùn)練集包含10 234樣本,測試集包含6 088 樣本。
3)特征工程。
從訓(xùn)練集10 234 樣本中,共提取100 234 個(gè)特征,組成100 235 維的特征向量,最后一維為標(biāo)記位。由于特征向量過于稀疏,會占用大量加載和訓(xùn)練時(shí)間。實(shí)驗(yàn)中采用Weka 平臺提供的weka.filters.unsupervised.instance.SparseToNonSparse 工具轉(zhuǎn)存為非稀疏特征向量,并存儲為arff 格式文件。
特征選擇:由于100 235 維的特征向量過大,存在大量的冗余特征,為了加快模型訓(xùn)練收斂,縮短檢測時(shí)間,采用Weka 平臺提供的特征信息增益函數(shù)weka.attributeSelection.InfoGainAttributeEval 進(jìn)行特征篩選,最終選擇了權(quán)重排名前1 000 的特征組成特征向量。
4)模型評估。
本文實(shí)驗(yàn)利用Weka 平臺提供的幾種機(jī)器學(xué)習(xí)分類算法進(jìn)行數(shù)據(jù)訓(xùn)練與模型測試,分別為線性SVM(weka.classifiers.functions.LibLINEAR)、邏輯回歸(weka.classifiers.functions.Logistic)、樸素貝葉斯(weka.classifiers.bayes.NaiveBayes)、決策樹(weka.classifiers.trees.J48)。為了保證分類結(jié)果的穩(wěn)定性,實(shí)驗(yàn)采用十折交叉驗(yàn)證的方式進(jìn)行模型訓(xùn)練,最終分類效果如表1 所示。
表1 1 000 維特征時(shí)模型分類效果評估表
從表1 可以看出,在使用相同數(shù)據(jù)集的情況下,選擇1 000 維特征時(shí),線性SVM(帶有L2 正則化項(xiàng)的損失函數(shù))算法取得了不錯(cuò)的分類效果:分類的整體準(zhǔn)確率達(dá)到了96.4%,ROC 曲線面積為0.952,模型訓(xùn)練時(shí)間1.18 s,模型測試時(shí)間0.16 s。
在不進(jìn)行特征選擇,共100 234 維特征時(shí),線性SVM 算法分類的整體準(zhǔn)確率有了進(jìn)一步的提高,達(dá)到了97.6%,ROC 曲線面積為0.971,模型訓(xùn)練時(shí)間2.89 s,不過模型測試時(shí)間增加到17.82 s。
從實(shí)驗(yàn)結(jié)果可以看出,以上4 種算法總體上準(zhǔn)確率都達(dá)到了不錯(cuò)的效果,從而可以說明基于機(jī)器學(xué)習(xí)的Android 惡意軟件檢測方法的有效性。
本文設(shè)計(jì)實(shí)現(xiàn)了一種基于機(jī)器學(xué)習(xí)的Android 惡意軟件檢測實(shí)驗(yàn)方法。實(shí)驗(yàn)中,通過分析、提取清單文件、Dex 文件的8 類關(guān)鍵特征,使學(xué)生對Android 系統(tǒng)、應(yīng)用程序?qū)崿F(xiàn)原理及運(yùn)行機(jī)制有了更清晰的認(rèn)識。通過抽象問題、數(shù)據(jù)獲取、數(shù)據(jù)預(yù)處理、特征工程、模型訓(xùn)練、模型評估等一套完整的機(jī)器學(xué)習(xí)項(xiàng)目流程,使學(xué)生掌握了目前流行的機(jī)器學(xué)習(xí)方法,整體上提升了學(xué)生用機(jī)器學(xué)習(xí)方法分析和解決實(shí)際問題的能力。