應用程式安全最佳實踐

本節包含確保 Android 裝置上應用程式安全的建議。

原始碼審查

原始碼審查可以檢測廣泛的安全性問題,包括本文檔中確定的問題。 Android 強烈鼓勵手動和自動原始碼審查。

  • 進行審查時遵循全面的安全指南以確保覆蓋範圍。利用相關的內部或外部標準來確保一致和完整的審查。
  • 使用 Android SDK 對所有應用程式程式碼執行 linter,例如Android Studio linter並修正任何已識別的問題。
  • 使用自動化工具分析本機程式碼,該工具可以偵測記憶體管理問題,例如緩衝區溢位和相差一錯誤。
  • Android 建置系統支援許多 LLVM 清理程序,例如AddressSanitizerUndefinedBehaviorSanitizer ,它們可用於記憶體相關問題的執行時間分析。與 Android 中透過libFuzzer支援的模糊測試相結合,清理程式可以發現需要進一步調查的異常邊緣情況。
  • 知識淵博的安全評估員應該審查風險較高的代碼,例如加密、支付處理和 PII 處理。

自動化測試

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

  • 在整個開發過程中定期運行最新版本的CTS ,以便及早發現問題並縮短修正時間。 Android 使用 CTS 作為我們的自動化建置流程中持續整合的一部分,該流程每天會建置多次。
  • 自動執行介面安全性測試,包括使用格式錯誤的輸入進行測試(模糊測試)。 Android 的建置系統支援libFuzzer來編寫模糊測試。

漏洞掃描

漏洞掃描可以幫助確保預先安裝應用程式不存在已知的安全漏洞。進階檢測可以減少解決這些漏洞並防止使用者和設備面臨風險所需的時間和成本。

  • 使用業界認可的應用程式漏洞掃描工具掃描所有預先安裝的應用程式並解決偵測到的漏洞。

潛在有害的應用程式

請務必確保設備上預先安裝的應用程式不是潛在有害應用程式(PHA)。您對設備上包含的所有應用程式的行為負責。在設備啟動之前,掃描所有預先載入的應用程式是否有漏洞。

有關 PHA 以及 Google 如何在 Play 商店中打擊它們的更多信息,請參閱Google Play Protect 開發人員文檔

應用程式安裝和權限

預先安裝應用程式的過多權限可能會帶來安全風險。將預先安裝的應用程式限制為最低必要權限,並確保它們無法存取不必要的權限或特權。應用程式權限在AndroidManifest.xml中描述。

  • 不要向預先安裝的應用程式授予不必要的權限或特權。徹底檢查具有系統權限的應用程序,因為它們可能具有非常敏感的權限。
  • 確保請求的所有權限對於該特定應用程式的功能而言都是相關且必要的。
  • 確保使用INSTALL_PACKAGES權限的所有預安裝應用程式均存在使用者外洩。
  • 確保開發者有合約義務不安裝任何 UID 0 的應用程式。
  • 評估要透過開發人員網路安裝的所有應用程式的清單中聲明的權限。
  • 確保開發人員有合約義務在向裝置提供應用程式之前使用Google 安全性瀏覽 API掃描自動更新程式和安裝程式應用程式的所有下載 URL。

應用程式簽名

應用程式簽名在裝置安全中發揮重要作用,用於權限檢查和軟體更新。選擇用於簽署應用程式的金鑰時,重要的是要考慮應用程式是僅在單一裝置上可用還是在多個裝置上通用。

  • 確保應用程式未使用公開的金鑰進行簽名,例如 AOSP 開發人員金鑰。
  • 確保用於簽署應用程式的金鑰的管理方式符合處理敏感金鑰的行業標準實踐,包括提供有限、可審核存取的硬體安全模組 (HSM)。
  • 確保應用程式未使用平台金鑰進行簽署。這樣做可以讓應用程式存取平台簽名權限,這些權限非常強大,並且僅供作業系統的元件使用。系統應用程式應使用特權權限。
  • 確保具有相同包名的應用程式不會使用不同的金鑰進行簽署。當為不同裝置建立應用程式時,尤其是使用平台金鑰時,通常會發生這種情況。如果應用程式與裝置無關,請跨裝置使用相同的金鑰。如果應用程式是特定於裝置的,請為每個裝置和金鑰建立唯一的套件名稱。

隔離應用程式和進程

如果正確使用,Android沙箱模型可以為應用程式和進程提供額外的安全性。

隔離根進程

根進程是權限提升攻擊最常見的目標;減少根進程的數量可以降低特權升級的風險。

  • 確保裝置以 root 身分運行最少的必要程式碼。如果可能,請使用常規 Android 進程而不是根進程。如果某個流程必須在裝置上以 root 身分執行,請在 AOSP 功能要求中記錄流程,以便公開審核。
  • 如果可能,根程式碼應與不受信任的資料隔離,並透過進程間通訊 (IPC) 進行存取。例如,將 root 功能減少為可透過 Binder 存取的小型服務,並將具有簽署權限的服務公開給處理網路流量的權限較低或沒有權限的應用程式。
  • 根程序不得偵聽網路套接字。
  • 根進程不得包含通用運行時,例如 Java VM。

隔離系統應用程式

一般來說,預裝應用程式不應使用共用系統唯一識別碼 (UID) 來運作。如果應用程式需要使用系統或其他特權服務(例如電話)的共用UID,則該應用程式不應匯出任何可由使用者安裝的第三方應用程式存取的服務、廣播接收器或內容提供者。

  • 確保設備作為系統運作最少的必要代碼。如果可能,請使用具有自己的 UID 的 Android 進程,而不是重複使用系統 UID。
  • 如果可能,系統程式碼應與不可信資料隔離,並僅將 IPC 暴露給其他可信進程。
  • 系統程序不得偵聽網路套接字。這是 CTS 要求。

隔離進程

Android 應用程式沙箱為應用程式提供了與系統上其他進程(包括根進程和偵錯器)隔離的期望。除非應用程式和用戶專門啟用了調試,否則任何應用程式都不應違反該期望。

  • 確保根進程不會存取各個應用程式資料資料夾中的數據,除非使用記錄的 Android 偵錯方法。
  • 確保根進程不會存取應用程式的內存,除非使用記錄的 Android 偵錯方法。
  • 確保裝置不包含任何存取其他應用程式或進程的資料或記憶體的應用程式。