Google致力於提高黑人社區的種族平等。 怎麼看。
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

應用安全最佳做法

本部分包含確保Android設備上應用程序安全的建議。

源代碼審查

源代碼審查可以檢測到廣泛的安全問題,包括本文檔中確定的那些問題。 Android強烈建議手動和自動檢查源代碼。

  • 進行審核以確保覆蓋範圍時,請遵循全面的安全指導。利用相關的內部或外部標準來確保一致且完整的審核。
  • 使用Android SDK在所有應用程序代碼上運行linter,例如Android Studio linter ,並更正所有已識別的問題。
  • 使用自動工具分析本機代碼,該工具可以檢測內存管理問題,例如緩衝區溢出和一次性錯誤。
  • Android構建系統支持許多LLVM清理器,例如AddressSanitizerUndefinedBehaviorSanitizer ,它們可用於與內存相關的問題的運行時分析。結合fuzzing (通過libFuzzer在Android中受支持),清理程序可以發現異常邊緣情況,需要進一步調查。
  • 知識淵博的安全評估人員應審查較高風險的代碼,例如加密,付款處理和PII處理。

自動化測試

自動化測試可以幫助檢測廣泛的安全問題,因此應定期執行。

  • 在整個開發過程中定期運行最新版本的CTS ,以及早發現問題並減少糾正時間。 Android使用CTS作為我們自動構建過程中持續集成的一部分,該過程每天進行多次構建。
  • 自動化接口的安全測試,包括使用格式錯誤的輸入進行測試(模糊測試)。 Android的構建系統支持libFuzzer來編寫模糊測試。

漏洞掃描

漏洞掃描可以幫助確保預安裝的應用程序沒有已知的安全漏洞。高級檢測可以解決這些漏洞並減少對用戶和設備的風險,從而減少所需的時間和成本。

  • 使用行業認可的應用程序漏洞掃描工具掃描所有預安裝的應用程序,並解決檢測到的漏洞。

潛在有害應用

確保設備上預安裝的應用不是潛在有害應用 (PHA),這一點很重要。您應對設備中包含的所有應用程序的行為負責。在設備啟動之前,請掃描所有預加載的應用程序中的漏洞。

有關PHA以及Google如何在Play商店中與PHA對抗的更多信息,請參閱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調試方法。
  • 確保設備不包括任何可訪問其他應用程序或進程的數據或內存的應用程序。