應用程式安全性最佳做法

本節提供建議,確保 Android 裝置上的應用程式安全無虞。

原始碼審查

原始碼審查可偵測各種安全性問題,包括本文中列出的問題。Android 強烈建議手動和自動審查原始碼。

  • 進行審查時,請遵循全方位的安全指南,確保涵蓋所有內容。運用相關的內部或外部標準,確保審查結果一致且完整。
  • 對使用 Android SDK 的所有應用程式程式碼執行 Lint 工具 (例如 Android Studio Lint 工具),並修正所有發現的問題。
  • 使用自動化工具分析原生程式碼,偵測記憶體管理問題,例如緩衝區溢位和差一錯誤。
  • Android 建構系統支援許多 LLVM 清潔器,例如 AddressSanitizerUndefinedBehaviorSanitizer,可用於記憶體相關問題的執行階段分析。搭配模糊測試 (Android 透過 libFuzzer 支援),清除器可找出需要進一步調查的異常極端情況。
  • 有經驗的安全性評估人員應審查高風險程式碼,例如加密、付款處理和 PII 處理。

自動化測試

自動測試有助於偵測各種安全問題,因此應定期執行。

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

安全漏洞掃描

安全漏洞掃描有助於確保預先安裝的應用程式沒有已知的安全漏洞。進階偵測功能可縮短處理這些安全漏洞所需的時間,並降低相關成本,同時避免使用者和裝置面臨風險。

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

可能有害的應用程式

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

如要進一步瞭解潛在有害應用程式,以及 Google 如何在 Play 商店中防範這類應用程式,請參閱 Google Play 安全防護開發人員說明文件

應用程式安裝和權限

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

  • 請勿授予預先安裝的應用程式不必要的權限或權利。請仔細檢查具有系統權限的應用程式,因為這類應用程式可能擁有非常私密的權限。
  • 請確認所要求的權限都與該應用程式的功能相關,且為必要權限。
  • 請確保所有使用 INSTALL_PACKAGES 權限的預先安裝應用程式,都已向使用者揭露相關資訊。
  • 確認開發人員有合約義務,不得以 UID 0 安裝任何應用程式。
  • 評估透過開發人員網路安裝的所有應用程式,在資訊清單中宣告的權限。
  • 確保開發人員有合約義務,在將應用程式提供給裝置前,使用 Google 安全瀏覽 API 掃描自動更新程式和安裝程式應用程式的所有下載網址。

應用程式簽署

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

  • 請確保應用程式不是使用公開金鑰簽署,例如 AOSP 開發人員金鑰。
  • 確保用於簽署應用程式的金鑰管理方式,符合處理私密金鑰的業界標準做法,包括提供可稽核的有限存取權的硬體安全模組 (HSM)。
  • 確認應用程式未使用平台金鑰簽署。這麼做可讓應用程式存取平台簽章權限,這類權限功能強大,僅供作業系統元件使用。系統應用程式應使用具備特殊權限的權限。
  • 確認套件名稱相同的應用程式並非使用不同金鑰簽署。為不同裝置建立應用程式時,經常會發生這種情況,尤其是使用平台金鑰時。如果應用程式與裝置無關, 請在所有裝置上使用相同金鑰。如果應用程式適用於特定裝置,請為每個裝置和金鑰建立專屬的套件名稱。

隔離應用程式和程序

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

隔離根程序

權限提升攻擊最常以根程序為目標;減少根程序數量可降低權限提升風險。

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

隔離系統應用程式

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

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

隔離程序

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

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