1. 應(yīng)用反編譯
漏洞:APK 包非常容易被反編譯成可讀文件,稍加修改就能重新打包成新的 APK。
利用:軟件破解,內(nèi)購破解,軟件邏輯修改,插入惡意代碼,替換廣告商 ID。
建議:使用 ProGuard 等工具混淆代碼,重要邏輯用 NDK 實(shí)現(xiàn)。
例子:反編譯重打包 FlappyBird,把廣告商 ID 換了,游戲改加插一段惡意代碼等等。
2. 數(shù)據(jù)的存儲(chǔ)與傳輸
漏洞:外部存儲(chǔ)(SD 卡)上的文件沒有權(quán)限管理,所有應(yīng)用都可讀可寫。開發(fā)者把敏感信息明文存在 SD 卡上,或者動(dòng)態(tài)加載的 payload 放在 SD 卡上。
利用:竊取敏感信息,篡改配置文件,修改 payload 邏輯并重打包。
建議:不要把敏感信息放在外部存儲(chǔ)上面;在動(dòng)態(tài)加載外部資源的時(shí)候驗(yàn)證文件完整性。
漏洞:使用全局可讀寫(MODE_WORLD_READABLE,MODE_WORLD_WRITEABLE)的內(nèi)部存儲(chǔ)方式,或明文存儲(chǔ)敏感信息(用戶賬號(hào)密碼等)。
利用:全局讀寫敏感信息,或 root 后讀取明文信息。
建議:不適用全局可讀寫的內(nèi)部存儲(chǔ)方式,不明文存儲(chǔ)用戶賬號(hào)密碼。
3. 密碼泄露
漏洞:密碼明文存儲(chǔ),傳輸。
利用:
root 后可讀寫內(nèi)部存儲(chǔ)。
SD 卡全局可讀寫。
公共 WiFi 抓包獲取賬號(hào)密碼。
建議:實(shí)用成熟的加密方案。不要把密碼明文存儲(chǔ)在 SD 卡上。
4. 組件暴露 (Activity, Service, Broadcast Receiver, Content Provider)
漏洞:
組件在被調(diào)用時(shí)未做驗(yàn)證。
在調(diào)用其他組件時(shí)未做驗(yàn)證。
利用:
調(diào)用暴露的組件,達(dá)到某種效果,獲取某些信息,構(gòu)造某些數(shù)據(jù)。(比如:調(diào)用暴露的組件發(fā)短信、微博等)。
監(jiān)聽暴露組件,讀取數(shù)據(jù)。
建議:驗(yàn)證輸入信息、驗(yàn)證組件調(diào)用等。android:exported 設(shè)置為 false。使用 android:protectionLevel="signature" 驗(yàn)證調(diào)用來源。
5. WebView
漏洞:
惡意 App 可以注入 JavaScript 代碼進(jìn)入 WebView 中的網(wǎng)頁,網(wǎng)頁未作驗(yàn)證。
惡意網(wǎng)頁可以執(zhí)行 JavaScript 反過來調(diào)用 App 中注冊(cè)過的方法,或者使用資源。
利用:
惡意程序嵌入 Web App,然后竊取用戶信息。
惡意網(wǎng)頁遠(yuǎn)程調(diào)用 App 代碼。更有甚者,通過 Java Reflection 調(diào)用 Runtime 執(zhí)行任意代碼。
建議:不使用 WebView 中的 set,或者使用時(shí)對(duì)輸入進(jìn)行驗(yàn)證。
6. 其他漏洞
ROOT 后的手機(jī)可以修改 App 的內(nèi)購,或者安裝外掛 App 等。
Logcat 泄露用戶敏感信息。
惡意的廣告包。
利用 next Intent。
7. 總結(jié)
Android 應(yīng)用的漏洞大部分都是因?yàn)殚_發(fā)人員沒有對(duì)輸入信息做驗(yàn)證造成的,另外因?yàn)?Intent 這種特殊的機(jī)制,需要過濾外部的各種惡意行為。再加上 Android 應(yīng)用市場混亂,開發(fā)人員水平參差不齊。導(dǎo)致現(xiàn)在 Android 應(yīng)用被黑客們通過漏洞散發(fā)惡意軟件,釣魚等行為還在不斷增多。還有就是現(xiàn)在安卓機(jī)非常普遍的 root 對(duì)于 App 沙箱的破壞和Android 升級(jí)的限制。國內(nèi)的 Android 環(huán)境一片混亂,慘不忍睹。