Weaver

Android 8.1 推出的 Weaver 硬體抽象層 (HAL) (IWeaver.aidl) 提供安全介面,可透過螢幕鎖定知識因素 (LSKF) (例如 PIN 碼、解鎖圖案和密碼) 進行使用者驗證。

Weaver 會取代 Gatekeeper 的 LSKF 驗證功能。不過,Gatekeeper 仍會用於產生硬體驗證權杖

在 Android 9 以上版本中,CDD 9.11.2 要求支援 StrongBox 的裝置提供專屬安全硬體,以支援安全的使用者驗證。使用這項安全硬體實作 Weaver HAL,即可滿足「安全使用者驗證」規定。

如果裝置沒有專屬的安全元件 (SE),Weaver 仍可在受信任的執行環境 (TEE) 中實作,例如 Trusty

在 Android 17 以上版本中,即使裝置沒有專屬的安全元件,也強烈建議實作 Weaver。

元件

Weaver 由三個元件組成:

  • Weaver AIDL 介面 (IWeaver): HAL 的正式規格。Android 13 以下版本使用 HIDL,而非 AIDL。
  • Weaver 硬體抽象層 (HAL) 服務: 實作 IWeaver 介面的廠商專屬 Android 程序。
  • Weaver 受信任的應用程式 (TA): 在安全環境中執行的核心邏輯。並執行 LSKF 驗證和強制執行速率限制。HAL 服務會透過實作專屬的安全管道與 TA 通訊。

介面

Weaver 的介面會顯示固定大小的持續性指標陣列,每個指標都包含固定大小的鍵和值。每個時段都會由 ID 識別,ID 是 [0, numSlots - 1] 間隔內的整數。只有在提供與儲存金鑰相符的金鑰時,才能存取插槽的值。

Weaver 的介面主要包含:

  • getConfig():擷取實作程序支援的時段數量、金鑰大小和值大小。
  • write():使用新的鍵/值組合覆寫指定位置。這項作業是不可分割的,且會永久刪除先前的資料 (安全刪除),因此無法復原。
  • read():嘗試擷取指定插槽的值。 只有在 TA 強制執行的速率限制逾時未啟動,且提供的金鑰與儲存的金鑰完全相符時,這項作業才會成功。
  • warmUp():在 Android 17 以上版本中,表示可能很快就會發生讀取或寫入作業。

如需完整的介面規格,請參閱 IWeaver.aidl

Android 使用情形

如果可使用 Weaver 實作,Android 系統伺服器中的 LockSettingsService 就會使用這項實作來保護使用者資料。針對裝置上的每位使用者,LockSettingsService 會管理一個 Weaver 時段:

  • 插槽鍵 (weaverKey):使用者 LSKF 的雜湊值。如果使用者未設定螢幕鎖定,系統會使用預設字串。
  • 運算單元值 (weaverSecret):高熵、隨機產生的加密密鑰。

weaverSecret 的設計宗旨是只能透過下列方式擷取:

  • 在頻率限制政策內,向 Weaver TA 提供正確的 weaverKey
  • 破壞 Weaver TA 執行的安全環境。這項挑戰的難度很高。

LockSettingsService 會同時使用 weaverKeyweaverSecret 加密使用者的合成密碼。由於合成密碼可保護使用者憑證加密 (CE) 儲存空間,以用於檔案加密 (FBE),以及使用者Android Keystore 中的驗證繫結金鑰,因此在 Weaver 發布密碼前,資料仍無法存取。

在 Android 17 以上版本中,當使用者開始輸入 LSKF 時,LockSettingsService 會呼叫 Weaver 的 warmUp() 方法。Weaver 實作項目可以使用這項信號,將安全硬體從低功耗狀態轉換出來,以減少即將到來的 read() 要求延遲。

Weaver 與 Gatekeeper

在過去,Gatekeeper HAL 會在單一 verify() 呼叫中執行兩個不同的角色:

  1. 驗證:檢查 LSKF,並透過 TEE 強制執行速率限制。
  2. 認證:發出 HardwareAuthToken 通知 KeyMint (先前為 Keymaster),表示 LSKF 驗證成功。

為何要改用 Weaver?

Android 8.1 導入安全密碼重設權杖後,「合成密碼」就成為主要的加密密碼。上述兩個角色現在由不同的 Gatekeeper 註冊程序處理,一個用於 userId + 100000 下的 LSKF,另一個用於 userId 下的合成密碼。

Weaver 的推出是為了接管第一個角色,使用較簡單的 HAL 介面,並支援以安全元件 (SE) 為基礎的實作項目。

功能 Weaver Gatekeeper
安全刪除 必須安全刪除,且介面使用固定數量的固定大小位置,因此很容易實作。 由於介面支援無限數量的註冊,因此不需要安全刪除,且難以實作。
硬體 已針對 SE 最佳化,但也可在 TEE 中運作。 實際上僅限 TEE。以 SE 實作這項功能,目前設計無法提供安全性優勢。
錯誤處理 更清楚的錯誤代碼 含糊不清的錯誤代碼。因此,螢幕鎖定不會區分不正確的 LSKF 和無關的失敗。
原子性 LockSettingsService 中使用 Weaver 的程式碼會以原子方式執行 LSKF 變更。新資料會寫入新的 Weaver 空間,只有在安全無虞時,才會清除舊空間。 使用 Gatekeeper 的 LockSettingsService 程式碼不會自動執行 LSKF 變更。變更 LSKF 時,如果發生錯誤,所有使用者資料可能會遺失。

參考代碼

AOSP 包含兩種 Weaver 參考實作方式:

  • 在 Android 17 以上版本中, system/weaver/ 包含一般安全環境的 Weaver 實作項目。
  • 在 Android 8.1 以上版本中, external/libese/ 包含與 ISO/IEC7816-4 相容的安全元件的 Weaver 實作項目。

測試

如要驗證 Weaver 實作,請使用 VtsHalWeaverTargetTest

atest VtsHalWeaverTargetTest

或:

vts-tradefed run vts -m VtsHalWeaverTargetTest