曹 勇 李軍虎 陳曉升
(1.海軍工程大學(xué)信息安全系 武漢 430033)(2.海軍92665部隊(duì) 慈利 427200)(3.海軍91650部隊(duì) 湛江 524000)
《2015移動(dòng)應(yīng)用隱私安全認(rèn)知調(diào)查報(bào)告》指出,目前中國(guó)手機(jī)用戶數(shù)量超過(guò)13.06億,其中智能手機(jī)用戶量超過(guò)6.8億[1];隨著近年來(lái)智能手機(jī)用戶迅速增加,移動(dòng)應(yīng)用程序也得到了迅速普及。但是,智能手機(jī)市場(chǎng)的迅速發(fā)展也帶來(lái)了如病毒、木馬,披著“正常軟件”外衣的惡意軟件,源代碼開(kāi)放的Android系統(tǒng),程序質(zhì)量參差不齊的免費(fèi)應(yīng)用商城等與用戶密切相關(guān)的安全問(wèn)題,用戶在享受應(yīng)用軟件所帶來(lái)便利的同時(shí),個(gè)人信息面臨著各種各樣的安全威脅。大量隱私泄露和濫用權(quán)限的現(xiàn)象在Android平臺(tái)廣泛存在。
本文針對(duì)安卓市場(chǎng)第三方應(yīng)用存在大量隱私泄露及濫用權(quán)限的情況,通過(guò)研究面向Android應(yīng)用程序的代碼靜態(tài)分析工具,充分運(yùn)用反編譯分析技術(shù)、XMLParser解析技術(shù)、正則表達(dá)式關(guān)鍵詞匹配技術(shù),檢測(cè)應(yīng)用程序是否存在泄露用戶隱私和濫用手機(jī)權(quán)限。同時(shí)利用APK文件的反編譯、文件解析等方法進(jìn)行分析識(shí)別,提出采取安裝應(yīng)用程序之前展示可能涉及的權(quán)限和API的方法,為用戶選擇提供參考依據(jù),從而解決隱私信息泄露和權(quán)限濫用問(wèn)題。
通過(guò)互聯(lián)網(wǎng)可以獲得Android平臺(tái)各類逆向工具來(lái)反編譯APK文件,就可以得到文件中包含的各類資源文件、簽名文件,以及關(guān)鍵的程序描述文件AndroidManifest.xml。將應(yīng)用文件和惡意代碼文件分別逆向得到各自的smali代碼和程序描述文件,在應(yīng)用的smali代碼中加入惡意代碼的部分,同時(shí)修改程序描述文件中的對(duì)應(yīng)條目就完成了惡意代碼的注入[2]。將已注入惡意代碼的應(yīng)用偽裝成正常應(yīng)用,應(yīng)用安裝后,惡意代碼通過(guò)一定條件觸發(fā)執(zhí)行,完成惡意行為。
APK可以指定接口和數(shù)據(jù)給任何其他APK讀取,需要自己實(shí)現(xiàn)接口和共享的數(shù)據(jù)。隱式共享造成的隱私泄露是由AndroidManifest文件中可選屬性的濫用引起的[3]。通過(guò)共享用戶ID,擁有同一個(gè)用戶ID的多個(gè)APK可以配置成運(yùn)行在同一個(gè)進(jìn)程中。默認(rèn)可以互相訪問(wèn)任意數(shù)據(jù),訪問(wèn)其他APK的數(shù)據(jù)目錄下的數(shù)據(jù)庫(kù)和文件。
破解指的是反編譯APK文件進(jìn)行匯編級(jí)的代碼分析,并修改或插入自己的代碼,重新簽名打包為APK文件[4],以達(dá)到改變程序原有行為的目的。我們要破解一個(gè)APK文件,流程包括:反編譯、代碼分析、重新打包簽名。Android程序逆向的一般步驟為
1)用解壓縮工具打開(kāi)apk文檔,得到詳細(xì)文檔結(jié)構(gòu);
2)將classes.dex文件解壓出來(lái),然后使用工具反編譯成*.jar文件,再進(jìn)一步反編譯出Java文件;
3)利用Google提供的apktool工具得到xml文件;
4)將2)中得到的class文件和3)中得到的xml文件組合成一個(gè)Android工程,即可得到完整的APK源碼。
靜態(tài)分析是指在不運(yùn)行的情況下,采用詞法分析、語(yǔ)法分析等各種技術(shù)手段對(duì)程序文件進(jìn)行掃描從而生成程序的反匯編代碼,然后閱讀反匯編代碼來(lái)掌握程序功能的一種技術(shù)。一般有兩種方法:一種是閱讀反匯編生成的Dalvik字節(jié)碼,用IDA Pro分析dex文件,或者使用文本編輯器閱讀baksmali反編譯生成的smali文件;另一種是閱讀反匯編生成的java源碼,可以使用dex2jar生成jar文件,然后再使用jd-gui閱讀jar文件的代碼。通過(guò)上述兩種方法得到反匯編代碼后,采用下面的方法定位關(guān)鍵代碼。
1)信息反饋法:先運(yùn)行目標(biāo)程序,然后根據(jù)程序運(yùn)行時(shí)給出的反饋信息作為突破口尋找關(guān)鍵代碼;
2)特征函數(shù)法:跟信息反饋法類似;
3)順序查看法:從軟件的啟動(dòng)代碼開(kāi)始,逐行向下分析,掌握軟件的執(zhí)行流程;
4)代碼注入法:手動(dòng)修改apk文件的反匯編代碼,加入Log輸出,配合LogCat查看程序執(zhí)行到特定點(diǎn)時(shí)的狀態(tài)數(shù)據(jù);
5)棧跟蹤法:輸出運(yùn)行時(shí)的棧跟蹤信息,然后查看棧上的函數(shù)調(diào)用序列來(lái)理解方法的執(zhí)行流程;
6)方法剖析:熱點(diǎn)分析和性能優(yōu)化。
靜態(tài)分析利用程序的靜態(tài)語(yǔ)法或結(jié)構(gòu)屬性來(lái)判定其惡意性,與動(dòng)態(tài)分析相比,靜態(tài)分析有以下優(yōu)點(diǎn)[5]:
1)靜態(tài)分析允許進(jìn)行全面分析。靜態(tài)分析不受一個(gè)程序的特定執(zhí)行過(guò)程約束,并且適用于程序的所有執(zhí)行過(guò)程;
2)結(jié)果在執(zhí)行過(guò)程之前被給出,惡意行為難以偽裝;
3)沒(méi)有運(yùn)行時(shí)負(fù)擔(dān),能夠減少成本并且提高性能。
本文通過(guò)Android系統(tǒng)的體系結(jié)構(gòu),研究An?droid系統(tǒng)以及應(yīng)用程序的不安全因素等。通過(guò)研究面向Android應(yīng)用程序的代碼靜態(tài)分析工具,對(duì)這些API調(diào)用進(jìn)行截取,然后根據(jù)策略進(jìn)行判定。研究重要的反編譯拘束,對(duì)多個(gè)反編譯技術(shù)進(jìn)行分析對(duì)比,提出一種綜合靜態(tài)檢測(cè)方法。
1)通過(guò)反編譯工具Dedexer反編譯APK文件獲得一個(gè)可以執(zhí)行機(jī)器操作的DDX文件,然后對(duì)該DDX文件進(jìn)行匹配式查找;
2)通過(guò)使用AXMLPrinter.jar工具包反編譯An?droidManifest.xml文件,得到可讀的XML文件,然后運(yùn)用XML解析技術(shù)JDOM解析XML文件[6];
3)對(duì) AndroidManifest.xml文件[7],跟蹤<permis?sion>和<uses-permission>兩個(gè)標(biāo)簽,尋找系統(tǒng)權(quán)限和自定義權(quán)限,并檢測(cè)具有相同User ID的共享用戶ID屬性值;
4)對(duì)第三方應(yīng)用市場(chǎng)上的APK進(jìn)行測(cè)試和分析。
系統(tǒng)完整的檢測(cè)流程如圖1所示。
圖1 系統(tǒng)檢測(cè)流程
整個(gè)系統(tǒng)組成有五個(gè)模塊:APK文件識(shí)別和解壓模塊,反編譯模塊,XML文件分析模塊,危險(xiǎn)API分析模塊,界面操作和檢測(cè)信息展示模塊。系統(tǒng)模塊如圖2所示。
圖2 系統(tǒng)模塊圖
主要實(shí)現(xiàn)功能:
1)反編譯功能:將代碼文檔有dex反編譯為可讀性較高的ddx文檔,將二進(jìn)制的AndroidManifest.xml文件反編譯為可直接讀取的字符型文檔[8]。
2)權(quán)限分析功能:對(duì)反編譯后的文件進(jìn)行搜索匹配和分析已得到APK的權(quán)限信息和API使用情況。
3)聯(lián)合分析功能:將正在分析的APK與數(shù)據(jù)庫(kù)存儲(chǔ)的APK聯(lián)合分析,檢測(cè)是否存在通過(guò)使用相同的APK的sharedUserId實(shí)現(xiàn)數(shù)據(jù)共享[9]。
4)潛在威脅提醒功能:綜合一個(gè)APK的所有分析信息,實(shí)現(xiàn)對(duì)APK潛在威脅的說(shuō)明。
1)APK文件識(shí)別和解壓模塊[10]
Android應(yīng)用程序識(shí)別和解壓模塊的結(jié)構(gòu)如圖3所示。
圖3 Android應(yīng)用程序識(shí)別和解壓模塊結(jié)構(gòu)圖
2)反編譯模塊
APK文件一般基于Java語(yǔ)言編寫,由于Java目標(biāo)代碼——字節(jié)碼(bytecode)中包含了大部分的源碼結(jié)構(gòu)等信息,較容易反編譯成Java源碼[11],反編譯流程如圖4所示。
圖4 反編譯流程圖
3)XML文件解析模塊
本文采用JDOM對(duì)XML文件執(zhí)行解析[12]。分別對(duì)shareuserID和權(quán)限進(jìn)行分析,最終了解該APK調(diào)用其它程序組件的情況。詳細(xì)流程如圖5所示。
圖5 XML文件解析流程圖
4)危險(xiǎn)API檢測(cè)模塊[13]
對(duì)所有ddx文件進(jìn)行匹配式查找,就能發(fā)現(xiàn)該APK是否使用以及使用了多少有危險(xiǎn)的API。詳細(xì)匹配流程如圖6所示。
圖6 匹配流程圖
根據(jù)上述方法進(jìn)行了系統(tǒng)實(shí)現(xiàn),軟件界面外觀如圖7所示。主要分三部分:?jiǎn)蝹€(gè)APK檢測(cè)、批量檢測(cè)和幫助說(shuō)明。檢測(cè)結(jié)果根據(jù)內(nèi)容以樹(shù)狀結(jié)構(gòu)的結(jié)點(diǎn)顯示,結(jié)果顯示簡(jiǎn)潔清晰。
圖7 系統(tǒng)運(yùn)行界面
結(jié)合國(guó)內(nèi)安卓第三方應(yīng)用市場(chǎng)現(xiàn)有的APK,通過(guò)使用本系統(tǒng)進(jìn)行測(cè)試驗(yàn)證,驗(yàn)證該方法的有效性。主要測(cè)試參數(shù)有:
1)APK調(diào)用的危險(xiǎn)API種類和次數(shù)。
2)APK申請(qǐng)使用的系統(tǒng)權(quán)限和自定義權(quán)限[14]。
3)APK通過(guò)shareUserId屬性能夠間接使用的權(quán)限[15]。
在百度Android平臺(tái)上下載全民斗地主APK,經(jīng)過(guò)上述方法的檢測(cè),可以得到該APK的基本信息、權(quán)限和API調(diào)用信息,如圖8所示。
圖8 典型APK檢測(cè)信息
由圖8可以得知,該APK在執(zhí)行基本功能的基礎(chǔ)上將會(huì)要求網(wǎng)絡(luò)連接并且會(huì)申請(qǐng)用戶手機(jī)發(fā)送信息和撥打電話,系統(tǒng)將其評(píng)價(jià)為威脅度中(可能會(huì)造成額外的費(fèi)用支出)。通過(guò)實(shí)際地操作該APK,顯示該APK將會(huì)使用短信權(quán)限和網(wǎng)絡(luò)權(quán)限來(lái)補(bǔ)完游戲體驗(yàn),同時(shí)需要用戶支付相應(yīng)的費(fèi)用,并潛藏著需要申請(qǐng)撥打電話的操作,雖然沒(méi)有找到惡意盜取用戶資金的操作,但并沒(méi)有在第三方應(yīng)用市場(chǎng)上發(fā)現(xiàn)其存在收費(fèi)相關(guān)的信息介紹,此體驗(yàn)結(jié)論與檢測(cè)結(jié)果吻合。
對(duì)常用的游戲類和工具類APK進(jìn)行了測(cè)試比較,統(tǒng)計(jì)結(jié)果如圖9和圖10所示。
通過(guò)檢測(cè)結(jié)果可對(duì)比看出,實(shí)驗(yàn)成功地從惡意軟件中檢測(cè)出了隱私泄露和濫用權(quán)限行為,證明了有效性。同時(shí),統(tǒng)計(jì)數(shù)據(jù)表明本文采用的APK檢測(cè)方法檢測(cè)正確率高達(dá)95%,只存在少量的漏報(bào)和誤報(bào)。
圖9 游戲類APK申請(qǐng)權(quán)限數(shù)量
圖10 功能類APK申請(qǐng)權(quán)限數(shù)量
針對(duì)目前國(guó)內(nèi)安卓智能手機(jī)用戶對(duì)第三方應(yīng)用市場(chǎng)的巨大依賴性及第三方應(yīng)用市場(chǎng)的混亂性,本文采用靜態(tài)分析技術(shù),逆向反編譯解析APK文件,檢測(cè)應(yīng)用程序是否存在泄露用戶隱私和濫用手機(jī)權(quán)限,詳細(xì)生成APK中使用的權(quán)限和危險(xiǎn)API信息,分析APK可能對(duì)用戶產(chǎn)生的潛在威脅。從而指導(dǎo)用戶進(jìn)行選擇性安裝,避免了APK安裝后惡意行為導(dǎo)致的用戶利益損害。隨著安卓手機(jī)市場(chǎng)應(yīng)用的進(jìn)一步擴(kuò)大,以及用戶對(duì)安全性能和隱私保護(hù)的進(jìn)一步覺(jué)醒,本文提出的方法在手機(jī)安全防護(hù)和隱私保護(hù)中所起的作用將會(huì)日益凸顯。