應用程式安全性最佳做法

本節提供建議,協助您確保 Android 裝置上應用程式的安全性。

原始碼審查

原始碼審查可偵測多種安全性問題,包括本文所述的安全性問題。Android 強烈建議您同時進行手動和自動化原始碼審查。

  • 進行審查時,請遵循全面的安全指南,確保涵蓋所有範圍。使用相關的內部或外部標準,確保審查作業一致且完整。
  • 針對使用 Android SDK 的所有應用程式程式碼執行 Lint 工具 (例如 Android Studio Lint 工具),並修正任何已識別的問題。
  • 使用可偵測記憶體管理問題 (例如緩衝區溢位和 off-by-one 錯誤) 的自動化工具分析原生程式碼。
  • Android 建構系統支援許多 LLVM Sanitizer,例如 AddressSanitizerUndefinedBehaviorSanitizer,可用於分析記憶體相關問題的執行階段。結合模糊測試 (Android 透過 libFuzzer 提供支援),淨化器可找出需要進一步調查的異常邊緣案例。
  • 具備專業知識的安全評估人員應審查風險較高的程式碼,例如加密、付款處理和 PII 處理。

自動化測試

自動化測試可協助偵測各種安全性問題,因此應定期執行。

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

安全漏洞掃描

安全漏洞掃描可協助確保預先安裝的應用程式沒有已知的安全漏洞。先進偵測功能可縮短解決這些安全漏洞所需的時間和成本,並防止使用者和裝置面臨風險。

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

可能有害的應用程式

請務必確認裝置上預先安裝的應用程式不是潛在有害應用程式 (PHA)。您必須為裝置上所有應用程式的行為負責。在裝置推出前,掃描所有預先載入的應用程式,找出安全漏洞。

如要進一步瞭解 PHA 以及 Google 如何在 Play 商店中對抗 PHA,請參閱 Google Play 安全防護開發人員說明文件

應用程式安裝和權限

預先安裝的應用程式如果擁有過多權限,可能會造成安全風險。請將預先安裝的應用程式限制為最低必要權限,並確保這些應用程式無法存取不必要的權限或特權。應用程式權限會在 AndroidManifest.xml 中說明。

  • 請勿向預先安裝的應用程式授予不必要的權限或特權。請仔細檢查具有系統權限的應用程式,因為這些應用程式可能具有非常敏感的權限。
  • 請確認要求的所有權限與該特定應用程式的功能相關,且必要。
  • 請務必為所有使用 INSTALL_PACKAGES 權限的預先安裝應用程式提供使用者揭露事項。
  • 請確認開發人員在合約中同意不得以 UID 0 安裝任何應用程式。
  • 評估所有應用程式在資訊清單中宣告的權限,這些應用程式會透過開發人員的網路安裝。
  • 請確認開發人員在將應用程式提供給裝置前,必須依合約規定使用 Google Safe Browsing API 掃描自動更新器和安裝程式應用程式的所有下載網址。

應用程式簽署

應用程式簽名在裝置安全性方面扮演重要角色,用於權限檢查和軟體更新。在選擇用於簽署應用程式的金鑰時,請務必考量應用程式是否僅適用於單一裝置,或是適用於多個裝置。

  • 請確認應用程式並未使用公開金鑰 (例如 AOSP 開發人員金鑰) 進行簽署。
  • 請務必按照業界標準處理機密金鑰的做法,管理用於簽署應用程式的金鑰,包括提供可稽核的有限存取權的硬體安全性模組 (HSM)。
  • 請確認應用程式並未使用平台金鑰簽署。這樣做會讓應用程式存取平台簽章權限,這些權限功能強大,且僅供作業系統元件使用。系統應用程式應使用特權權限。
  • 請確認使用相同套件名稱的應用程式並未使用不同的金鑰簽署。這通常會發生在為不同裝置建立應用程式時,尤其是使用平台金鑰時。如果應用程式不受裝置限制,請在各裝置上使用相同的金鑰。如果應用程式是裝置專屬,請為每個裝置和金鑰建立專屬的套件名稱。

隔離應用程式和程序

在正確使用情況下,Android 沙箱模型可為應用程式和程序提供額外安全防護。

隔離根程序

根程序是權限提升攻擊最常鎖定的目標,因此減少根程序的數量,就能降低權限提升的風險。

  • 請確認裝置以 root 權限執行必要的最低程式碼。盡可能使用一般 Android 程序,而非根程序。如果程序必須在裝置上以 root 權限執行,請在 AOSP 功能要求中記錄程序,以便公開審查。
  • 請盡可能將根碼與不受信任的資料隔離,並透過進程間通訊 (IPC) 存取。舉例來說,您可以將根功能縮減為可透過 Binder 存取的小型服務,並將具有簽名權限的服務公開給權限較低或沒有權限的應用程式,以便處理網路流量。
  • 根程序不得監聽網路通訊端。
  • 根程序不得包含通用的執行階段,例如 Java VM。

隔離系統應用程式

一般來說,預先安裝的應用程式不應使用共用的系統專屬 ID (UID) 執行。如果應用程式需要使用系統的共用 UID 或其他特權服務 (例如電話),則不應匯出任何服務、廣播接收器或內容提供者,以免使用者安裝的第三方應用程式可存取這些服務。

  • 確保裝置以系統模式執行必要的最低程式碼。盡可能使用具有自身 UID 的 Android 程序,而非重複使用系統 UID。
  • 在可行情況下,系統程式碼應與不受信任的資料隔離,並只將 IPC 公開給其他受信任的程序。
  • 系統程序不得監聽網路通訊端。這是 CTS 規定。

隔離程序

Android 應用程式沙箱可讓應用程式與系統上的其他程序 (包括根層級程序和偵錯工具) 隔離。除非應用程式和使用者明確啟用偵錯功能,否則任何應用程式都不應違反這項預期。

  • 請確認根程序不會存取個別應用程式資料資料夾中的資料,除非您使用已記錄的 Android 偵錯方法。
  • 請確保根程序不會存取應用程式的記憶體,除非使用已記錄的 Android 偵錯方法。
  • 確認裝置不包含任何會存取其他應用程式或程序資料或記憶體的應用程式。