速率限制

Android 会使用用户配置的 屏幕锁定知识因素 (LSKF)(例如 PIN 码、解锁图案和 密码)来保护用户数据,包括凭据加密存储和与身份验证绑定的 Keystore 密钥。LSKF 通常是低熵值(例如 4 位或 6 位 PIN 码),因此需要防范暴力破解攻击。

Android 使用可信执行环境 (TEE) 或安全元件 (SE) 速率限制器来减慢攻击者对 LSKF 执行暴力破解攻击的速度,并在尝试次数足够多的情况下阻止攻击者。CDD 9.11 规定了 LSKF 速率限制器的最低安全要求和建议。与较低的 Android 版本相比,Android 16 QPR2 及更高版本实现了明显更严格的速率限制政策。如需了解详情,请参阅 Android 16 QPR2 及更高版本中更严格的默认速率限制政策

与较低版本相比,Android 17 及更高版本使用更严格的默认屏幕锁定速率限制。在极少数情况下,用户可能会遇到较长的屏幕锁定超时,因此 Android 17 及更高版本在屏幕锁定界面上提供了以下增强的用户反馈。

  • 改进的时间格式: 屏幕锁定界面会使用较大的时间单位显示持续时间为 1 分钟或更长的超时,以提高可读性,例如“请在 30 分钟后重试”,而不是“请在 1800 秒后重试”。
  • 恢复短链接: 屏幕锁定界面会显示一个短链接 (默认链接为 g.co/android/unlock),以帮助用户在其他设备上查找 账号恢复选项。您可以通过 config_lockscreenLockoutShortlink 资源配置此链接。
  • 重复尝试反馈: 在具有 Weaver 实现的设备上,当输入重复的错误猜测时,系统会显示一条唯一的消息。此特定反馈在 Gatekeeper的设备上不可用,因为这些设备不会为错误猜测和其他验证失败提供单独的响应代码。
  • 一致的凭据输入管理: 如果设备使用 PIN 码凭据,屏幕锁定界面会停用 PIN 码输入键盘,类似于密码和解锁图案凭据输入。

LockPatternUtils#getLockoutAttemptDeadline(int) 方法已重命名为 LockPatternUtils#getLockoutEndTime(int),并从系统管理的缓存中提供锁定结束时间。此更新解决了以下问题:这些时间仅按 LockPatternUtils 实例进行缓存,如果使用另一个实例触发了超时,则会错误地显示没有有效超时。屏幕锁定界面和设置活动等系统凭据提示的开发者必须更新这些提示,以验证现有超时,然后才能允许进一步尝试。

使用 LSKF 解锁受保护的用户数据

LockSettingsService 用于管理 LSKF 的存储和验证。用户一次只能有一个有效的 LSKF。分配新的 LSKF 会使之前的 LSKF 无效,并从头开始执行速率限制政策。

TEE 或 SE 中的主要速率限制器(GatekeeperWeaver 之一)会针对 有效的 LSKF 执行速率限制。如果实现可用,LockSettingsService 会优先使用 Weaver。

只有在向主要速率限制器提供正确的 LSKF 时,受保护的用户数据才会解锁。 如果 LSKF 不正确,速率限制器会递增失败计数器,并在达到一定的失败次数后执行超时。在超时期间,它会拒绝所有猜测并提供剩余的超时时间。

Android 16 QPR2 及更高版本中更严格的默认速率限制政策

CDD 9.11 要求在 Android 6 及更高版本中执行 LSKF 速率限制。从历史上看,所需的速率限制政策相当宽松。例如,满足 Android 16 最低要求的实现允许在第一分钟内最多进行 10 次猜测,在 6 分钟内最多进行 20 次猜测,在 25 分钟内最多进行 50 次猜测,在 24 小时内最多进行 110 次猜测,在 5 年内最多进行 1800 次猜测。

虽然此政策对于随机选择的 LSKF 来说相当安全,但在实践中,用户不会随机选择 LSKF。某些 LSKF 的出现频率远高于其他 LSKF。攻击者可以通过按频率降序尝试 LSKF 来获得显著的成功率。

例如,研究 This PIN Can Be Easily Guessed 发现,在猜测 100 次后,猜测真实 PIN 码的成功率为 16.2%,猜测解锁图案的成功率为 35.5%。 如果攻击者知道用户特定信息(例如生日),则可以获得更高的成功率。

因此,Android 16 QPR2 及更高版本提供了更严格的默认 LSKF 速率限制政策。此政策允许在第一分钟内最多进行 6 次猜测,在 6 分钟内最多进行 7 次猜测,在 25 分钟内最多进行 8 次猜测,在 24 小时内最多进行 12 次猜测,在 5 年内最多进行 19 次猜测。在 20 次猜测错误后,不允许再进行猜测。完整的超时时间表如下表所示。在未来的 Android 版本中,此时间表可能会发生变化。

错误猜测次数 错误猜测后的超时时间
0 不适用
1-4 0 秒
5 1 分钟
6 5 分钟
7 15 分钟
8 30 分钟
9 90 分钟
10 4 小时
11 12 小时
12 36 小时
13 4 天
14 13 天
15 41 天
16 123 天
17 1 年
18 3 年
19 9 年
20+ 不允许再进行猜测

更新后的速率限制器

Android 16 QPR2 及更高版本包含更新后的 GatekeeperWeaver 实现,这些实现会执行 表中列出的速率限制政策。

软件速率限制器

Android 16 QPR2 及更高版本包含一个可选的辅助速率限制器 SoftwareRateLimiter. 它在系统服务器中实现,并允许设备在 TEE 或 SE 无法更新时提供更严格的速率限制政策。

通过 config_softwareLskfRateLimiterEnforcing configuration value,以强制执行模式配置 SoftwareRateLimiter。在强制执行模式下,SoftwareRateLimiter 会与主要速率限制器同时应用其速率限制政策。对于给定的错误猜测次数,超时时间是主要速率限制器所需的时间与 SoftwareRateLimiter 所需的时间中较长的时间。 在非强制执行模式下,SoftwareRateLimiter 会将所有验证请求传递给主要速率限制器,而不会应用辅助速率限制政策。

重复猜测检测

为了提高可用性并允许使用更严格的速率限制政策,Android 16 QPR2 及更高版本支持重复猜测检测。启用后,用户多次输入相同的错误 LSKF 不会受到惩罚。

合法用户有时会多次错误地输入相同的错误 LSKF。如果将此计为多次猜测,则会导致不必要的超时。有能力的攻击者不会尝试给定的 LSKF 超过一次。不计算重复猜测的政策可以提高合法用户的 LSKF 输入可用性,而不会让有能力的攻击者更容易猜测 LSKF,从而允许执行更严格的速率限制政策。合法用户甚至不太可能遇到超时,因为用户必须输入 5 个唯一的错误猜测,而不是 5 个错误猜测(包括重复项)。

在搭载 Android 16 QPR2 及更高版本、具有 Weaver 实现且 SoftwareRateLimiter 配置为强制执行模式的设备上,重复猜测会在传递给 Weaver 之前被检测到并拒绝。此类拒绝不会增加错误猜测次数。系统会在内存中跟踪最多 5 个唯一的错误猜测。如果跟踪器已满,则会舍弃最近最少使用的猜测,以便为新猜测腾出空间。在进行最后一次未跟踪的错误猜测 5 分钟后,所有跟踪的猜测都会被舍弃。

Gatekeeper 不会将错误猜测与其他验证失败分开,因此当 Gatekeeper 是主要速率限制器时,SoftwareRateLimiter 不支持重复猜测检测。

Weaver 实现者可以选择在 Weaver 实现中支持重复猜测检测。