看門人

Gatekeeper 子系統在可信執行環境 (TEE) 中執行設備模式/密碼驗證。網守通過具有硬件支持的密鑰的 HMAC 註冊和驗證密碼。此外,Gatekeeper 會限制連續失敗的驗證嘗試,並且必鬚根據給定的超時和給定的連續失敗嘗試次數拒絕服務請求。

當用戶驗證他們的密碼時,Gatekeeper 使用 TEE 派生的共享密鑰來簽署身份驗證證明,以發送到硬件支持的 Keystore 。也就是說,Gatekeeper 證明通知 Keystore 可以釋放身份驗證綁定密鑰(例如,應用程序創建的密鑰)以供應用程序使用。

建築學

Gatekeeper 涉及三個主要組件:

  • gatekeeperd (網守守護程序)。一個 C++ binder 服務,包含獨立於平台的邏輯並對應於GateKeeperService Java 接口。
  • 網守硬件抽象層 (HAL)hardware/libhardware/include/hardware/gatekeeper.h中的 HAL 接口,以及實現模塊。
  • 看門人 (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守護程序在其自己的進程中運行,並且獨立於系統服務器。

HAL 實施

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 可以訪問硬件支持的密鑰和一個在暫停狀態下滴答作響的安全、單調時鐘。

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,合規實施的主要職責包括:

  • 遵守關守 HAL。
  • 返回的 AuthToken 必鬚根據 AuthToken 規範(在Authentication中描述)進行格式化。
  • TEE 網關守衛必須能夠與 Keymaster 共享 HMAC 密鑰,方法是通過 TEE IPC 按需請求密鑰或始終保持該值的有效緩存。

用戶安全 ID (SID)

用戶 SID 是用戶的 TEE 表示(與 Android 用戶 ID 沒有強連接)。每當用戶註冊新密碼而不提供以前的密碼時,都會使用加密偽隨機數生成器 (PRNG) 生成 SID。這稱為不受信任的重新註冊,通常情況下 Android 框架不允許這樣做。當用戶提供有效的先前密碼時,會發生受信任的重新註冊;在這種情況下,用戶 SID 被遷移到新的密碼句柄,保留綁定到它的密鑰。

註冊密碼時,用戶 SID 與密碼句柄中的密碼一起被 HMAC 化。

用戶 SID 被寫入verify函數返回的 AuthToken 中,並與所有身份驗證綁定的 Keystore 密鑰相關聯(有關 AuthToken 格式和 Keystore 的詳細信息,請參閱Authentication )。由於對enroll函數的不可信調用將更改用戶 SID,因此該調用將使綁定到該密碼的密鑰無效。如果攻擊者控制 Android 操作系統,他們可以更改設備的密碼,但他們會在此過程中破壞受 root 保護的敏感密鑰。

請求限制

GateKeeper 必須能夠安全地限制對用戶憑據的暴力破解嘗試。如hardware/libhardware/include/hardware/gatekeeper.h所示,HAL 提供以毫秒為單位返回超時。超時通知客戶端在超時過去之前不要再次調用 GateKeeper;如果存在未決超時,GateKeeper 不應服務請求。

GateKeeper 必須在驗證用戶密碼之前寫入失敗計數器。如果密碼驗證成功,則應清除失敗計數器。這可以防止通過在發出verify調用後禁用嵌入式 MMC (eMMC) 來防止限制的攻擊。 enroll功能還驗證用戶密碼(如果提供)並且必須以相同的方式進行限制。

如果設備支持,強烈建議將故障計數器寫入安全存儲。如果設備不支持基於文件的加密,或者安全存儲速度太慢,則實現可以直接使用重放保護內存塊 (RPMB)。