本部分包含確保 Android 設備上應用程序安全的建議。
源代碼審查
源代碼審查可以檢測廣泛的安全問題,包括本文檔中確定的問題。 Android 強烈鼓勵手動和自動源代碼審查。
- 在進行審查以確保覆蓋範圍時遵循全面的安全指南。利用相關的內部或外部標準來確保一致和完整的審查。
- 在使用 Android SDK 的所有應用代碼上運行 linter,例如Android Studio linter並更正任何已識別的問題。
- 使用可以檢測內存管理問題(例如緩衝區溢出和非一錯誤)的自動化工具分析本機代碼。
- Android 構建系統支持許多 LLVM 清理程序,例如AddressSanitizer和UndefinedBehaviorSanitizer ,可用於內存相關問題的運行時分析。結合在 Android 中通過libFuzzer支持的模糊測試,清理程序可以發現需要進一步調查的異常邊緣情況。
- 知識淵博的安全評估人員應審查風險較高的代碼,例如加密、支付處理和 PII 處理。
自動化測試
自動化測試可以幫助檢測廣泛的安全問題,並且應該定期執行。
- 在整個開發過程中定期運行最新版本的CTS ,以及早發現問題並縮短糾正時間。 Android 在我們的自動化構建過程中使用 CTS 作為持續集成的一部分,該過程每天構建多次。
- 自動化接口的安全測試,包括使用格式錯誤的輸入進行測試(模糊測試)。 Android 的構建系統支持libFuzzer用於編寫模糊測試。
漏洞掃描
漏洞掃描可以幫助確保預安裝的應用程序沒有已知的安全漏洞。高級檢測可以減少解決這些漏洞並防止用戶和設備面臨風險所需的時間和成本。
- 使用行業認可的應用程序漏洞掃描工具掃描所有預安裝的應用程序並解決檢測到的漏洞。
可能有害的應用程序
確保您設備上預裝的應用程序不是潛在有害應用程序(PHA) 非常重要。您應對您設備中包含的所有應用程序的行為負責。在設備啟動之前,掃描所有預加載的應用程序是否存在漏洞。
有關 PHA 以及 Google 如何在 Play 商店中對抗它們的更多信息,請參閱Google Play Protect 開發者文檔。
應用安裝和權限
預裝應用程序的過多權限可能會產生安全風險。將預安裝的應用程序限制為最低必要權限,並確保它們無權訪問不必要的權限或特權。 AndroidManifest.xml中描述了應用權限。
- 不要向預安裝的應用程序授予不必要的權限或特權。徹底審查具有系統權限的應用程序,因為它們可能具有非常敏感的權限。
- 確保請求的所有權限都與該特定應用程序的功能相關且必要。
- 確保所有使用
INSTALL_PACKAGES
權限的預安裝應用程序都有用戶披露。 - 確保開發人員有合同義務不將任何應用程序安裝為 UID 0。
- 評估要通過開發者網絡安裝的所有應用程序清單中聲明的權限。
- 確保開發人員在向設備提供應用程序之前,有合同義務使用Google Safe Browsing API掃描自動更新程序和安裝程序應用程序的所有下載 URL。
應用簽名
應用簽名在設備安全中發揮著重要作用,用於權限檢查和軟件更新。在選擇用於簽署應用程序的密鑰時,重要的是要考慮應用程序是僅在單個設備上可用還是在多個設備上通用。
- 確保未使用公開密鑰(例如 AOSP 開發人員密鑰)對應用進行簽名。
- 確保用於簽署應用程序的密鑰的管理方式與處理敏感密鑰的行業標準做法一致,包括提供有限、可審計訪問的硬件安全模塊 (HSM)。
- 確保應用程序未使用平台密鑰進行簽名。這樣做可以讓應用程序訪問平台簽名權限,這些權限非常強大,僅供操作系統的組件使用。系統應用應使用特權權限。
- 確保具有相同包名稱的應用未使用不同的密鑰進行簽名。這通常發生在為不同設備創建應用程序時,尤其是在使用平台密鑰時。如果應用程序獨立於設備,請跨設備使用相同的密鑰。如果應用程序是特定於設備的,請為每個設備和密鑰創建唯一的包名稱。
隔離應用程序和進程
如果使用得當,Android沙盒模型可以為應用程序和進程提供額外的安全性。
隔離根進程
根進程是權限提升攻擊最常見的目標;減少根進程的數量可以降低特權升級的風險。
- 確保設備以 root 身份運行最少的必要代碼。在可能的情況下,使用常規的 Android 進程而不是根進程。如果某個進程必須在設備上以 root 身份運行,請在 AOSP 功能請求中記錄該進程,以便對其進行公開審查。
- 在可能的情況下,根代碼應與不受信任的數據隔離,並通過進程間通信 (IPC) 進行訪問。例如,將根功能簡化為可通過 Binder 訪問的小型服務,並將具有簽名權限的服務公開給具有低權限或沒有權限處理網絡流量的應用程序。
- 根進程不得偵聽網絡套接字。
- 根進程不得包含通用運行時,例如 Java VM)。
隔離系統應用
通常,預安裝的應用程序不應使用共享系統唯一標識符 (UID) 運行。如果應用程序需要使用系統的共享 UID 或其他特權服務(例如電話),則應用程序不應導出用戶安裝的第三方應用程序可以訪問的任何服務、廣播接收器或內容提供程序.
- 確保設備作為系統運行最少的必要代碼。在可能的情況下,使用具有自己 UID 的 Android 進程,而不是重複使用系統 UID。
- 在可能的情況下,系統代碼應該與不受信任的數據隔離,並且只將 IPC 暴露給其他受信任的進程。
- 系統進程不得偵聽網絡套接字。這是 CTS 要求。
隔離進程
Android 應用程序沙箱為應用程序提供了與系統上其他進程(包括根進程和調試器)隔離的期望。除非應用程序和用戶專門啟用了調試,否則任何應用程序都不應違反該期望。
- 確保根進程不會訪問單個應用數據文件夾中的數據,除非使用記錄在案的 Android 調試方法。
- 確保根進程不訪問應用程序的內存,除非使用文檔化的 Android 調試方法。
- 確保設備不包含任何訪問其他應用程序或進程的數據或內存的應用程序。