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 同时使用 weaverKey 和 weaverSecret 来加密用户的合成密码。由于合成密码可保护用户基于文件的加密 (FBE) 的凭据加密 (CE) 存储空间和用户 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 |
|---|---|---|
| 安全删除 | 需要安全删除,并且由于接口使用固定数量的固定大小的 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