Weaver

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

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

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

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

元件

Weaver 由三個元件組成:

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

介面

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

Weaver 的介面包含:

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

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

Android 使用情形

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

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

weaverSecret 只能透過下列方式擷取:

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

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

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 時,如果發生錯誤,所有使用者資料可能會遺失。

參考代碼

Android 開放原始碼計畫 (AOSP) 提供 ISO/IEC7816-4 相容安全元件的 Weaver 實作參考程式碼:external/libese/

測試

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

atest VtsHalWeaverTargetTest

或:

vts-tradefed run vts -m VtsHalWeaverTargetTest