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)中实现。

组件

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():检索实现支持的槽数、键大小和值大小。
  • write():使用新的键值对覆盖指定槽。此操作是原子性的,会使之前的数据永久无法恢复(安全删除)。
  • read():尝试检索指定 slot 的值。 只有在速率限制超时(由 TA 强制执行)未处于有效状态且提供的密钥与存储的密钥完全匹配时,此操作才会成功。

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

Android 使用情况

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

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

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

  • 在 Weaver TA 的速率限制政策内提供正确的 weaverKey
  • 入侵运行 Weaver TA 的安全环境。此关卡旨在打造极具挑战性的体验。

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

参考代码

AOSP 中提供了 ISO/IEC7816-4 兼容安全元素中 Weaver 实现的参考代码:external/libese/

测试

如需验证 Weaver 实现,请使用 VtsHalWeaverTargetTest

atest VtsHalWeaverTargetTest

或者:

vts-tradefed run vts -m VtsHalWeaverTargetTest