看門人

Gatekeeper 子系統在可信任執行環境 (TEE) 中執行裝置模式/密碼驗證。 Gatekeeper 使用硬體支援的金鑰透過 HMAC 註冊並驗證密碼。此外,Gatekeeper 會限制連續失敗的驗證嘗試,並且必須根據給定的逾時和給定的連續失敗嘗試次數拒絕服務請求。

當使用者驗證其密碼時,Gatekeeper 使用 TEE 衍生的共用金鑰來簽署身份驗證證明,以傳送至硬體支援的金鑰庫。也就是說,Gatekeeper 證明通知 Keystore 可以釋放驗證綁定金鑰(例如應用程式建立的金鑰)以供應用程式使用。

建築學

Gatekeeper 涉及三個主要元件:

  • gatekeeperd (網守守護程式)。包含平台無關邏輯並對應GateKeeperService Java 介面的 C++ Binder 服務。
  • 網守硬體抽象層 (HAL) 。 HAL介面在hardware/libhardware/include/hardware/gatekeeper.h中,以及實作模組。
  • 網守(TEE)gatekeeperd的 TEE 對應項。基於 TEE 的 Gatekeeper 實作。

Gatekeeper 需要實作Gatekeeper HAL (特別是hardware/libhardware/include/hardware/gatekeeper.h中的函數)和TEE 特定的 Gatekeeper 元件(部分基於system/gatekeeper/include/gatekeeper/gatekeeper.h頭檔其中包含用於建立/存取金鑰和計算簽章的純虛擬函數)。

LockSettingsService發出請求(透過 Binder)到達 Android 作業系統中的gatekeeperd守護程式。然後, gatekeeperd守護程式發出一個請求,該請求到達 TEE 中的對應方(Gatekeeper):

網守流程
圖 1. GateKeeper 驗證的高階資料流

gatekeeperd守護程式為 Android 框架 API 提供對 HAL 的存取權限,並參與向 Keystore 報告裝置驗證gatekeeperd守護程式在自己的進程中運行,並且獨立於系統伺服器。

哈爾實施

gatekeeperd程式使用 HAL 與gatekeeperd守護程式的 TEE 對應項互動以進行密碼驗證。 HAL 實作必須能夠簽署(註冊)和驗證 blob。所有實作都應遵守每次成功的密碼驗證時產生的身份驗證令牌 (AuthToken) 的標準格式。 AuthToken的內容和語意請參考AuthToken格式

hardware/libhardware/include/hardware/gatekeeper.h頭檔的實作必須實作enrollverify功能:

  • enroll函數接受一個密碼 blob,對其進行簽名,然後將簽名作為句柄傳回。傳回的 blob(透過呼叫enroll )必須具有system/gatekeeper/include/gatekeeper/password_handle.h中所示的結構。
  • verify函數必須比較由所提供的密碼產生的簽名,並確保其與註冊的密碼句柄匹配。

用於註冊和驗證的金鑰絕不能更改,並且應該在每次設備啟動時都可以重新派生。

可信賴和其他實現

Trusty作業系統是 Google 用於 TEE 環境的開源可信任作業系統,包含經批准的 GateKeeper 實作。但是,您可以使用任何 TEE 作業系統來實作 Gatekeeper,只要 TEE 可以存取硬體支援的金鑰和在 suspend 中滴答作響的安全、單調時鐘。

Trusty 使用內部 IPC 系統在 Keymaster 和 Gatekeeper 的 Trusty 實作( Trusty Gatekeeper )之間直接傳遞共享秘密。此共用金鑰用於對發送至 Keystore 的 AuthToken 進行簽名,以提供密碼驗證的證明。 Trusty Gatekeeper 每次使用時都會向 Keymaster 要求金鑰,並且不會保留或快取該值。實現可以以任何不損害安全性的方式自由共享此秘密。

用於註冊和驗證密碼的 HMAC 金鑰是派生的並僅保存在 GateKeeper 中。

Android 提供了 GateKeeper 的通用 C++ 實現,只需新增特定於裝置的例程即可完成。若要使用 TEE 的裝置特定程式碼實作 TEE Gatekeeper,請參閱system/gatekeeper/include/gatekeeper/gatekeeper.h中的函數和註解。對於 TEE GateKeeper,合規實施的主要職責包括:

  • 遵守 Gatekeeper HAL。
  • 傳回的 AuthToken 必須根據 AuthToken 規範(在Authentication中描述)進行格式化。
  • TEE Gatekeeper 必須能夠與 Keymaster 共享 HMAC 金鑰,方法是透過 TEE IPC 按需請求金鑰,或始終維護該值的有效快取。

使用者安全 ID (SID)

使用者 SID 是使用者的 TEE 表示(與 Android 使用者 ID 沒有強烈關聯)。每當使用者註冊新密碼而不提供先前的密碼時,都會使用加密偽隨機數產生器 (PRNG) 產生 SID。這稱為不可信重新註冊,在正常情況下 Android 框架不允許。當使用者提供有效的先前密碼時,就會發生受信任的重新註冊;在這種情況下,使用者 SID 會遷移到新的密碼句柄,從而保留與其綁定的金鑰。

註冊密碼時,使用者 SID 與密碼一起在密碼句柄中進行 HMAC 處理。

使用者 SID 寫入verify函數傳回的 AuthToken 中,並與所有驗證綁定的金鑰庫金鑰相關聯(有關 AuthToken 格式和金鑰庫的詳細信息,請參閱驗證)。由於對enroll函數的不受信任的呼叫將更改使用者 SID,因此該呼叫將使綁定到該密碼的金鑰變得無用。如果攻擊者控制了 Android 作業系統,他們就可以更改裝置的密碼,但他們會在過程中破壞受 root 保護的敏感金鑰。

請求節流

GateKeeper 必須能夠安全地阻止對使用者憑證的暴力嘗試。如hardware/libhardware/include/hardware/gatekeeper.h所示,HAL 提供傳回逾時(以毫秒為單位)。逾時通知客戶端在逾時之前不要再次呼叫 GateKeeper;如果存在未決逾時,GateKeeper 不應為請求提供服務。

GateKeeper 在驗證使用者密碼之前必須寫入一個失敗計數器。如果密碼驗證成功,則應清除失敗計數器。這可以防止透過在發出verify呼叫後停用嵌入式 MMC (eMMC) 來防止限制的攻擊。 enroll函數也會驗證使用者密碼(如果提供),並且必須以相同的方式進行限制。

如果設備支持,強烈建議將故障計數器寫入安全儲存。如果裝置不支援基於檔案的加密,或者安全儲存太慢,則實作可以直接使用重播保護記憶體區塊(RPMB)。