實施安全

Android 安全團隊會定期收到有關防止 Android 設備上的潛在安全問題的信息請求。我們還偶爾抽查設備,讓設備製造商和受影響的合作夥伴了解潛在問題。

此頁面根據我們的經驗提供安全最佳實踐,擴展了我們為開發人員提供的安全設計文檔,並包含在設備上構建或安裝系統級軟件的獨特細節。

為了促進採用這些最佳做法,Android 安全團隊會盡可能將測試合併到Android 兼容性測試套件(CTS) 和Android Lint中。我們鼓勵設備實現者貢獻可以幫助其他 Android 用戶的測試(在root/cts/tests/tests/security/src/android/security/cts查看與安全相關的測試)。

開發過程

在您的開發過程和環境中使用以下最佳實踐。

審查源代碼

源代碼審查可以檢測廣泛的安全問題,包括本文檔中確定的問題。 Android 強烈鼓勵手動和自動源代碼審查。最佳實踐:

  • 使用 Android SDK 在所有應用程序代碼上運行Android Lint並更正任何已識別的問題。
  • 應使用自動化工具分析本機代碼,該工具可以檢測內存管理問題,例如緩衝區溢出和非一錯誤。
  • Android 構建系統支持許多 LLVM 清理程序,例如可用於此目的的 AddressSanitizer 和 UndefinedBehaviorSanitizer。

使用自動化測試

自動化測試可以檢測廣泛的安全問題,包括下面討論的幾個問題。最佳實踐:

  • CTS 定期更新安全測試;運行最新版本的 CTS 以驗證兼容性。
  • 在整個開發過程中定期運行 CTS,以及早發現問題並縮短糾正時間。 Android 在我們的自動化構建過程中使用 CTS 作為持續集成的一部分,該過程每天構建多次。
  • 設備製造商應該自動化接口的安全測試,包括使用格式錯誤的輸入進行測試(模糊測試)。

簽名系統映像

系統映像的簽名對於確定設備的完整性至關重要。最佳實踐:

  • 設備不得使用公開的密鑰進行簽名。
  • 用於簽署設備的密鑰應按照與處理敏感密鑰的行業標準做法一致的方式進行管理,包括提供有限、可審計訪問的硬件安全模塊 (HSM)。

簽署應用程序 (APK)

應用程序簽名在設備安全中發揮著重要作用,用於權限檢查和軟件更新。在選擇用於簽署應用程序的密鑰時,重要的是要考慮應用程序是僅在單個設備上可用還是在多個設備上通用。最佳實踐:

  • 不得使用公開的密鑰對應用程序進行簽名。
  • 用於簽署應用程序的密鑰應按照與處理敏感密鑰的行業標準做法一致的方式進行管理,包括提供有限、可審計訪問的 HSM。
  • 不應使用平台密鑰對應用程序進行簽名。
  • 不應使用不同的密鑰對具有相同包名稱的應用程序進行簽名。這通常發生在為不同設備創建應用程序時,尤其是在使用平台密鑰時。如果應用程序與設備無關,請跨設備使用相同的密鑰。如果應用程序是特定於設備的,請為每個設備和密鑰創建唯一的包名稱。

發布應用程序

Google Play 使設備製造商無需執行完整的系統更新即可更新應用程序。這可以加快對安全問題的響應和新功能的交付,並提供一種方法來確保您的應用程序具有唯一的包名稱。最佳實踐:

  • 將您的應用程序上傳到 Google Play 以允許自動更新,而無需完整的無線 (OTA) 更新。用戶無法直接下載已上傳但未發布的應用程序,但仍會更新應用程序。之前安裝過該應用程序的用戶可以重新安裝它和/或安裝在其他設備上。
  • 創建一個與您的公司明確相關的應用程序包名稱,例如使用公司商標。
  • 設備製造商發布的應用程序應上傳到 Google Play 商店,以避免第三方用戶冒充包名。如果設備製造商在設備上安裝應用程序而不在 Play 商店上發布應用程序,則另一個開發人員可以上傳相同的應用程序,使用相同的包名稱,並更改應用程序的元數據。當應用程序呈現給用戶時,這種不相關的元數據可能會造成混亂。

應對事件

外部各方必須能夠就特定於設備的安全問題聯繫設備製造商。我們建議創建一個可公開訪問的電子郵件地址來管理安全事件。最佳實踐:

  • 創建一個security@your-company.com或類似地址並公開它​​。
  • 如果您發現來自多個設備製造商的影響 Android 操作系統或 Android 設備的安全問題,您應該通過提交安全錯誤報告聯繫 Android 安全團隊。

產品實施

實施產品時使用以下最佳實踐。

隔離根進程

根進程是權限提升攻擊最常見的目標,因此減少根進程的數量可以降低權限提升的風險。 CTS 包括一個列出根進程的信息測試。最佳實踐:

  • 設備應以 root 身份運行最少的必要代碼。在可能的情況下,使用常規的 Android 進程而不是根進程。 ICS Galaxy Nexus 只有六個根進程:vold、inetd、zygote、tf_daemon、ueventd 和 init。如果某個進程必須在設備上以 root 身份運行,請在 AOSP 功能請求中記錄該進程,以便對其進行公開審查。
  • 在可能的情況下,根代碼應與不受信任的數據隔離開來,並通過 IPC 進行訪問。例如,將根功能簡化為可通過 Binder 訪問的小型服務,並將具有簽名權限的服務公開給具有低權限或沒有權限來處理網絡流量的應用程序。
  • 根進程不得偵聽網絡套接字。
  • 根進程不得為應用程序(例如,Java VM)提供通用運行時。

隔離系統應用

通常,預安裝的應用程序不應使用共享系統 UID 運行。但是,如果應用程序需要使用系統的共享 UID 或其他特權服務,則應用程序不應導出用戶安裝的第三方應用程序可以訪問的任何服務、廣播接收器或內容提供程序。最佳實踐:

  • 設備應作為系統運行最少的必要代碼。在可能的情況下,使用具有自己 UID 的 Android 進程,而不是重複使用系統 UID。
  • 在可能的情況下,系統代碼應該與不受信任的數據隔離,並且只將 IPC 暴露給其他受信任的進程。
  • 系統進程不得偵聽網絡套接字。

隔離進程

Android 應用程序沙箱為應用程序提供了與系統上其他進程(包括根進程和調試器)隔離的期望。除非應用程序和用戶特別啟用調試,否則任何應用程序都不應違反該期望。最佳實踐:

  • 除非使用記錄在案的 Android 調試方法,否則根進程不得訪問單個應用程序數據文件夾中的數據。
  • 根進程不得訪問應用程序的內存,除非使用記錄在案的 Android 調試方法。
  • 設備不得包含訪問其他應用程序或進程的數據或內存的任何應用程序。

保護 SUID 文件

不受信任的程序不應訪問新的 setuid 程序。 Setuid 程序經常成為可用於獲取 root 訪問權限的漏洞的位置,因此請盡量減少 setuid 程序對不受信任的應用程序的可用性。最佳實踐:

  • SUID 進程不得提供可用於繞過 Android 安全模型的 shell 或後門。
  • SUID 程序不得由任何用戶寫入。
  • SUID 程序不應該是世界可讀或可執行的。創建一個組,將 SUID 二進製文件的訪問權限限制為該組的成員,並將任何應該能夠執行 SUID 程序的應用程序放入該組。
  • SUID 程序是用戶 root 設備的常見來源。為了降低這種風險,SUID 程序不應由 shell 用戶執行。

CTS 驗證程序包括一個信息測試列表 SUID 文件;每個 CTS 測試都不允許使用某些 setuid 文件。

保護監聽套接字

當設備在任何端口、任何接口上偵聽時,CTS 測試都會失敗。如果發生故障,Android 會驗證是否使用了以下最佳做法:

  • 設備上應該沒有監聽端口。
  • 偵聽端口必須能夠在沒有 OTA 的情況下禁用。這可以是服務器或用戶設備配置更改。
  • 根進程不得偵聽任何端口。
  • 系統 UID 擁有的進程不得偵聽任何端口。
  • 對於使用套接字的本地 IPC,應用程序必須使用 UNIX 域套接字,其訪問權限僅限於一個組。為 IPC 創建一個文件描述符,並為特定的 UNIX 組設置為 +RW。任何客戶端應用程序都必須在該 UNIX 組中。
  • 一些具有多個處理器的設備(例如,與應用處理器分離的無線電/調製解調器)使用網絡套接字在處理器之間進行通信。在這種情況下,用於處理器間通信的網絡套接字必須使用隔離的網絡接口來防止設備上未經授權的應用程序訪問(即使用iptables來防止設備上的其他應用程序訪問)。
  • 處理監聽端口的守護進程必須對畸形數據具有魯棒性。 Google 可能會使用未經授權的客戶端以及可能的授權客戶端對端口進行模糊測試。任何崩潰都將被歸檔為具有適當嚴重性的錯誤。

記錄數據

記錄數據會增加暴露該數據的風險並降低系統性能。由於Android設備默認安裝的應用程序記錄敏感用戶數據,導致多起公共安全事件發生。最佳實踐:

  • 應用程序或系統服務不應記錄第三方應用程序提供的可能包含敏感信息的數據。
  • 作為正常操作的一部分,應用程序不得記錄任何個人身份信息 (PII)。

CTS 包括檢查系統日誌中是否存在潛在敏感信息的測試。

限制目錄訪問

全局可寫目錄可能會引入安全漏洞,並使應用程序能夠重命名受信任的文件、替換文件或進行基於符號鏈接的攻擊(攻擊者可能使用指向文件的符號鏈接來欺騙受信任的程序執行不應執行的操作)。可寫目錄還可以阻止應用程序的卸載正確清理與應用程序關聯的所有文件。

作為最佳實踐,由系統或 root 用戶創建的目錄不應該是全局可寫的。 CTS 測試通過測試已知目錄來幫助實施這一最佳實踐。

保護配置文件

許多驅動程序和服務依賴於存儲在/system/etc/data等目錄中的配置和數據文件。如果這些文件由特權進程處理並且是全局可寫的,則應用程序可以通過在全局可寫文件中製作惡意內容來利用進程中的漏洞。最佳實踐:

  • 特權進程使用的配置文件不應該是世界可讀的。
  • 特權進程使用的配置文件不能是全局可寫的。

存儲本機代碼庫

特權設備製造商進程使用的任何代碼都必須在/vendor/system ;這些文件系統在啟動時以只讀方式安裝。作為最佳實踐,系統或設備上安裝的其他高權限應用程序使用的庫也應該在這些文件系統中。這可以防止可能允許攻擊者控制特權進程執行的代碼的安全漏洞。

限制設備驅動程序訪問

只有受信任的代碼才能直接訪問驅動程序。在可能的情況下,首選架構是提供一個單一用途的守護程序,它代理對驅動程序的調用並限制驅動程序對該守護程序的訪問。作為最佳實踐,驅動程序設備節點不應該是世界可讀或可寫的。 CTS 測試通過檢查公開驅動程序的已知實例來幫助實施此最佳實踐。

禁用亞行

Android 調試橋 (adb) 是一種有價值的開發和調試工具,但設計用於受控的安全環境,不應啟用以供一般使用。最佳實踐:

  • 默認情況下必須禁用 ADB。
  • ADB 必須要求用戶在接受連接之前打開它。

解鎖引導加載程序

許多 Android 設備支持解鎖,使設備所有者能夠修改系統分區和/或安裝自定義操作系統。常見用例包括安裝第三方 ROM 和在設備上執行系統級開發。例如,Google Nexus 設備所有者可以運行fastboot oem unlock來啟動解鎖過程,這會向用戶顯示以下消息:

解鎖引導加載程序?

如果您解鎖引導加載程序,您將能夠在此設備上安裝自定義操作系統軟件。

自定義操作系統不會與原始操作系統進行相同的測試,並且可能會導致您的設備和已安裝的應用程序停止正常工作。

為防止未經授權訪問您的個人數據,解鎖引導加載程序還將從您的設備中刪除所有個人數據(“恢復出廠設置”)。

按音量增大/減小按鈕選擇是或否。然後按電源按鈕繼續。

:解鎖引導加載程序(可能會使保修失效)

:不解鎖引導加載程序並重新啟動設備。


作為最佳實踐,可解鎖的 Android 設備必須在解鎖之前安全地擦除所有用戶數據。未能正確刪除解鎖時的所有數據可能會使物理上接近的攻擊者未經授權訪問機密的 Android 用戶數據。為防止洩露用戶數據,支持解鎖的設備必須正確實施(我們已經看到許多設備製造商未正確實施解鎖的實例)。正確實施的解鎖過程具有以下屬性:

  • 當用戶確認解鎖命令後,設備必須立即開始數據擦除。在安全刪除完成之前,不得設置unlocked標誌。
  • 如果無法完成安全刪除,則設備必須保持鎖定狀態。
  • 如果底層塊設備支持,則應使用ioctl(BLKSECDISCARD)或等效項。對於 eMMC 設備,這意味著使用 Secure Erase 或 Secure Trim 命令。對於 eMMC 4.5 及更高版本,這意味著使用正常的 Erase 或 Trim,然後執行 Sanitize 操作。
  • 如果底層塊設備不支持BLKSECDISCARD ,則必須改用ioctl(BLKDISCARD) 。在 eMMC 設備上,這是一個正常的 Trim 操作。
  • 如果不支持BLKDISCARD ,則可以使用全零覆蓋塊設備。
  • 最終用戶必須可以選擇要求在刷新分區之前擦除用戶數據。例如,在 Nexus 設備上,這是通過fastboot oem lock命令完成的。
  • 設備可以通過 efuse 或類似機制記錄設備是否被解鎖和/或重新鎖定。

這些要求確保在完成解鎖操作後銷毀所有數據。未能實施這些保護被認為是中等級別的安全漏洞。

隨後可以使用fastboot oem lock命令重新鎖定已解鎖的設備。鎖定引導加載程序為新的自定義操作系統提供與原始設備製造商操作系統相同的用戶數據保護(例如,如果設備再次解鎖,用戶數據將被擦除)。