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 會同時使用 weaverKey 和 weaverSecret 加密使用者的合成密碼。由於合成密碼會保護使用者的憑證加密 (CE) 儲存空間,以用於檔案加密 (FBE),以及使用者Android Keystore 中的驗證繫結金鑰,因此在 Weaver 發布密碼前,資料仍無法存取。
Weaver 與 Gatekeeper
在過去,Gatekeeper HAL 會在單一 verify() 呼叫中執行兩個不同的角色:
- 驗證:檢查 LSKF,並強制執行 TEE 的速率限制。
- 認證:發出
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