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