Weaver

Weaver 硬件抽象层 (HAL) (IWeaver.aidl) 在 Android 8.1 中引入,可为用户身份验证提供安全接口,并使用锁定屏幕知识因素 (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 的接口提供了一个固定大小的持久性 slot 数组,每个 slot 都包含一个固定大小的键和一个固定大小的值。每个 slot 都由其 ID(一个介于 [0, numSlots - 1] 之间的整数)标识。只有在提供与存储的密钥匹配的密钥时,才能访问 slot 的值。

Weaver 的界面主要包含以下内容:

  • getConfig():检索实现支持的 slot 数、键大小和值大小。
  • write():使用新的键值对覆盖指定 slot。此操作是原子性的,会使之前的数据永久无法恢复(安全删除)。
  • read():尝试检索指定 slot 的值。 只有在速率限制超时(由 TA 强制执行)未处于有效状态且提供的密钥与存储的密钥完全匹配时,此操作才会成功。
  • warmUp():在 Android 17 及更高版本中,传达可能很快会发生读取或写入的提示。

如需了解完整的接口规范,请参阅 IWeaver.aidl

Android 使用情况

如果 Weaver 实现可用,Android 系统服务器中的 LockSettingsService 会使用它来保护用户数据。对于设备上的每位用户,LockSettingsService 都会管理一个 Weaver slot:

  • Slot 密钥 (weaverKey):用户 LSKF 的哈希。如果用户未设置屏幕锁定,则使用默认字符串。
  • slot 值 (weaverSecret):高熵、随机生成的加密 Secret。

weaverSecret 旨在仅通过以下任一方式进行检索:

  • 在 Weaver TA 的速率限制政策内提供正确的 weaverKey
  • 入侵运行 Weaver TA 的安全环境。这道题的难度非常大。

LockSettingsService 同时使用 weaverKeyweaverSecret 来加密用户的合成密码。由于合成密码可保护用户用于文件级加密 (FBE) 的凭据加密 (CE) 存储空间以及用户在 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
安全删除 需要安全删除,并且很容易实现,因为该接口使用固定数量的固定大小的 slot。 不需要安全删除,但由于该接口支持无限数量的注册,因此很难实现安全删除。
硬件 针对 SE 进行了优化,但也可在 TEE 中运行。 实际上仅限 TEE。在 SE 中实现它并不能带来安全性方面的优势。
错误处理 更清晰的错误代码。 不明确的错误代码。因此,锁屏界面无法区分错误的 LSKF 和不相关的故障。
原子性 LockSettingsService 中使用 Weaver 的代码以原子方式执行 LSKF 更改。新数据会写入新的 Weaver slot,只有在安全的情况下才会擦除旧 slot。 LockSettingsService 中使用 Gatekeeper 的代码不会以原子方式执行 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