速率限制

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 实例进行缓存,如果使用另一个实例触发了超时时间,则会错误地显示没有有效超时时间。系统凭据提示(例如锁屏和设置 activity)的开发者必须更新这些提示,以在允许进一步尝试之前验证现有超时时间。

使用 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 年内最多进行 1,800 次猜测。

虽然对于随机均匀选择的 LSKF,此政策相当安全,但在实践中,用户不会随机均匀地选择 LSKF。有些 LSKF 的出现频率远高于其他 LSKF。攻击者可以按频率递减的顺序尝试 LSKF,从而实现较高的成功率。

例如,研究此 PIN 码很容易被猜到发现,在 100 次猜测后,猜对真实 PIN 码的成功率为 16.2%,猜对图案的成功率为 35.5%。如果攻击者知道用户的生日等特定信息,则可以进一步提高成功率。

因此,Android 16 QPR2 及更高版本提供了更强的默认 LSKF 速率限制政策。此政策允许在第 1 分钟内最多尝试 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 24 小时
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 配置值,以强制执行模式配置 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 实现中支持重复猜测检测。