超凡,楊智,杜學(xué)繪,孫彥
(1.信息工程大學(xué)密碼工程學(xué)院,河南 鄭州 450001;2.中國(guó)電子技術(shù)標(biāo)準(zhǔn)化研究院,北京 100007)
目前,Android操作系統(tǒng)已經(jīng)牢牢占據(jù)半數(shù)以上的市場(chǎng),是最受歡迎的智能移動(dòng)平臺(tái)之一。然而,這樣的成功背后潛藏著大量的安全隱患。Android開放的生態(tài)環(huán)境為應(yīng)用程序的編寫提供了便利,但也使惡意軟件可利用的漏洞增多。為了牟取金錢利益,惡意軟件開發(fā)人員熱衷于針對(duì)Android應(yīng)用程序展開惡意活動(dòng),竊取用戶隱私、重新打包良性應(yīng)用等行為層出不窮。
惡意軟件數(shù)量的快速增長(zhǎng)促進(jìn)了研究人員對(duì)安全工具的開發(fā)。雖然Android框架本身擁有沙箱隔離、權(quán)限機(jī)制等安全設(shè)計(jì),但這不足以抵抗惡意軟件越來越隱蔽多變的技術(shù)手段。在Android安全領(lǐng)域,已經(jīng)有許多工作致力于檢測(cè)惡意軟件,主要分為動(dòng)態(tài)分析和靜態(tài)分析兩類。動(dòng)態(tài)分析在Android應(yīng)用程序運(yùn)行時(shí)跟蹤其行為,而靜態(tài)分析對(duì)應(yīng)用的APK文件進(jìn)行分析。隨著人工智能技術(shù)的發(fā)展,基于機(jī)器學(xué)習(xí)的惡意軟件檢測(cè)方法逐漸得到探索,支持向量機(jī)(SVM,support vector machine)是其中的代表模型,代表工作有文獻(xiàn)[1-3]。與傳統(tǒng)機(jī)器學(xué)習(xí)算法相比,深度學(xué)習(xí)能夠更充分地挖掘特征之間的深層聯(lián)系,是近年來非常具有發(fā)展?jié)摿Φ囊粋€(gè)研究方向。
深度學(xué)習(xí)使用的特征可以通過動(dòng)態(tài)或靜態(tài)方式提取。文獻(xiàn)[4-6]是使用動(dòng)態(tài)特征的深度學(xué)習(xí)檢測(cè)系統(tǒng)。Dahl等[4]首次將神經(jīng)網(wǎng)絡(luò)應(yīng)用于惡意軟件檢測(cè),從文件的動(dòng)態(tài)分析中提取低級(jí)特征,通過隨機(jī)映射降維,并使用深度神經(jīng)網(wǎng)絡(luò)(DNN,deep neural network)進(jìn)行分類,他們的工作能夠預(yù)測(cè)未知文件是惡意還是良性,也可以識(shí)別惡意軟件所屬類別。MtNet[5]是一個(gè)與之類似的多任務(wù)深度學(xué)習(xí)惡意軟件分類架構(gòu)。Tobiyama等[6]提出基于進(jìn)程行為的惡意軟件進(jìn)程檢測(cè),將一組API調(diào)用序列輸入長(zhǎng)短期記憶網(wǎng)絡(luò)進(jìn)行進(jìn)一步的特征精煉,然后通過卷積神經(jīng)網(wǎng)絡(luò)(CNN,convolutional neural network)進(jìn)行分類。
使用靜態(tài)特征的系統(tǒng)從APK文件中挖掘不同的分析關(guān)鍵。例如,文獻(xiàn)[7-10]分別提取函數(shù)調(diào)用圖、API調(diào)用序列、原始操作碼序列、原始操作碼序列與指令功能序列作為特征,使用的分類器均為CNN。文獻(xiàn)[11]通過自動(dòng)提取請(qǐng)求的權(quán)限和敏感API,訓(xùn)練基于深度置信網(wǎng)絡(luò)(DBN,deep belief network)的學(xué)習(xí)模型。文獻(xiàn)[12]在DBN的基礎(chǔ)上添加自動(dòng)編碼器網(wǎng)絡(luò),能夠有效地對(duì)特征數(shù)據(jù)集進(jìn)行降維。文獻(xiàn)[13]提取API調(diào)用、服務(wù)及敏感權(quán)限作為特征,提出了一種基于深度森林的惡意軟件行為檢測(cè)機(jī)制,采用ReliefF算法進(jìn)行降維,并將樣本分為良性應(yīng)用及3類不同行為的惡意軟件。
還有一些工作從靜態(tài)與動(dòng)態(tài)兩方面提取混合特征。Droid-Sec[14]是一個(gè)基于半監(jiān)督DBN的Android惡意軟件檢測(cè)系統(tǒng),特征包括權(quán)限、敏感API及動(dòng)態(tài)行為。同樣采用DBN的混合分析方法還有DroidDetector[15]和DeepDroid[16]。HADM[17]為每個(gè)特征向量集訓(xùn)練DNN,將DNN學(xué)習(xí)的特征與原始特征相結(jié)合,然后使用多核學(xué)習(xí)進(jìn)行分類。SDADLDroid[18]收集APK文件的混合特征,經(jīng)主成分分析數(shù)據(jù)降維后輸入多層降噪自動(dòng)編碼機(jī)進(jìn)行學(xué)習(xí)。
本文提出一種基于深度神經(jīng)網(wǎng)絡(luò)的Android惡意軟件檢測(cè)方法,可以判斷應(yīng)用程序是良性還是惡意,并能識(shí)別惡意軟件所在的家族。針對(duì)以往工作中提取的特征不夠全面,本文對(duì)應(yīng)用程序的APK文件進(jìn)行靜態(tài)分析,從配置文件和反編譯代碼中收集應(yīng)用組件、Intent Filter、權(quán)限、數(shù)據(jù)流等多方面特征。由數(shù)據(jù)集樣本的所有特征組成特征庫,并為每個(gè)樣本生成各自的特征向量。經(jīng)觀察,這樣的特征向量中存在大量為零的維度,且有很多對(duì)于分類來說無意義的特征,應(yīng)當(dāng)對(duì)特征空間予以簡(jiǎn)化。因此,本文基于遺傳算法[19]設(shè)計(jì)了一個(gè)特征選擇方案。
本文預(yù)期實(shí)現(xiàn)惡意軟件檢測(cè)與家族分類的雙重目標(biāo),不僅能夠?qū)⒘夹詰?yīng)用與惡意軟件區(qū)分開來,而且可以準(zhǔn)確地將惡意軟件定位到其所屬家族。家族是指具有共同起源特征的一類惡意軟件,家族內(nèi)的惡意軟件之間有著相似的行為方式。因此,本文設(shè)計(jì)的分類實(shí)驗(yàn)并非是傳統(tǒng)惡意軟件檢測(cè)的二分類,而是將良性應(yīng)用單獨(dú)作為一個(gè)類別、惡意軟件直接以家族為類別的多分類。要達(dá)到這樣精細(xì)的分類,需要一個(gè)強(qiáng)有力的深度學(xué)習(xí)模型。實(shí)驗(yàn)表明,深度神經(jīng)網(wǎng)絡(luò)可以較好地完成這一任務(wù)。
本節(jié)探討了哪些特征可以在Android惡意軟件檢測(cè)中發(fā)揮作用。通過觀察良性應(yīng)用與惡意軟件的不同之處并分析差異產(chǎn)生的原因,選出了一系列有代表性的特征,它們均可以通過應(yīng)用程序的配置文件和DEX代碼整理獲得。
(1)四大組件
Android應(yīng)用程序由4種類型的組件構(gòu)成,分別是Activity、Service、Broadcast Receiver和Content Provider。Activity提供用戶操作的可視化界面,完成特定的用戶交互功能。Service進(jìn)行背景任務(wù),通常用于在后臺(tái)處理耗時(shí)的操作或監(jiān)控其他組件的運(yùn)行狀態(tài)。Broadcast Receiver是一個(gè)全局監(jiān)聽器,接收特定廣播消息并作出響應(yīng)。Content Provider的主要作用是跨程序共享數(shù)據(jù),提供標(biāo)準(zhǔn)接口以支持多個(gè)應(yīng)用存儲(chǔ)和讀取結(jié)構(gòu)化數(shù)據(jù)。應(yīng)用程序組件都需經(jīng)過注冊(cè)方能被系統(tǒng)識(shí)別。
(2)組件比重
事實(shí)上,惡意軟件與良性應(yīng)用的組件構(gòu)成比重有所不同。普遍來說,惡意軟件會(huì)比良性應(yīng)用注冊(cè)更高比例的Broadcast Receiver,而Activity、Service和Content Provider等組件的比重相應(yīng)降低。
由于隱蔽的惡意活動(dòng)需要選擇合適的時(shí)機(jī),惡意軟件希望能夠在系統(tǒng)環(huán)境發(fā)生改變時(shí)得到相關(guān)提示,如網(wǎng)絡(luò)連通性的改變、電池電量不足等。Broadcast Receiver接收廣播的功能決定了該類型組件在監(jiān)視系統(tǒng)事件方面有著廣泛的用途,在惡意軟件中相當(dāng)流行。
與此同時(shí),作為一款應(yīng)用程序,惡意軟件仍然需要假意向終端用戶提供一些實(shí)用功能,但這些功能非常有限,完全無法與良性應(yīng)用所能提供的相提并論。這就意味著惡意軟件注冊(cè)的Activity、Service和Content Provider組件數(shù)目占比較小。
(3)組件名稱
Android開發(fā)鼓勵(lì)代碼的重復(fù)利用。這種情況不僅在良性應(yīng)用中會(huì)出現(xiàn),而且在惡意軟件中相當(dāng)常見,這也是區(qū)分兩類應(yīng)用程序的一個(gè)重要線索。
在良性應(yīng)用中,同一開發(fā)團(tuán)隊(duì)設(shè)計(jì)的應(yīng)用之間固然會(huì)有一定的相似性,但也會(huì)利用其他知名應(yīng)用開放的各種組件,在自家產(chǎn)品中申請(qǐng)其他應(yīng)用的自定義權(quán)限,這些權(quán)限通常來自華為、騰訊、阿里巴巴、谷歌、Facebook等企業(yè)。
然而,代碼的再利用問題是一把雙刃劍。同一家族內(nèi)的惡意軟件大多具有類似的惡意行為,可能擁有相同的核心組件,共享實(shí)現(xiàn)攻擊的代碼。例如,在惡意軟件家族DroidKungFu1中,盡管每個(gè)惡意軟件具有不同的包名,但大多包含組件com.google.ssearch.SearchService。而諸如com.google.ads.AdActivity等組件,甚至遍及數(shù)個(gè)惡意軟件家族。另外,有些重復(fù)利用的組件在保留名稱的基礎(chǔ)上改變前綴。例如,在RogueSPPush家族中,組件MoreExcting Activity非常流行,某一樣本中含有名為com.talkweb.comm.MoreExctingActivity的組件,而在另一樣本中則變成了com.heroit.tzuwei.lite.More Excting Activity。
惡意軟件熱衷于把自己掩飾成良性應(yīng)用,以便更好地在Android市場(chǎng)上隱蔽。通常,應(yīng)用程序的功能通過編寫組件來實(shí)現(xiàn),因此組件的命名需要清晰地表達(dá)用途。一般來說,組件名稱采用幾個(gè)單詞的組合,如ModifyPasswordActivity是一個(gè)提供修改密碼功能的Activity組件。筆者觀察到,良性應(yīng)用的組件名多為3個(gè)及以上單詞的組合,惡意軟件多為兩個(gè)單詞的組合,由此可見這兩類應(yīng)用程序在組件名的長(zhǎng)度和復(fù)雜性方面存在一定的差異。而有時(shí),惡意軟件未必遵循這一編程慣例,故意將組件冠以具有一定迷惑性的名稱,如com.google.update.Update。普通用戶可能會(huì)被這些名字欺騙,誤將惡意軟件當(dāng)作知名公司提供的產(chǎn)品。
(4)特征提取
本文在考慮與應(yīng)用程序組件相關(guān)的特征時(shí),分別記錄每個(gè)應(yīng)用中各類型組件數(shù)占總數(shù)的比例及其無前綴組件名稱。
(1)ICC機(jī)制
Android操作系統(tǒng)擁有一個(gè)獨(dú)特的通信模型,稱為組件間通信(ICC,inter-component communication)機(jī)制,它提供特定的方法以便同一應(yīng)用內(nèi)甚至不同應(yīng)用間的組件進(jìn)行數(shù)據(jù)交換。然而,惡意軟件很可能濫用該機(jī)制,以達(dá)到竊取用戶隱私等目的,因此,可在特征庫中加入可以反映ICC活動(dòng)的特征。
ICC機(jī)制使用被稱為Intent的特殊異步消息,可在Activity、Service、Broadcast Receiver這3種組件間傳遞信息。Intent通過屬性對(duì)期望執(zhí)行的動(dòng)作進(jìn)行抽象,主要分為顯式和隱式兩種。顯式Intent直接指明目標(biāo)組件名稱,多用于在應(yīng)用程序內(nèi)部傳遞消息。隱式Intent的目標(biāo)組件不是通過指定名稱,而是通過設(shè)置Intent的其他屬性進(jìn)行篩選,因而在跨應(yīng)用消息傳遞方面有著廣泛應(yīng)用。想要接收隱式Intent的組件,必須在AndroidManifest.xml文件中聲明相應(yīng)的Intent Filter。然后,系統(tǒng)進(jìn)行Intent解析,匹配出合適的組件。
(2)Intent Filter的用途
Intent Filter在Android應(yīng)用程序中應(yīng)用廣泛。無論是在良性應(yīng)用還是惡意軟件中,有很多組件注冊(cè)Intent Filter,但這兩種應(yīng)用程序?qū)ζ涞氖褂梅绞酱蟛幌嗤A夹詰?yīng)用主要用于正常的組件間信息傳遞和協(xié)調(diào)工作,而惡意軟件則可以劫持Intent趁機(jī)發(fā)動(dòng)攻擊。通過精心設(shè)計(jì)Intent Filter來截獲未受到權(quán)限保護(hù)的隱式Intent,惡意軟件可以通過Activity劫持或Service劫持獲取用戶數(shù)據(jù)信息、故意發(fā)送錯(cuò)誤結(jié)果對(duì)原程序造成破壞,也可以竊聽、篡改、丟棄廣播內(nèi)容,或者根據(jù)被廣播的系統(tǒng)范圍事件進(jìn)行其他惡意活動(dòng)。
(3)Intent Filter的屬性
Intent Filter具有多個(gè)屬性,最重要的當(dāng)屬action和category,因?yàn)樗鼈兣cIntent要執(zhí)行的動(dòng)作息息相關(guān),可以確切反映出它的意圖。屬性action是表現(xiàn)Intent要執(zhí)行的動(dòng)作名稱的字符串,Android定義了一系列的標(biāo)準(zhǔn)動(dòng)作,應(yīng)用可以根據(jù)需要自定義動(dòng)作。為了防止應(yīng)用程序之間互相影響,一般自定義action的命名方式是在動(dòng)作名稱前加上包名作為前綴,如com.intsig.camscanner.Launcher。屬性category是包含Intent額外信息的字符串,用來表現(xiàn)動(dòng)作的類別。這兩種屬性通常一起使用。同樣地,category也有系統(tǒng)定義和自定義兩種。
(4)特征提取
manifest文件中聲明了Intent Filter的組件,本文將其組件名稱與對(duì)應(yīng)Intent Filter的兩大屬性信息作為一個(gè)整體記錄在特征庫中。單純的組件命名可能有偶然性,但加上Intent Filter能在很大程度上反映出該組件的用途及其關(guān)注點(diǎn)。
這一組合加強(qiáng)了組件名稱這一類特征的針對(duì)性,但本文同樣關(guān)注Intent Filter本身所包含的意義,通過記錄Intent Filter中聲明的action和category屬性字符串,本文可以得知組件感興趣的事件,從而推斷出該應(yīng)用程序是否具有惡意。
(1)權(quán)限機(jī)制
權(quán)限機(jī)制是Android平臺(tái)中一種很重要的安全機(jī)制。權(quán)限主要通過限制應(yīng)用程序?qū)ο到y(tǒng)資源的訪問以及組件之間的數(shù)據(jù)共享,達(dá)到保護(hù)用戶隱私和平臺(tái)安全性的目的。它是對(duì)進(jìn)程沙箱隔離機(jī)制的一種有力補(bǔ)充,增強(qiáng)了單獨(dú)進(jìn)程空間中應(yīng)用獲得系統(tǒng)信息和與其他應(yīng)用通信的能力。
(2)權(quán)限范圍
默認(rèn)情況下,Android應(yīng)用不具有任何權(quán)限,必須在AndroidManifest.xml文件中進(jìn)行申請(qǐng)。Android框架提供了一套系統(tǒng)權(quán)限,開發(fā)人員也可以根據(jù)需要自定義權(quán)限。根據(jù)protectionLevel屬性值的不同,Android權(quán)限可劃分為普通、危險(xiǎn)、簽名、系統(tǒng)4個(gè)保護(hù)級(jí)別。隨著Android版本不斷提升,可選擇的系統(tǒng)權(quán)限也會(huì)有所變化。在本文的數(shù)據(jù)集中,應(yīng)用程序使用的API版本不同,加上大量自定義權(quán)限的存在,導(dǎo)致需要考慮的權(quán)限范圍很廣泛。
(3)Android版本對(duì)權(quán)限機(jī)制的影響
從Android 6.0版本開始,Google對(duì)權(quán)限模型做了一次大調(diào)整。在以往的權(quán)限模型中,應(yīng)用在配置文件中申請(qǐng)所需的權(quán)限,并在安裝時(shí)向用戶呈現(xiàn),用戶只能選擇全部接受或放棄安裝。權(quán)限一旦授予就無法更改,用戶無法掌握權(quán)限的具體用途。新權(quán)限模型采用動(dòng)態(tài)授權(quán),應(yīng)用程序申請(qǐng)危險(xiǎn)權(quán)限后,在運(yùn)行時(shí)向用戶請(qǐng)求授權(quán),且用戶可以隨時(shí)在設(shè)置中修改這一授權(quán)。一旦某個(gè)權(quán)限被撤銷,應(yīng)用在使用時(shí)必須重新請(qǐng)求用戶的同意。此外,新增了權(quán)限組的概念,用戶對(duì)危險(xiǎn)權(quán)限的授予以組為單位進(jìn)行。
然而,程序在運(yùn)行時(shí)具體遵循何種權(quán)限機(jī)制,不僅與應(yīng)用的SDK版本有關(guān),也與用戶設(shè)備安裝的Android系統(tǒng)版本有關(guān),其中存在二者的兼容問題。此外,在新權(quán)限模型中,用戶在實(shí)際應(yīng)用時(shí)具體會(huì)觸發(fā)哪些權(quán)限是未知的,而這些權(quán)限是否會(huì)得到用戶授權(quán)也是一個(gè)問題??紤]到這些情況,本文采用一種較為保守的方式,忽略數(shù)據(jù)集中各種應(yīng)用程序的不同SDK版本,統(tǒng)一以靜態(tài)授權(quán)的方式看待所有權(quán)限,即不考慮同組權(quán)限無須明確申請(qǐng)的可能,也不考慮部分權(quán)限可能無法得到用戶授權(quán)的可能。
(4)權(quán)限使用
如果應(yīng)用程序?qū)嶋H使用了沒有申請(qǐng)的權(quán)限,在調(diào)用權(quán)限的相應(yīng)功能時(shí),會(huì)拋出Security Exception異常。然而,應(yīng)用程序在manifest文件中申請(qǐng)的權(quán)限與代碼中以API形式體現(xiàn)出的權(quán)限使用點(diǎn)并非完全一致。有許多原因可能會(huì)造成這種情況。
①并非所有權(quán)限的目標(biāo)都是保護(hù)系統(tǒng)API接口,也可能用于數(shù)據(jù)庫操作和消息傳遞等其他方面。Content Provider存儲(chǔ)用戶數(shù)據(jù),有時(shí)需要權(quán)限來限制其他應(yīng)用對(duì)其進(jìn)行操作。例如,為了對(duì)存放聯(lián)系人數(shù)據(jù)的Content Provider執(zhí)行讀取查詢,應(yīng)用必須擁有READ_CONTACTS權(quán)限。權(quán)限也可以限制系統(tǒng)Intent消息的接收,只有擁有適當(dāng)權(quán)限的應(yīng)用才可以得到相關(guān)通知。
應(yīng)用程序可能會(huì)申請(qǐng)其他應(yīng)用定義的權(quán)限。Android系統(tǒng)允許應(yīng)用程序自定義權(quán)限,一般用于保證跨應(yīng)用組件通信與共享數(shù)據(jù)的安全性。除了同一企業(yè)內(nèi)不同應(yīng)用通過自定義權(quán)限共享信息的需要,也可以申請(qǐng)其他開發(fā)者定義的權(quán)限。應(yīng)用程序可以公開某些組件,便于其他應(yīng)用調(diào)用,從而實(shí)現(xiàn)應(yīng)用之間的跳轉(zhuǎn)。
②本文選擇的實(shí)驗(yàn)工具可能不夠完善,無法檢測(cè)到所有需要權(quán)限的API函數(shù)。
③對(duì)于目標(biāo)SDK版本大于或等于23的應(yīng)用程序來說,新權(quán)限模型導(dǎo)致同組權(quán)限無須全部申請(qǐng)。
④程序開發(fā)人員經(jīng)驗(yàn)不足造成的錯(cuò)誤。Android文檔可以提供的權(quán)限信息內(nèi)容比較有限,甚至存在錯(cuò)誤和遺漏之處,使開發(fā)人員對(duì)于需要申請(qǐng)哪些權(quán)限把握不當(dāng)。
⑤部分權(quán)限無法發(fā)揮作用。例如,應(yīng)用程序申請(qǐng)簽名級(jí)別的權(quán)限,卻不具有相應(yīng)的私鑰簽名,Android系統(tǒng)會(huì)自動(dòng)判定該權(quán)限無效。
(5)特征提取
權(quán)限能夠在較大程度上反映出應(yīng)用程序所需的資源,是一種很重要的行為指示。Android應(yīng)用的權(quán)限使用情況復(fù)雜,本文在提取特征時(shí)簡(jiǎn)化了對(duì)其的考慮。根據(jù)應(yīng)用程序在配置文件中申請(qǐng)的權(quán)限,以及工具在代碼中找到的受權(quán)限保護(hù)的API使用點(diǎn),將權(quán)限特征分成3個(gè)部分:申請(qǐng)且以API形式使用的權(quán)限及其API使用點(diǎn)、申請(qǐng)且未以API形式使用的權(quán)限、未申請(qǐng)且以API形式使用的權(quán)限及其API使用點(diǎn)。除了權(quán)限以外,本文還記錄受權(quán)限保護(hù)的API使用點(diǎn),雖然要達(dá)到同一目的有很多API可供選擇,但同一家族惡意軟件針對(duì)某些權(quán)限的常用API是有偏向性的,且良性應(yīng)用與惡意軟件對(duì)API的選擇上有一定的差異,因此記錄使用權(quán)限的API及其出現(xiàn)次數(shù)很有必要。
(1)污點(diǎn)分析
隱私泄露是Android應(yīng)用程序面臨的主要安全問題之一,是指在用戶不知情的情況下將個(gè)人信息傳出設(shè)備的行為。在現(xiàn)有的Android機(jī)制下,智能設(shè)備中存儲(chǔ)了大量的用戶隱私數(shù)據(jù),而用戶對(duì)應(yīng)用具體如何使用這些數(shù)據(jù)缺乏清晰的認(rèn)識(shí),這使惡意軟件有了可乘之機(jī)。
污點(diǎn)分析是檢測(cè)Android隱私泄露問題的常用手段,通過跟蹤隱私數(shù)據(jù)從源頭到流出點(diǎn)的流動(dòng)過程,指出應(yīng)用對(duì)隱私數(shù)據(jù)的使用方式,從而判斷是否存在隱私泄露。數(shù)據(jù)源即數(shù)據(jù)進(jìn)入程序的入口,被稱為source,是讀取資源的API調(diào)用接口;數(shù)據(jù)流出點(diǎn)即數(shù)據(jù)離開程序的出口,被稱為sink,是寫入資源的API調(diào)用接口。數(shù)據(jù)流就是從source到sink的API路徑。
(2)分析工具
本文使用FlowDroid[20]來識(shí)別Android應(yīng)用程序中的數(shù)據(jù)流。FlowDroid提供了一個(gè)高度精確的靜態(tài)污點(diǎn)分析,追蹤隱私數(shù)據(jù)在控制流圖中的傳遞,具有完全的對(duì)象敏感、流敏感、上下文敏感性。FlowDroid默認(rèn)配置的是SUSI[21]項(xiàng)目提供的source/sink API列表。
(3)特征提取
雖然隱私泄露的情況可以反映應(yīng)用程序的惡意性,但并非所有惡意軟件都會(huì)竊取隱私,而且在良性應(yīng)用中存在著使用敏感數(shù)據(jù)的合理訴求。即FlowDroid顯示的數(shù)據(jù)流結(jié)果未必是隱私泄露的表現(xiàn),但在某種程度上體現(xiàn)了應(yīng)用對(duì)數(shù)據(jù)的獲取與使用方式。因此,本文不是通過確定特定數(shù)據(jù)流是否具有惡意,而是從整體數(shù)據(jù)流情況上衡量良性應(yīng)用與惡意軟件之間的行為差異。
本文認(rèn)為FlowDroid輸出的source-sink對(duì)代表了敏感數(shù)據(jù)流,因此將應(yīng)用程序輸入FlowDroid進(jìn)行分析。從相同源獲取的數(shù)據(jù)可以有不同的流出點(diǎn),而不同源的數(shù)據(jù)也可以流向同一個(gè)出口,但只要處于不同的代碼位置上就會(huì)被忠實(shí)地記錄,因此得到的source-sink對(duì)的數(shù)量相當(dāng)可觀。
雖然SUSI從語義上提供了source、sink的進(jìn)一步分類,但本文沒有采用這種形式,而是以完整的方法簽名來表達(dá)數(shù)據(jù)流。前者固然能夠更好地說明敏感數(shù)據(jù)的使用方式,但通常存在多種接口函數(shù)可以達(dá)到同樣的效果。一般來說,良性應(yīng)用會(huì)選擇較為普及的Android API方法來訪問和使用敏感信息,而惡意軟件開發(fā)者出于躲避安全分析工具的心理會(huì)選擇一些知名度較低的API函數(shù)。因此,良性應(yīng)用和惡意軟件在FlowDroid中輸出的source、sink以及source-sink對(duì)結(jié)果都會(huì)有所不同。
為了使本文的分析通用可擴(kuò)展,根據(jù)前文對(duì)良性應(yīng)用和惡意軟件的觀察,筆者將特征空間進(jìn)行相應(yīng)劃分,并將所有特征表示為字符串的形式,而應(yīng)用的特征向量在各自維度上表現(xiàn)為對(duì)應(yīng)特征的數(shù)量。從本文數(shù)據(jù)集樣本中提取的所有特征組成了最終的特征庫。綜上所述,本文的特征空間組成如表1所示。
表1 特征空間組成Table 1 Composition of feature space
為了進(jìn)行面向Android平臺(tái)的惡意軟件檢測(cè),需要將應(yīng)用程序的大量活動(dòng)從不同角度抽象成特征,并逐步處理成學(xué)習(xí)模型可接受的表達(dá),本文的整個(gè)系統(tǒng)設(shè)計(jì)如圖1所示,主要分成5個(gè)步驟。
1)特征提取:對(duì)數(shù)據(jù)集中的Android應(yīng)用程序進(jìn)行靜態(tài)分析,提取相應(yīng)的特征,所有樣本特征組成特征庫。
2)特征向量生成:將特征庫轉(zhuǎn)化為一個(gè)特征空間,并分別將每個(gè)應(yīng)用的特征集在其中進(jìn)行映射,生成應(yīng)用的特征向量。
3)特征選擇:初步提取的特征總數(shù)較大,而且其中有許多無用特征,在此情況下進(jìn)行機(jī)器學(xué)習(xí)的效率較低,因此采用遺傳算法對(duì)特征空間進(jìn)行壓縮。
4)深度神經(jīng)網(wǎng)絡(luò)學(xué)習(xí):在得到最終的特征向量后,可以采用有效的深度學(xué)習(xí)技術(shù)進(jìn)行分類。本文選擇深度神經(jīng)網(wǎng)絡(luò)模型。
5)分類:經(jīng)過深度神經(jīng)網(wǎng)絡(luò)學(xué)習(xí),本文預(yù)期的分類結(jié)果既可以將惡意軟件與良性應(yīng)用區(qū)分開來,又可以得到有關(guān)惡意軟件所屬家族的信息。因此,本文采用了一種特殊的多分類方法,其中包含二分類信息。
為了更好地從Android應(yīng)用程序中獲得所需信息,本文借助工具Androguard[22]和FlowDroid[20]對(duì)應(yīng)用的APK文件進(jìn)行靜態(tài)分析,提取相關(guān)特征。
Androguard基于Python開發(fā),是一款常用的Android應(yīng)用程序靜態(tài)分析工具。Androguard在其源碼主目錄下集成了10多種子工具,分析人員可以以命令行的方式按需獲取應(yīng)用程序的各項(xiàng)基本信息,并且生成一些相關(guān)的調(diào)用圖。
圖1 系統(tǒng)設(shè)計(jì)Figure 1 System design
FlowDroid是一款用Java實(shí)現(xiàn)的、針對(duì)Android的開源靜態(tài)污點(diǎn)跟蹤工具。FlowDroid通過準(zhǔn)確地建模Android應(yīng)用程序的生命周期及其與操作系統(tǒng)之間的交互,從源頭開始追蹤敏感數(shù)據(jù)在組件中流動(dòng)的過程。
圖2概述了本文如何利用這兩大靜態(tài)分析工具提取所需特征。
圖2 特征提取Figure 2 Feature extraction
在應(yīng)用程序特征提取完畢后,本文將數(shù)據(jù)集中所有樣本的特征匯總成一個(gè)特征庫,其中的每個(gè)特征都以字符串的形式來表達(dá)。大多數(shù)的機(jī)器學(xué)習(xí)方法適用于數(shù)值型向量,因此需要將提取的特征字符串嵌入向量空間,只記錄特征的數(shù)值。對(duì)于每個(gè)應(yīng)用,特征向量的維度都與特征庫的規(guī)模相同,是一一對(duì)應(yīng)的關(guān)系。根據(jù)特征庫,每個(gè)應(yīng)用將自身擁有的特征映射成特征向量相應(yīng)位置上的數(shù)字,不具備的特征對(duì)應(yīng)0。
根據(jù)前面所述的特征提取方式,本文從1 340個(gè)良性應(yīng)用和1 260個(gè)惡意軟件中初步提取了24 162個(gè)特征。平均而言,每個(gè)應(yīng)用程序擁有的特征不過數(shù)十個(gè),特征向量中存在大量值為0的維度。在原始特征數(shù)量下進(jìn)行機(jī)器學(xué)習(xí)花費(fèi)的時(shí)間較長(zhǎng),且容易產(chǎn)生過擬合現(xiàn)象,導(dǎo)致模型泛化性能較差。因此,本文擬采用遺傳算法[19]對(duì)特征空間進(jìn)行壓縮,從中過濾掉無用特征,篩選出表達(dá)能力更強(qiáng)的200個(gè)特征。
遺傳算法是一種以遺傳學(xué)理論為基礎(chǔ)、模擬生物進(jìn)化過程的搜索優(yōu)化計(jì)算模型。標(biāo)準(zhǔn)的遺傳算法遵循“生成+測(cè)試”的迭代過程,從初始解開始進(jìn)行擇優(yōu)繁殖,逐步篩選出一定條件下的最優(yōu)解。下面是基于遺傳算法對(duì)特征選擇問題的解決方案。
1)問題建模:根據(jù)遺傳算法的模型,對(duì)問題進(jìn)行結(jié)構(gòu)化表示。在遺傳算法中,問題的可行解被稱為染色體,它是基因的集合。具體來說,基因指的是特征庫中的特征,染色體就是特征的組成方案。因此,每個(gè)特征選擇方案對(duì)應(yīng)的染色體都帶有24 162個(gè)基因。本文采用二進(jìn)制編碼,用0、1來表達(dá)解中是否存在某個(gè)特征。
2)種群初始化:種群是現(xiàn)有染色體組成的集合。在算法運(yùn)行之初,通過隨機(jī)生成一組可行解,形成初始種群。此處,對(duì)可行解的定義是在24 162個(gè)基因中只有200位被標(biāo)為1的染色體。種群規(guī)模越大,越有可能找到全局最優(yōu)解,但所需的運(yùn)行時(shí)間相對(duì)較長(zhǎng)。本文設(shè)定的種群規(guī)模為30。
3)個(gè)體評(píng)價(jià):適應(yīng)度函數(shù)是個(gè)體對(duì)環(huán)境適應(yīng)程度的評(píng)價(jià)標(biāo)準(zhǔn),體現(xiàn)了在當(dāng)前背景下個(gè)體的優(yōu)劣情況。適應(yīng)度的取值范圍為[0,1],得分越高,個(gè)體的適應(yīng)程度越好。在特征選擇問題中,本文將適應(yīng)度定義為當(dāng)前特征選擇方案下的機(jī)器學(xué)習(xí)精度。
4)遺傳操作:遺傳操作模擬基因進(jìn)化,是實(shí)現(xiàn)優(yōu)勝劣汰的有力手段。在初始種群形成后,通過將優(yōu)秀個(gè)體的基因進(jìn)行結(jié)合重組,以期產(chǎn)生具有更強(qiáng)適應(yīng)性的后代。遺傳操作包括選擇、交叉和變異3個(gè)基本的遺傳算子。
①選擇運(yùn)算:選擇操作確定每次迭代時(shí)種群中哪些個(gè)體可以成為父代。根據(jù)生物進(jìn)化規(guī)律,適應(yīng)度更高的個(gè)體理應(yīng)得到更多的機(jī)會(huì)繁殖后代。當(dāng)然,這不意味著適應(yīng)度低的個(gè)體完全不可能遺傳基因。因此,父代選擇應(yīng)當(dāng)是一種基于適應(yīng)度但具有一定概率性的過程。
輪盤賭選擇是一種常用的選擇算子。它將當(dāng)前種群中所有個(gè)體適應(yīng)度的總和對(duì)應(yīng)到一個(gè)輪盤的圓周,每個(gè)個(gè)體按其適應(yīng)度在適應(yīng)度總和中的比例占據(jù)輪盤的相應(yīng)扇區(qū)。每次選擇父代時(shí),只需轉(zhuǎn)動(dòng)輪盤,即可得到一個(gè)候選者。每輪進(jìn)化都將種群進(jìn)行一次徹底更新,因此進(jìn)行30次選擇。父代之間隨機(jī)配對(duì),經(jīng)過繁殖后得到相同數(shù)量的子代。
②交叉運(yùn)算:交叉是將父母的染色體按照一定的方式進(jìn)行結(jié)合,從而生成新的個(gè)體。由于本文問題的可行解需要滿足特征數(shù)為200,因此交叉算法在均勻交叉的基礎(chǔ)上進(jìn)行一點(diǎn)改變。將父母染色體按其適應(yīng)度之比等比例分配200個(gè)值為1的基因位,根據(jù)分配到的個(gè)數(shù),從自身200個(gè)非零基因中進(jìn)行等概率選取,遺傳給子代。本文設(shè)定的交叉概率為0.6。
③變異運(yùn)算:變異以很小的概率隨機(jī)改變?nèi)旧w上某些基因值,能夠向已有染色體中引入新的遺傳結(jié)構(gòu)。本文采用均勻變異算子,每個(gè)基因的值都以相同的概率發(fā)生隨機(jī)變化,但同樣要保證染色體中非零基因只有200個(gè)。通常,變異率是一個(gè)比較小的值,以保證優(yōu)秀的解不會(huì)發(fā)生過多的變形。本文設(shè)定的變異率為0.001。
5)替換策略:經(jīng)過一輪遺傳操作,所有新生成的子代會(huì)組成當(dāng)代種群,替代原有個(gè)體。進(jìn)化的過程不是一帆風(fēng)順的,相鄰子代之間未必會(huì)得到更好的種群,但是從全局來看,種群必定會(huì)向著更加適應(yīng)環(huán)境的方向發(fā)展。
6)終止條件:在理想情況下,進(jìn)化次數(shù)應(yīng)該是無窮的,但實(shí)際應(yīng)用時(shí)往往需要人為限制一個(gè)終止條件,以平衡算法效果和執(zhí)行效率之間的關(guān)系。本文設(shè)置算法在進(jìn)化100代后終止,這足以得到一個(gè)最優(yōu)可行解。
由特征選擇的最優(yōu)解得到最終特征空間后,還需要對(duì)數(shù)據(jù)集中樣本的原始特征向量進(jìn)行相應(yīng)的調(diào)整,然后進(jìn)入深度學(xué)習(xí)的過程。
(1)監(jiān)督學(xué)習(xí)
監(jiān)督學(xué)習(xí)是一種常用的機(jī)器學(xué)習(xí)范式,利用已標(biāo)記的數(shù)據(jù)集,通過某種學(xué)習(xí)方法建立一個(gè)模型,實(shí)現(xiàn)對(duì)未標(biāo)記新數(shù)據(jù)的分類。監(jiān)督學(xué)習(xí)主要經(jīng)歷訓(xùn)練和測(cè)試兩個(gè)階段,分別輸入訓(xùn)練樣本和測(cè)試樣本。訓(xùn)練樣本需要給出類別標(biāo)簽來指示模型的生成,而測(cè)試樣本對(duì)模型來說類別未知,以便測(cè)試訓(xùn)練效果。在訓(xùn)練階段,根據(jù)學(xué)習(xí)算法對(duì)訓(xùn)練樣本的特征向量進(jìn)行訓(xùn)練,據(jù)此生成一個(gè)模型。然后進(jìn)入測(cè)試階段,輸入測(cè)試樣本的特征向量,模型會(huì)對(duì)其進(jìn)行分類,可預(yù)測(cè)未知樣本的類別,也可以據(jù)此與樣本的真實(shí)類別進(jìn)行比較,評(píng)估模型的學(xué)習(xí)效果。
(2)深度神經(jīng)網(wǎng)絡(luò)
本文選擇的算法模型是DNN。DNN是深度學(xué)習(xí)中經(jīng)典的全連接神經(jīng)網(wǎng)絡(luò)架構(gòu),適用于處理復(fù)雜數(shù)據(jù)情況下的建模問題。它的模型結(jié)構(gòu)層次較深,追求學(xué)習(xí)效果,忽視結(jié)果的可解釋性。以SVM為代表的傳統(tǒng)機(jī)器學(xué)習(xí)算法結(jié)構(gòu)較為簡(jiǎn)單,通常只能達(dá)到二分類的效果,無法應(yīng)對(duì)大樣本情況下的多分類問題。在基于深度學(xué)習(xí)的惡意軟件檢測(cè)系統(tǒng)中,CNN、DBN是兩種應(yīng)用較多的網(wǎng)絡(luò)。CNN的卷積網(wǎng)絡(luò)使其適于處理具有空間結(jié)構(gòu)或連續(xù)性的數(shù)據(jù),如文獻(xiàn)[7,10]為CNN提取了函數(shù)調(diào)用圖、指令序列等連續(xù)特征,但對(duì)于多個(gè)離散特征集來說并不合適。與DNN純粹的監(jiān)督訓(xùn)練相比,DBN引入一個(gè)無監(jiān)督的預(yù)訓(xùn)練過程來進(jìn)行權(quán)重偏置的初始化,該過程對(duì)于無標(biāo)簽的小樣本數(shù)據(jù)來說較有意義,對(duì)當(dāng)前數(shù)據(jù)集來說收益不大。相比之下,本文方法通過對(duì)惡意軟件和良性應(yīng)用的豐富觀察完成較為全面的特征工程,且在進(jìn)入學(xué)習(xí)前已經(jīng)通過特征選擇進(jìn)行降維,深度學(xué)習(xí)只需完成分類任務(wù)即可,在全連接網(wǎng)絡(luò)中的計(jì)算速度也不慢。因此,DNN更適合本文的整個(gè)系統(tǒng)架構(gòu)。
(3)算法實(shí)現(xiàn)
本文利用流行的TensorFlow框架[23]實(shí)現(xiàn)深度神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)。TensorFlow由Google人工智能團(tuán)隊(duì)Google Brain開發(fā)維護(hù),是一個(gè)基于數(shù)據(jù)流編程的符號(hào)數(shù)學(xué)系統(tǒng),可進(jìn)行各類機(jī)器學(xué)習(xí)和深度學(xué)習(xí)算法的編程實(shí)現(xiàn),被譽(yù)為人工智能的開源神器。TensorFlow框架提供了很多實(shí)用的開發(fā)接口,支持GPU計(jì)算,便于高效搭建出網(wǎng)絡(luò)架構(gòu)。
本文預(yù)期達(dá)到兩個(gè)分類效果,區(qū)分惡意軟件和良性應(yīng)用,并了解惡意軟件所在的家族。因此,對(duì)數(shù)據(jù)集樣本性質(zhì)的標(biāo)注并非采用傳統(tǒng)的良性、惡意兩個(gè)類別,除了所有良性應(yīng)用作為單獨(dú)的一個(gè)類別,惡意軟件并非作為一個(gè)整體,而是按照其所屬家族進(jìn)行歸類。以這種方式,本文把良性應(yīng)用與惡意軟件家族放在一個(gè)類別層面上進(jìn)行考慮。這樣的多分類方法將二分類包含在內(nèi),既能夠比純粹的二分類得到更多有關(guān)惡意軟件的信息,又省去了“先二分類,再多分類”的多次學(xué)習(xí)方式的不便。
本文也曾嘗試為良性應(yīng)用采用一種分類標(biāo)準(zhǔn)。然而,目前各大Android應(yīng)用市場(chǎng)的分類尚未統(tǒng)一、具有較強(qiáng)的主觀性,且同一類別下的應(yīng)用程序功能分散,相似點(diǎn)不夠明顯,遠(yuǎn)不如惡意軟件家族內(nèi)的聯(lián)系緊密。顯然,市場(chǎng)分類不足以從技術(shù)層面上區(qū)分良性應(yīng)用,不具備借鑒意義。因此,本文沒有對(duì)良性應(yīng)用進(jìn)行分類,而是將其作為一個(gè)整體來考慮,希望可以在將來的工作中通過聚類等手段為其構(gòu)建新的分類。
本節(jié)介紹實(shí)驗(yàn)實(shí)施的細(xì)節(jié),包括數(shù)據(jù)集的來源、特征選擇前后特征數(shù)量的分布、二分類與多分類實(shí)驗(yàn)的評(píng)估結(jié)果,以及全過程的運(yùn)行時(shí)間開銷。
本文的實(shí)驗(yàn)數(shù)據(jù)集分為良性樣本和惡意樣本兩部分。惡意軟件來自Android Malware Genome Project[24],能夠評(píng)估Android惡意軟件檢測(cè)方法的有效性。同時(shí),在2019年8—12月期間,筆者在華為應(yīng)用市場(chǎng)上下載了各個(gè)類別中排名靠前的Android應(yīng)用程序。為確保良性數(shù)據(jù)集的真實(shí)性和可靠性,本文將其發(fā)送到VirusTotal[25]服務(wù)進(jìn)行檢查。VirusTotal是一個(gè)免費(fèi)提供可疑文件分析服務(wù)的網(wǎng)站,使用70多種反病毒掃描引擎對(duì)用戶上傳的文件進(jìn)行檢測(cè),給出各個(gè)工具的安全分析結(jié)果。在未超時(shí)的情況下,當(dāng)且僅當(dāng)所有的反病毒掃描程序均顯示為未發(fā)現(xiàn)警告時(shí),才將應(yīng)用程序標(biāo)注為良性。在使用Androguard和FlowDroid進(jìn)行分析的過程中,部分應(yīng)用程序由于文件損壞或無法被完整地提取特征而排除在考慮范圍之外。最終,本文得到來自49個(gè)家族的1 260個(gè)惡意軟件,以及來自華為市場(chǎng)17個(gè)類別的1 340個(gè)良性應(yīng)用,共計(jì)2 600個(gè)實(shí)驗(yàn)樣本。
在提取所有樣本特征后,組成了原始的特征空間。這一特征空間過大,導(dǎo)致分類效率較低,因此,基于遺傳算法對(duì)已有特征進(jìn)行選擇,構(gòu)成新的特征空間。表2給出了特征選擇前后的特征分布統(tǒng)計(jì)情況。
表2 特征分布Table 2 Feature distribution
本文最終得到的200個(gè)特征涉及各個(gè)特征類別,由此可見,本文的特征提取方案是有效的,但其中有許多特征對(duì)于分類來說無足輕重,或特征之間存在關(guān)聯(lián)性導(dǎo)致其包含冗余信息。此外,由表2可以看出,遺傳算法篩選后的特征分布與原始特征分布并不一致。
與應(yīng)用組件相關(guān)的特征分為組件名稱和組件占比這兩部分。在原始特征集中,由于良性應(yīng)用的組件數(shù)量較多,導(dǎo)致組件名特征占據(jù)了很大一部分空間。經(jīng)過特征選擇后,保留的多為惡意軟件家族中出現(xiàn)頻率較高的組件名稱,且通常帶有Intent Filter。良性應(yīng)用組件名特征的縮減幅度最大,因?yàn)槠渲杏写罅拷M件只出現(xiàn)過一次,對(duì)于分類來說毫無意義。雖然組件比重在原始特征集中只有4個(gè),但仍有2個(gè)保留了下來,分別是Activity和Broadcast Receiver的占比,充分表明記錄該特征的必要性。
Intent Filter、權(quán)限類別的特征分布與原分布有一定的相似性。雖然Intent Filter和權(quán)限特征在新特征空間中的數(shù)量低于樣本類別數(shù),但這兩類特征與組件名特征的不同之處在于,重復(fù)的組件名稱主要限定在家族之內(nèi),而常用的Intent Filter和權(quán)限大致有一定的范圍且多為系統(tǒng)定義,家族之間的區(qū)別在于特征組合方式不同。相同的是,這些類型的原始特征有很大一部分是由良性應(yīng)用引入的,且自定義特征占據(jù)了相當(dāng)?shù)谋戎亍?/p>
信息流特征主要涉及惡意軟件的信息泄露行為,良性應(yīng)用中雖有對(duì)敏感數(shù)據(jù)的使用,但目的不同導(dǎo)致兩種應(yīng)用程序偏好的敏感API及數(shù)據(jù)流路徑不同。遺傳算法保留的信息流特征兼顧了良性應(yīng)用與惡意軟件的不同情況。
由此可見,特征選擇過濾掉的絕大部分特征與良性應(yīng)用相關(guān),因?yàn)榱夹詰?yīng)用普遍體量較大、特征較多,且大部分特征在其他樣本中的出現(xiàn)次數(shù)極為有限,對(duì)于分類來說缺乏指示性。這充分說明了惡意軟件與良性應(yīng)用之間的一個(gè)巨大差別,即惡意軟件以家族為單位呈現(xiàn)出較強(qiáng)的聯(lián)系性,而良性應(yīng)用的特征則較為分散。
本文采用10折交叉驗(yàn)證[26]對(duì)實(shí)驗(yàn)結(jié)果進(jìn)行評(píng)估,基于同一數(shù)據(jù)集將DNN與SVM、CNN、DBN方法的表現(xiàn)相比較。其中,SVM是傳統(tǒng)機(jī)器學(xué)習(xí)算法的代表,而CNN和DBN是近期相關(guān)工作中出現(xiàn)頻率較高的深度學(xué)習(xí)網(wǎng)絡(luò)。在保證數(shù)據(jù)分布較為一致的前提下,本文把良性和惡意數(shù)據(jù)集各自隨機(jī)分成10個(gè)互不相交的子集。在每一輪實(shí)驗(yàn)中,將一個(gè)尚未挑選過的良性子集和一個(gè)惡意子集作為測(cè)試數(shù)據(jù)集,剩余子集作為訓(xùn)練數(shù)據(jù)集。如此依次進(jìn)行10輪實(shí)驗(yàn),每輪實(shí)驗(yàn)互不干擾,不僅可以保證每次實(shí)驗(yàn)使用的訓(xùn)練與測(cè)試樣本不會(huì)重復(fù),而且數(shù)據(jù)集中的每個(gè)應(yīng)用程序都能得到一次測(cè)試分類的機(jī)會(huì)。
(1)實(shí)驗(yàn)配置
本文在一臺(tái)搭載6核1.10 GHz的Intel Core i7-10710U處理器和16 GB內(nèi)存的計(jì)算機(jī)上進(jìn)行實(shí)驗(yàn)?;诋?dāng)前數(shù)據(jù)集,深度學(xué)習(xí)的最佳網(wǎng)絡(luò)結(jié)構(gòu)需通過實(shí)驗(yàn)來決定,下面給出檢測(cè)效果最好的參數(shù)配置。
①DNN采用全連接網(wǎng)絡(luò),具有2個(gè)隱藏層,每個(gè)隱藏層有120個(gè)節(jié)點(diǎn)。
②DBN由2層受限玻爾茲曼機(jī)和1層反向傳播網(wǎng)絡(luò)構(gòu)成,其中隱藏層節(jié)點(diǎn)數(shù)均為150。
③CNN由1個(gè)卷積層、1個(gè)最大池化層、1個(gè)全連接層和Softmax分類器組成,采用128個(gè)長(zhǎng)度為3的卷積核。
此外,激活函數(shù)均為ReLU,丟棄率為0.5。
(2)實(shí)驗(yàn)結(jié)果
本文的多分類實(shí)驗(yàn)涉及50個(gè)類別,其中49個(gè)是惡意軟件家族,1個(gè)是良性應(yīng)用類別。這一設(shè)計(jì)既能得到Android應(yīng)用程序是否具有惡意的二分類結(jié)果,又可以進(jìn)一步區(qū)分惡意軟件家族之間的差異。3個(gè)深度學(xué)習(xí)網(wǎng)絡(luò)均可直接進(jìn)行多分類,而SVM是二值分類器,無法一次性得出多分類結(jié)果,因此采用一對(duì)多法,每次訓(xùn)練將其中一個(gè)類別與其他類別相區(qū)分。
表3比較了不同機(jī)器學(xué)習(xí)算法對(duì)于應(yīng)用程序性質(zhì)判斷的二分類結(jié)果,這些數(shù)據(jù)基于多分類實(shí)驗(yàn)結(jié)果,并規(guī)定惡意軟件為正樣本,良性應(yīng)用為負(fù)樣本。對(duì)于二分類任務(wù),本文使用的度量標(biāo)準(zhǔn)是查準(zhǔn)率、查全率、F1值和精度。查準(zhǔn)率是所有分類結(jié)果為正的樣本中正確預(yù)測(cè)的比例,查全率是所有正樣本中正確預(yù)測(cè)的比例,精度是所有樣本中正確預(yù)測(cè)的比例。查準(zhǔn)率和查全率是一對(duì)矛盾的度量,F(xiàn)1值是二者的調(diào)和平均,給出這兩個(gè)度量標(biāo)準(zhǔn)的一個(gè)綜合性能。二分類結(jié)果表明,DNN可以將數(shù)據(jù)集中97.73%的應(yīng)用程序正確分類為惡意軟件或良性應(yīng)用,分類效果優(yōu)于其他3種機(jī)器學(xué)習(xí)算法。
表3 二分類結(jié)果比較Table 3 Comparison of binary classification results between different networks
表4記錄了不同機(jī)器學(xué)習(xí)算法的多分類比較結(jié)果。對(duì)于多分類任務(wù),對(duì)應(yīng)的度量標(biāo)準(zhǔn)分別是宏查準(zhǔn)率、宏查全率、宏F1值和精度。宏查準(zhǔn)率和宏查全率分別是各類別查準(zhǔn)率和查全率的平均值,宏F1值是二者的調(diào)和平均。此外,表4給出了各算法的計(jì)算時(shí)間,其中SVM的耗時(shí)為50次二分類的平均用時(shí)。
表4 多分類實(shí)驗(yàn)結(jié)果比較Table 4 Comparison of multi-class classification results between different networks
在表4中,由于數(shù)據(jù)集中各惡意軟件家族樣本數(shù)目分布不均,部分小樣本家族的查準(zhǔn)率、查全率對(duì)整體的宏查準(zhǔn)率、宏查全率產(chǎn)生了較大的影響,從而導(dǎo)致相關(guān)度量值普遍較低。由表3與表4比較可得,在這些被錯(cuò)誤分類的樣本中,發(fā)生應(yīng)用程序性質(zhì)的判斷錯(cuò)誤屬于少數(shù)情況,大部分問題出現(xiàn)在惡意軟件內(nèi)部家族的分類失誤。實(shí)驗(yàn)結(jié)果表明,DNN的多分類精度可達(dá)93.54%,考慮到惡意軟件家族數(shù)量之多,這已經(jīng)頗有成效。DBN與CNN的分類精度僅次于DNN,而SVM與3種深度學(xué)習(xí)網(wǎng)絡(luò)之間有一定的距離。在這些比較對(duì)象中,DBN與DNN的分類性能最為接近,且耗時(shí)略小于DNN,但從整體表現(xiàn)來說,DNN仍是最佳選擇。
識(shí)別惡意軟件是Android安全領(lǐng)域中一個(gè)重要的問題。為了應(yīng)對(duì)這一問題,本文提出一種基于深度神經(jīng)網(wǎng)絡(luò)的Android惡意軟件檢測(cè)方法,既可以判斷應(yīng)用程序是良性應(yīng)用還是惡意軟件,又能識(shí)別惡意軟件所屬的家族。本文方法采用靜態(tài)分析與機(jī)器學(xué)習(xí)相結(jié)合的概念,具有較強(qiáng)的可擴(kuò)展性。對(duì)Android應(yīng)用的靜態(tài)分析能夠從多個(gè)角度較為全面地提取相關(guān)特征,較好地捕獲了良性應(yīng)用與惡意軟件之間的差異?;谶z傳算法的特征選擇,對(duì)原始特征空間進(jìn)行有效的壓縮,保留了對(duì)于分類來說真正有價(jià)值的特征。將良性應(yīng)用與惡意軟件家族一同分類的特殊多分類方法,使深度神經(jīng)網(wǎng)絡(luò)能夠更大限度地發(fā)揮功用。上述系統(tǒng)設(shè)計(jì)保證了本文方法既能有效地辨別良性應(yīng)用與惡意軟件,又能準(zhǔn)確地區(qū)分惡意軟件家族之間的差異。實(shí)驗(yàn)結(jié)果表明,深度神經(jīng)網(wǎng)絡(luò)表現(xiàn)出比其他機(jī)器學(xué)習(xí)方法更好的分類性能。然而,靜態(tài)分析方式缺少應(yīng)用程序的實(shí)際執(zhí)行信息,還面臨著代碼混淆、動(dòng)態(tài)代碼加載、Java反射和本地代碼等帶來的挑戰(zhàn)。這些問題暫時(shí)無法被靜態(tài)分析工具高效地解決,可能會(huì)成為惡意軟件可利用的漏洞。這將是未來工作努力提高的方向。