王旭陽(yáng) 秦玉海 任思遠(yuǎn)
(中國(guó)刑事警察學(xué)院公安信息技術(shù)與情報(bào)學(xué)院 沈陽(yáng) 110854)
Android是一款開(kāi)源操作系統(tǒng),目前全球Android用戶數(shù)已達(dá)20億[1],基于Android系統(tǒng)的應(yīng)用層出不窮,其中就包括一種基于標(biāo)準(zhǔn)Web技術(shù)的Android混合應(yīng)用.Android混合應(yīng)用是原生應(yīng)用和Web應(yīng)用的結(jié)合體.與原生應(yīng)用相比,Android混合應(yīng)用兼容多個(gè)平臺(tái),能夠有效提高用戶的使用體驗(yàn).但是Android混合應(yīng)用中的第三方插件框架和Web網(wǎng)頁(yè)進(jìn)行數(shù)據(jù)通信時(shí),可能存在代碼注入攻擊漏洞,從而導(dǎo)致用戶隱私數(shù)據(jù)泄露、賬號(hào)密碼被盜取等安全問(wèn)題.本文創(chuàng)新性地引入機(jī)器學(xué)習(xí)技術(shù)對(duì)Android混合應(yīng)用代碼注入攻擊漏洞進(jìn)行檢測(cè)[2].
Android混合應(yīng)用是近年來(lái)流行的一種新型Android應(yīng)用,它是以Web應(yīng)用為基礎(chǔ),用原生的Android應(yīng)用容器對(duì)網(wǎng)站進(jìn)行打包,從而生成的一種混合型應(yīng)用.
Android混合應(yīng)用框架能夠讓?xiě)?yīng)用程序開(kāi)發(fā)者使用標(biāo)準(zhǔn)Web技術(shù)完成軟件的用戶界面和業(yè)務(wù)邏輯功能,同時(shí)也能夠像本地APP一樣,靈活地調(diào)用設(shè)備資源和系統(tǒng)進(jìn)行交互.Android混合應(yīng)用的架構(gòu)主要有2部分:第1部分是由HTML,CSS和Java-Script等標(biāo)準(zhǔn)Web技術(shù)組成的WebView組件,主要作用是使用WebKit引擎將數(shù)據(jù)和內(nèi)容呈現(xiàn)在Web頁(yè)面上,并且能夠使用JavsScript引擎處理JS代碼;第2部分是由Android本地代碼實(shí)現(xiàn)的軟件架構(gòu),主要作用是實(shí)現(xiàn)相機(jī)、短信、聯(lián)系人等系統(tǒng)功能.WebView內(nèi)部的JavaScript可以通過(guò)中間插件調(diào)用外部的本地代碼來(lái)訪問(wèn)相應(yīng)的系統(tǒng)資源.
基于Web技術(shù)的Android混合應(yīng)用可以跨移動(dòng)平臺(tái)開(kāi)發(fā),但Web技術(shù)有一個(gè)危險(xiǎn)的特性:當(dāng)Web技術(shù)處理包含數(shù)據(jù)和代碼的字符串時(shí),可以識(shí)別代碼并將其發(fā)送到JavaScript引擎執(zhí)行.這一特性導(dǎo)致的后果是如果這種混合的數(shù)據(jù)和代碼來(lái)自不可信的地方,惡意代碼就可能會(huì)被注入并在受害應(yīng)用程序中執(zhí)行.這正是XSS漏洞攻擊的產(chǎn)生原理.
基于Web技術(shù)的Android混合應(yīng)用繼承了這種XSS漏洞,同時(shí)在Android混合應(yīng)用中,數(shù)據(jù)可以通過(guò)二維碼、WiFi、文件、通信錄等方式傳輸?shù)綉?yīng)用中,因此基于Web技術(shù)的Android混合應(yīng)用比原生Web應(yīng)用具有更廣泛的攻擊途徑.在Android混合應(yīng)用中,注入的代碼可以通過(guò)框架提供的數(shù)據(jù)交互通道訪問(wèn)設(shè)備本地資源,在受到XSS攻擊時(shí)設(shè)備會(huì)面臨信息泄露等巨大風(fēng)險(xiǎn).Android混合應(yīng)用代碼注入攻擊流程如圖1所示:
圖1 Android混合應(yīng)用代碼注入攻擊流程
Android混合應(yīng)用發(fā)生代碼注入的通道即是其獲取數(shù)據(jù)的交互通道,可分為內(nèi)部通道和外部通道.
Android混合應(yīng)用的外部通道是與外界用戶或環(huán)境進(jìn)行交互的通道,外部通道主要包括移動(dòng)設(shè)備特有的數(shù)據(jù)通道、元數(shù)據(jù)信息通道和ID數(shù)據(jù)通道.
除了與外部交互,Android混合應(yīng)用還和同設(shè)備的其他應(yīng)用進(jìn)行交互,與這些內(nèi)部應(yīng)用進(jìn)行交互的通道稱為內(nèi)部通道,內(nèi)部通道通常由3部分組成,分別是Content Provider組件、Intent組件和文件系統(tǒng).
這些通道就是惡意代碼注入數(shù)據(jù)從而攻擊應(yīng)用的主要途徑.
Android混合應(yīng)用可以從外部或內(nèi)部通道獲取混入惡意代碼的數(shù)據(jù)[3],但是這些代碼還沒(méi)有被執(zhí)行,還不構(gòu)成Android混合應(yīng)用代碼注入攻擊漏洞.在傳統(tǒng)的XSS攻擊中,由于服務(wù)器沒(méi)有識(shí)別出數(shù)據(jù)中包含的代碼片段,所以當(dāng)這些數(shù)據(jù)放入Web頁(yè)面中進(jìn)行展示時(shí),JavaScript引擎就會(huì)執(zhí)行這些代碼[4].同理,在Android混合應(yīng)用中,當(dāng)程序要將這些數(shù)據(jù)放入HTML頁(yè)面中進(jìn)行展示時(shí)也會(huì)觸發(fā)代碼的執(zhí)行[5].因此,當(dāng)用戶使用不安全的API時(shí)就會(huì)觸發(fā)數(shù)據(jù)中嵌入的惡意代碼,導(dǎo)致Android混合應(yīng)用代碼注入攻擊漏洞的產(chǎn)生.
通過(guò)上述分析,Android混合應(yīng)用代碼注入攻擊漏洞產(chǎn)生的條件有2個(gè):第一是應(yīng)用需要使用通道從外部(如應(yīng)用程序外部或設(shè)備外部)獲取數(shù)據(jù);第二是來(lái)自外部的數(shù)據(jù)通過(guò)不安全的API在Web頁(yè)面內(nèi)顯示.
本文方案綜合使用Android混合應(yīng)用中AndroidManifest.xml文件申請(qǐng)的權(quán)限和WebView組件中調(diào)用的API作為檢測(cè)的主要依據(jù)[6].
AndroidManifest.xml文件是Android應(yīng)用的入口文件,包含應(yīng)用程序申請(qǐng)的權(quán)限[7].當(dāng)Android混合應(yīng)用要實(shí)現(xiàn)二維碼掃描、藍(lán)牙、短信等功能時(shí),就需要在AndroidManifest.xml文件中聲明這些對(duì)應(yīng)的權(quán)限.
與此同時(shí),當(dāng)在AndroidManifest.xml文件中申請(qǐng)這些權(quán)限并且得到系統(tǒng)和用戶的授權(quán)后,混合應(yīng)用的WebView組件的所有HTML頁(yè)面和JavaScript代碼就具備了這些權(quán)限,能夠直接調(diào)用相關(guān)的設(shè)備資源,引發(fā)代碼注入攻擊漏洞的出現(xiàn).因此,Android混合應(yīng)用是否具備申請(qǐng)權(quán)限是檢測(cè)Android混合應(yīng)用是否具有代碼注入攻擊漏洞的重要依據(jù)[8].
通過(guò)靜態(tài)分析可以獲得Android混合應(yīng)用申請(qǐng)權(quán)限的情況,本文研究一共統(tǒng)計(jì)了600個(gè)正常Android混合應(yīng)用和300個(gè)具有代碼注入攻擊漏洞的Android混合應(yīng)用.Android混合應(yīng)用申請(qǐng)權(quán)限使用情況如圖2所示:
圖2 Android混合應(yīng)用申請(qǐng)權(quán)限函數(shù)統(tǒng)計(jì)
從圖2可以發(fā)現(xiàn),Android混合應(yīng)用都使用了正常的網(wǎng)絡(luò)訪問(wèn)權(quán)限INTERNET和ACCESS_NETWORK_STATE,但是其他權(quán)限的使用就可能存在由代碼注入攻擊造成的隱私數(shù)據(jù)泄露、地理位置暴露、數(shù)據(jù)丟失等風(fēng)險(xiǎn).如CAMERA和READ_CONTACTS權(quán)限的使用可能造成用戶在掃描二維碼時(shí)被攻擊者獲取到通信錄數(shù)據(jù);READ_PHONE_STATE和GET_ACCOUNTS權(quán)限的使用可能泄露用戶的設(shè)備IMEI唯一識(shí)別碼和賬戶數(shù)據(jù)等.因此,可以將Android混合應(yīng)用申請(qǐng)權(quán)限信息作為檢測(cè)Android混合應(yīng)用代碼注入攻擊漏洞的一個(gè)重要依據(jù)[9].
僅僅使用Android混合應(yīng)用使用權(quán)限的特征作為判別依據(jù)存在較大的缺陷,因?yàn)閼?yīng)用在AndroidManifest.xml文件中申請(qǐng)的所有權(quán)限并不能證明WebView組件在運(yùn)行過(guò)程中確實(shí)調(diào)用了相應(yīng)的功能[10].因此,還需要提取Android混合應(yīng)用的HTML和JavaScript代碼所調(diào)用的API作為檢測(cè)Android混合應(yīng)用代碼注入攻擊漏洞的另一個(gè)依據(jù).
本文統(tǒng)計(jì)分析了HTML和JavaScript代碼所調(diào)用的存在代碼注入漏洞的API,如圖3所示:
圖3 存在代碼注入漏洞的API
機(jī)器學(xué)習(xí)在惡意軟件分類領(lǐng)域的應(yīng)用十分廣泛,因此,本文將Android混合應(yīng)用代碼注入攻擊漏洞檢測(cè)轉(zhuǎn)換為Android混合應(yīng)用是否具有注入攻擊漏洞檢測(cè)的二分類問(wèn)題,引用機(jī)器學(xué)習(xí)算法對(duì)Android混合應(yīng)用進(jìn)行分類預(yù)測(cè),將復(fù)雜的檢測(cè)問(wèn)題轉(zhuǎn)換為簡(jiǎn)單的二分類問(wèn)題,大大提高了檢測(cè)效率.
第1步,通過(guò)反編譯Android混合應(yīng)用,得到其中的AndroidManifest.xml文件、HTML文件和JavaScript的代碼文件,然后使用字符串匹配的方法從AndroidManifest.xml文件提取出Android混合應(yīng)用申請(qǐng)的權(quán)限.
第2步,設(shè)計(jì)一種分片方法,將存在代碼注入漏洞的API從HTML文件和JavaScript代碼中分離出來(lái),然后再進(jìn)行處理.
第3步,由于機(jī)器學(xué)習(xí)是對(duì)特征向量進(jìn)行操作,因此將上述提取出的字符串形式的數(shù)據(jù)轉(zhuǎn)換成離散的數(shù)值形式,對(duì)每個(gè)Android混合應(yīng)用構(gòu)造1個(gè)特征向量進(jìn)行描述.
第4步,本文將選擇不同的機(jī)器學(xué)習(xí)算法進(jìn)行分類預(yù)測(cè)模型構(gòu)建、訓(xùn)練以及分類預(yù)測(cè)的對(duì)比實(shí)驗(yàn).檢測(cè)方案的流程如圖4所示:
圖4 檢測(cè)方案流程
3.3.1 數(shù)據(jù)預(yù)處理
首先,使用apktool工具對(duì)Android混合應(yīng)用的apk包進(jìn)行反編譯,得到應(yīng)用的smali代碼和配置文件.文件結(jié)構(gòu)如圖5所示.
圖5 Android混合應(yīng)用文件結(jié)構(gòu)
然后,從AndroidManifest.xml文件中提取具有〈users-permissions/〉標(biāo)簽的權(quán)限數(shù)據(jù),同時(shí)從源代碼文件中分離出程序的HTML文件和JavaScript代碼.
本文設(shè)計(jì)了一種從HTML文件和其引用的相關(guān)JS文件中將存在代碼注入漏洞的API進(jìn)行提取和分片的算法,步驟為:首先,輸入一個(gè)HTML文件和其引用的相關(guān)JS文件,將這個(gè)HTML文件中的所有API放到一個(gè)集合E中,找到通過(guò)通道調(diào)用外部數(shù)據(jù)的API保存在集合C中;其次,分別遍歷C中的每個(gè)API,找到存在代碼注入漏洞的API賦值給fb,同時(shí)將這個(gè)API寫(xiě)入結(jié)果R中;再次,找到每個(gè)函數(shù)調(diào)用的JS中通過(guò)通道調(diào)用外部數(shù)據(jù)的API,將這個(gè)API放入臨時(shí)字符串中;接著,查找方法主體或參數(shù)里面有沒(méi)有調(diào)用存在代碼注入漏洞的API,將這些API依次壓入棧中;最后,將存在代碼注入漏洞的所有API進(jìn)行整合輸出.
3.3.2 生成特征向量
Android系統(tǒng)共規(guī)定了151種權(quán)限,所以為其設(shè)定了一個(gè)151維的二進(jìn)制特征向量P.依次以這151種權(quán)限為目標(biāo)字符串在AndroidManifest.xml文件提取的權(quán)限信息進(jìn)行特征匹配,如果權(quán)限庫(kù)中的第i個(gè)字符串匹配成功,則將Pi置為1,否則將Pi置為0.
以同樣的方法對(duì)API進(jìn)行特征匹配,設(shè)定10維的二進(jìn)制特征向量F,依次以圖4中HTML和JavaScript代碼調(diào)用的存在代碼注入漏洞的API為目標(biāo)字符串和分片后得到的API進(jìn)行特征匹配,如果權(quán)限庫(kù)中的第i個(gè)字符串匹配成功,則將Fi置為1,否則將Fi置為0.
將權(quán)限特征和API特征進(jìn)行拼接,得到新的組合特征C,C特征就是本文方案最終采用的靜態(tài)特征向量(161維).
??? ?《魏 書(shū)》卷 五 五《劉 芳 傳》,中 華 書(shū) 局 1974 年 版,第1219、1220、1220 ~1233、1220 ~1221 頁(yè)。
3.3.3 機(jī)器學(xué)習(xí)分類算法
本文選用支持向量機(jī)SVM、序列最小優(yōu)化算法SMO、樸素貝葉斯Naive Bayes、決策樹(shù)J48、隨機(jī)森林Random Forest等幾種常見(jiàn)的機(jī)器學(xué)習(xí)分類算法進(jìn)行模型構(gòu)建、訓(xùn)練以及分類預(yù)測(cè)實(shí)驗(yàn).下面簡(jiǎn)單介紹這幾種分類算法:
支持向量機(jī)SVM是一種基于統(tǒng)計(jì)學(xué)習(xí)原理的機(jī)器學(xué)習(xí)算法,可形式化為一個(gè)求解凸二次規(guī)劃的問(wèn)題.
序列最小優(yōu)化算法SMO是一種對(duì)SVM的高效的優(yōu)化算法,特別針對(duì)線性SVM和數(shù)據(jù)稀疏時(shí)性能更優(yōu).
樸素貝葉斯算法Naive Bayes是基于貝葉斯定理與特征條件獨(dú)立假設(shè)的機(jī)器學(xué)習(xí)算法.
決策樹(shù)算法J48是一種通過(guò)信息增益率來(lái)選擇屬性并且能夠?qū)Σ煌暾臄?shù)據(jù)進(jìn)行處理的算法[11].
隨機(jī)森林算法Random Forest通過(guò)組合多個(gè)弱分類器,最終結(jié)果通過(guò)投票或取均值,使得整體模型的結(jié)果具有較高的精確度和泛化性能.
為了驗(yàn)證本文方法的有效性,實(shí)驗(yàn)共從互聯(lián)網(wǎng)收集了來(lái)自1406個(gè)正常的Android混合應(yīng)用和589個(gè)具有代碼注入攻擊漏洞的Android混合應(yīng)用,利用人為標(biāo)注獲取對(duì)應(yīng)標(biāo)簽.將數(shù)據(jù)集的80%作為訓(xùn)練集、20%作為測(cè)試集.
在實(shí)驗(yàn)中,操作系統(tǒng)為Windows 10 64b,處理器為AMD5500X、顯卡為Nvidia GeForce RTX2060,數(shù)據(jù)處理軟件選用Pycharm,Anaconda3等.
為了檢測(cè)評(píng)估基于機(jī)器學(xué)習(xí)的Android混合應(yīng)用代碼注入攻擊漏洞分類預(yù)測(cè)模型的準(zhǔn)確率,本文引入混淆矩陣來(lái)描述不同分類預(yù)測(cè)模型在測(cè)試數(shù)據(jù)上的分類效果,混淆矩陣如表1所示,樣本按照真實(shí)值和預(yù)測(cè)值可以得到4個(gè)一級(jí)指標(biāo):
表1 混淆矩陣一級(jí)指標(biāo)
TP(true positive):真陽(yáng)性,樣本預(yù)測(cè)值為真,真實(shí)值也為真.
FP(false positive):假陽(yáng)性,樣本預(yù)測(cè)值為真,真實(shí)值為假.
FN(false negative):假陰性,樣本預(yù)測(cè)值為假,真實(shí)值為真.
TN(true negative):真陰性,樣本預(yù)測(cè)值為假,真實(shí)值也為假.
本文實(shí)驗(yàn)采用TPR(召回率)、FPR(誤報(bào)率)、Precision(精確率)、Acc(準(zhǔn)確率)作為性能評(píng)估指標(biāo)[12],公式為
本文根據(jù)Android混合應(yīng)用的C特征靜態(tài)分析提取161維特征向量對(duì)特征進(jìn)行精簡(jiǎn),使用向量機(jī)SVM、序列最小優(yōu)化算法SMO、樸素貝葉斯Naive Bayes、決策樹(shù)J48、隨機(jī)森林Random Forest等多種機(jī)器學(xué)習(xí)構(gòu)建分類預(yù)測(cè)模型;使用訓(xùn)練集訓(xùn)練模型和測(cè)試集測(cè)試模型及混淆矩陣中的TPR,FPR,Precision,Acc這4個(gè)指標(biāo)來(lái)評(píng)估模型的分類預(yù)測(cè)結(jié)果[13].
表2是使用貝葉斯算法、支持向量機(jī)、SMO、決策樹(shù)、隨機(jī)森林機(jī)器學(xué)習(xí)算法對(duì)提取的特征向量進(jìn)行模型構(gòu)建和模型訓(xùn)練,再進(jìn)行預(yù)測(cè)得到的結(jié)果.通過(guò)結(jié)果可以看出,隨機(jī)森林分類模型對(duì)于Android混合應(yīng)用的準(zhǔn)確率最高,達(dá)到98.1%.
表2 不同機(jī)器學(xué)習(xí)模型分類預(yù)測(cè)結(jié)果
將本文的實(shí)驗(yàn)結(jié)果與其他類似研究成果進(jìn)行對(duì)比,對(duì)比結(jié)果如圖6所示.方法1是Jin等人[14]提出的靜態(tài)檢測(cè)方法,精確率為97.7%;方法2是李劍等人[15]提出的檢測(cè)方法,僅采用權(quán)限作為唯一特征,精確率達(dá)到97%,;方法3是Xiao等人[16]提出的使用機(jī)器學(xué)習(xí)檢測(cè)方法,在特征的提取過(guò)程中沒(méi)有對(duì)元數(shù)據(jù)進(jìn)行處理,而且提取的特征也不夠完全,精確率為95.3%;方法4是本文提出的基于隨機(jī)森林模型的檢測(cè)方法,檢測(cè)準(zhǔn)確率達(dá)到98.1%,單個(gè)應(yīng)用平均檢測(cè)時(shí)間為2.54s.
圖6 準(zhǔn)確率檢測(cè)結(jié)果對(duì)比
通過(guò)前面的對(duì)比分析,由于本文采用較好的特征選取方法和合適的機(jī)器學(xué)習(xí)模型,所以不僅在準(zhǔn)確率上有所提高,在時(shí)間性能上也有很大的提升.
隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展和移動(dòng)終端的普及,基于Web技術(shù)的Android混合應(yīng)用越來(lái)越受歡迎.但是Android混合應(yīng)用框架中使用的WebView組件能夠通過(guò)內(nèi)部或外部通道調(diào)用資源,容易引發(fā)代碼注入攻擊漏洞,從而導(dǎo)致用戶隱私數(shù)據(jù)泄露、賬號(hào)密碼被盜取等安全問(wèn)題.針對(duì)這個(gè)問(wèn)題,本文提出一種基于機(jī)器學(xué)習(xí)的Android混合應(yīng)用代碼注入攻擊漏洞檢測(cè)方案.未來(lái),將繼續(xù)優(yōu)化特征提取,選取更多維的特征,進(jìn)一步提高Android混合應(yīng)用代碼注入攻擊漏洞檢測(cè)的準(zhǔn)確率[17].