Android 有使用者驗證器的概念,可用來解鎖裝置,並控管加密編譯金鑰的存取權。這項作業涉及下列元件:
- 加密編譯金鑰儲存和服務供應商。Android KeyStore 可為應用程式提供硬體支援的加密編譯服務。架構層級的 Android KeyStore 系統由
keystore2
系統服務支援。這項功能依序取決於供應商專屬的基礎 KeyMint (先前稱為 Keymaster) 實作項目,可確保金鑰內容只能在硬體支援的安全環境中存取,例如受信任的執行環境 (TEE) 或安全元件 (SE)。 - 使用者驗證器。驗證使用者是否已成功驗證。Android 支援下列驗證元件:
- Gatekeeper:用於在 TEE 中驗證 PIN 碼、解鎖圖案或密碼。
- (選用) 在安全元素中使用 Weaver 進行 PIN 碼、解鎖圖案或密碼驗證。
- 指紋:用於指紋驗證。
- 其他生物特徵辨識驗證方法。搭載 Android 9 以上版本的裝置可使用
BiometricPrompt
做為指紋和其他生物特徵辨識功能的單一整合點。
keystore2
服務通訊其驗證狀態。
這些元件各自適用於特定供應商,但供應商實作必須符合 硬體抽象層 (HAL) 介面規格,並通過相應的供應商測試套件 (VTS) 測試。
供應商實作項目通常也分為兩個部分,並透過供應商專屬的通訊機制連結:
- HAL 服務會以 Android 系統程序的形式執行,接收來自 Android 系統的 Binder 要求。
- 受信任的應用程式 (TA) 會在安全環境中執行,執行實際的安全作業。
註冊
在恢復原廠設定後首次啟動裝置時,所有驗證工具都會準備好接收使用者註冊的憑證。使用者必須先向 Gatekeeper (或可用的 Weaver) 註冊 PIN 碼、解鎖圖案或密碼。這項初始註冊作業會建立隨機產生的 64 位元使用者安全 ID (SID),做為使用者的 ID,以及使用者加密編譯資料的繫結權杖。這個使用者 SID 會以加密方式繫結至使用者的密碼;如果成功向 Gatekeeper 驗證,AuthToken 就會包含該密碼的使用者 SID。
如要變更現有憑證,使用者必須出示該憑證。如果現有憑證已成功驗證,則與現有憑證相關聯的使用者 SID 會轉移至新憑證,讓使用者在變更憑證後仍能存取金鑰。
在某些情況下,裝置管理員可以執行不受信任的註冊程序,在不出示現有憑證的情況下註冊新憑證。這可讓使用者存取裝置,但舊使用者 SID 下建立的金鑰會永久遺失。
驗證
本節將說明一般驗證流程,其中涉及 Android 和安全環境中多個元件之間的互動。請注意,所有安全元件都會共用 (每次啟動) 密鑰 HMAC,用於驗證彼此的訊息。
使用者設定憑證並指派使用者 SID 後,即可開始驗證程序,只要使用者提供 PIN 碼、解鎖圖案、密碼、指紋或其他高強度生物特徵辨識資料,驗證程序就會開始。
圖 1. 驗證流程
- 使用者提供驗證方法,而相關服務會向 HAL 服務提出要求。
- 針對 PIN 碼、解鎖圖案或密碼,
LockSettingsService
會向gatekeeperd
提出要求。 - 生物特徵辨識驗證流程取決於 Android 版本。在搭載 Android 8.x 以下版本的裝置上,
FingerprintService
會向fingerprintd
提出要求。在搭載 Android 9 以上版本的裝置上,BiometricPrompt
會使用適當的BiometricManager
類別 (例如FingerprintManager
或FaceManager
),向適當的生物辨識守護程序 (例如fingerprintd
用於指紋或faced
用於臉部) 提出要求。無論版本為何,生物特徵辨識驗證都會在要求傳送後以非同步方式進行。
- 針對 PIN 碼、解鎖圖案或密碼,
- HAL 服務會將資料傳送至對應的 TA,後者會產生 AuthToken:
- 針對 PIN 碼/解鎖圖案/密碼驗證,
gatekeeperd
會透過 Gatekeeper HAL 服務,將 PIN 碼、解鎖圖案或密碼雜湊值傳送至 TEE 中的 Gatekeeper TA。如果 TEE 中的驗證成功,Gatekeeper TA 就會傳送 AuthToken,其中包含對應的使用者 SID (使用共用 HMAC 金鑰簽署)。 - 針對指紋驗證,
fingerprintd
會監聽指紋事件,並透過指紋 HAL 將資料傳送至 TEE 中的指紋 TA。如果 TEE 中的驗證成功,Fingerprint TA 就會發出 AuthToken (使用 AuthToken HMAC 金鑰簽署)。 - 對於其他生物辨識驗證,適當的生物辨識 daemon 會監聽生物辨識事件,並將事件傳送至適當的生物辨識 HAL 服務和 TA。
- 針對 PIN 碼/解鎖圖案/密碼驗證,
- 產生的已簽署 AuthToken 會透過 Binder 介面傳遞至
keystore2
系統服務。 keystore2
服務會附加 AuthToken,要求 KeyMint (先前稱為 Keymaster) 執行加密編譯作業。KeyMint HAL 服務會將這些值傳遞給 KeyMint TA,後者會使用與 Gatekeeper 共用的 HMAC 金鑰,以及支援的生物辨識 TEE 元件來驗證這些值。KeyMint 會將符記中的時間戳記視為上次驗證時間,並根據時間戳記決定是否允許使用金鑰。
驗證流程不需要在安全環境中的 TA 之間進行直接通訊:AuthToken 會從驗證器 TA 流向 Android 中的 keystore2
服務,而後者會將 AuthToken 傳遞給 KeyMint TA。這也允許 keystore2
服務快速拒絕必定失敗的要求,因為它知道系統中可用的 AuthToken,可將可能成本高昂的 IPC 儲存至 TEE。
AuthToken 格式
AuthToken 的格式是由 HardwareAuthToken.aidl
中的 AIDL 規格提供。
裝置啟動流程
每次啟動裝置時,系統都必須產生 AuthToken HMAC 金鑰,並與所有 TEE 元件 (Gatekeeper、KeyMint/Keymaster 和支援的生物特徵辨識 TA) 共用。為防範重送攻擊,每次裝置重新啟動時,HMAC 金鑰都必須隨機產生。
TA 取得這組共用 HMAC 金鑰存取權的方式有兩種:
- 共用密碼協議:
keystore2
服務會在裝置啟動時執行多向金鑰協議通訊協定,讓參與的 TA 之間可安全地衍生 HMAC 金鑰。不過,參與的 TA 必須能存取共同的預先共用密鑰。 - 直接存取:位於相同安全環境中的 TA 可使用內部程序間通訊機制 (取決於平台) 來共用 HMAC 金鑰。
無論是哪種情況,HMAC 金鑰都「絕對不能」在 TEE 外部提供。
Trusty 作業系統是 TEE 的範例,會在 Android 旁邊執行,但您也可以使用其他 TEE。Trusty 會使用內部 IPC 系統,直接在 KeyMint 和 Gatekeeper 或適當的生物特徵辨識 TA 之間進行通訊。HMAC 金鑰只會保留在 KeyMint 中;Fingerprint 和 Gatekeeper 會在每次使用時向 KeyMint 要求金鑰,且不會持續或快取值。