標籤:
首先,題主詢問“Android 應用”的安全性漏洞,說到 Android 應用的安全性漏洞,如果拋開系統設計問題,其主要原因是開發過程當中疏漏引起的。但其實也並不能把這些責任都怪在程式猿頭上。所以本答案也將會對 Android 系統設計以及生態環境做一些闡述。(如果想瞭解 Android 惡意軟體的情況,那就需要另開題目了。)
1. 應用反編譯
漏洞:APK 包非常容易被反編譯成可讀檔案,稍加修改就能重新打包成新的 APK。
利用:軟體破解,內購破解,軟體邏輯修改,插入惡意代碼,替換廣告商 ID。
建議:使用 ProGuard 等工具混淆代碼,重要邏輯用 NDK 實現。
例子:反編譯重打包 FlappyBird,把廣告商 ID 換了,遊戲改加插一段惡意代碼等等。
2. 資料的儲存與傳輸
漏洞:外部儲存(SD 記憶卡)上的檔案沒有許可權管理,所有應用都可讀可寫。開發人員把敏感資訊明文存在 SD 記憶卡上,或者動態載入的 payload 放在 SD 記憶卡上。
利用:竊取敏感資訊,篡改設定檔,修改 payload 邏輯並重打包。
建議:不要把敏感資訊放在外部儲存上面;在動態載入外部資源的時候驗證檔案完整性。
漏洞:使用全域可讀寫(MODE_WORLD_READABLE,MODE_WORLD_WRITEABLE)的內部儲存方式,或明文儲存敏感資訊(使用者帳號密碼等)。
利用:全域讀寫敏感資訊,或 root 後讀取明文資訊。
建議:不適用全域可讀寫的內部儲存方式,不明文儲存使用者帳號密碼。
3. 密碼泄露
漏洞:密碼明文儲存,傳輸。
利用:
- root 後可讀寫內部儲存。
- SD 記憶卡全域可讀寫。
- 公用 WiFi 抓包擷取帳號密碼。
建議:實用成熟的加密方案。不要把密碼明文儲存在 SD 記憶卡上。
4. 組件暴露 (Activity, Service, Broadcast Receiver, Content Provider)
漏洞:
- 組件在被調用時未做驗證。
- 在調用其他組件時未做驗證。
利用:
- 調用暴露的組件,達到某種效果,擷取某些資訊,構造某些資料。(比如:調用暴露的組件發簡訊、微博等)。
- 監聽暴露組件,讀取資料。
建議:驗證輸入資訊、驗證組件調用等。android:exported 設定為 false。使用 android:protectionLevel="signature" 驗證調用來源。
5. WebView
漏洞:
- 惡意 App 可以注入 JavaScript 代碼進入 WebView 中的網頁,網頁未作驗證。
- 惡意網頁可以執行 JavaScript 反過來調用 App 中註冊過的方法,或者使用資源。
利用:
- 惡意程式嵌入 Web App,然後竊取使用者資訊。
- 惡意網頁遠程調用 App 代碼。更有甚者,通過 Java Reflection 調用 Runtime 執行任意代碼。
建議:不使用 WebView 中的 setJavaScriptEnabled(true),或者使用時對輸入進行驗證。
6. 其他漏洞
- ROOT 後的手機可以修改 App 的內購,或者安裝外掛 App 等。
- Logcat 泄露使用者敏感資訊。
- 惡意的廣告包。
- 利用 next Intent。
7. 總結
Android 應用的漏洞大部分都是因為開發人員沒有對輸入資訊做驗證造成的,另外因為 Intent 這種特殊的機制,需要過濾外部的各種惡意行為。再加上 Android 應用市場混亂,開發人員水平參差不齊。所以現在 Android 應用的漏洞,惡意軟體,釣魚等還在不斷增多。
再加上 root 對於 App 沙箱的破壞,Android 升級的限制。國內的 Android 環境一片混亂,慘不忍睹。所以,如果想要保證你的應用沒有安全性漏洞,就要記住:永遠不要相信外面的世界。
最後推薦:愛加密漏洞檢測(http://safe.ijiami.cn/) 服務可以一鍵找出APP潛在的漏洞和惡意軟體存在的病毒;針對應用被劫持,愛加密提供多種加密項目和加密方式,解決進程和資料轉送過程中可能存在的劫持風險。
分享:Android 應用有哪些常見,淺談常被利用的安全性漏洞?