Android 验证启动与自定义 ROM 详解

14次阅读
没有评论

问题描述

在尝试理解 Android 验证启动(Verified Boot)过程及其与自定义 ROM 的关系时,发现现有的文档可能不够清晰或已过时。验证启动的过程涉及多个步骤,包括解锁 bootloader、擦除用户数据以及存储自定义 ROM 的公钥等。

验证启动过程大致如下:

  1. 在刷写之前
  2. bootloader 初始锁定,需要通过 fastboot 命令解锁,并要求用户确认。
  3. 擦除用户数据以防止未经授权的访问(例如设备被盗时窃贼尝试访问私人数据)。
  4. 当操作系统刷写时,在用户设定的信任根中存储自定义 ROM 的公钥。

  5. 启动过程(刷写之后)

  6. 设备开机(物理按钮)。
  7. 内置 BIOS 读取信任根中的公钥(制造商和用户设定的),验证内核镜像未被篡改。
  8. 如果使用用户设定的公钥进行内核完整性检查,则显示 10 秒警告,提示用户当前使用的公钥不是制造商的。
  9. 确认内核完整性后,加载初始 RAM 映像并调用 init 进程。
  10. dm-verity 内核模块通过加密签名检查确保启动过程未被篡改,使用的是公钥。

然而,仍有几个步骤不清楚:
– 为什么即使完整性检查通过,启动过程中仍会显示警告?
– 是否需要解锁状态来设置用户设定的信任根,还是仅用于绕过 Android 验证启动?
– 用户设定的信任根如何处理“篡改证据”功能?用户设定的信任根应由最终用户设置,而不是制造商,但如何确保没有被制造商设置?如果系统被 root,如何确保新操作系统未重置篡改标志?是否使用一次可编程内存?
– dm-verity 内核模块使用哪个公钥进行完整性检查?

解决方案

方案1:详细解释验证启动过程

1. 解锁 bootloader

  • 使用 fastboot 命令解锁 bootloader,并要求用户确认。
  • 注意:解锁 bootloader 可能会导致安全漏洞,确保备份重要数据。

2. 擦除用户数据

  • 擦除用户数据以防止未经授权的访问。
  • 注意:此操作不可逆,请谨慎操作。

3. 存储自定义 ROM 公钥

  • 在刷写操作系统时,在用户设定的信任根中存储自定义 ROM 的公钥。
  • 注意:确保公钥的安全性,防止被篡改。

4. 启动过程

  • 设备开机,内置 BIOS 读取信任根中的公钥。
  • 验证内核镜像未被篡改,使用用户设定的公钥进行检查。
  • 如果使用用户设定的公钥进行检查,则显示 10 秒警告,提示用户当前使用的公钥不是制造商的。
  • 确认内核完整性后,加载初始 RAM 映像并调用 init 进程。
  • dm-verity 内核模块通过加密签名检查确保启动过程未被篡改,使用的是公钥。

方案2:解释警告显示的原因

  • 警告显示的原因是为了提醒用户当前使用的公钥不是制造商的,即使完整性检查通过。
  • 注意:用户设定的信任根应由最终用户设置,确保其安全性。

方案3:处理用户设定的信任根

  • 用户设定的信任根应由最终用户设置,确保其安全性。
  • 使用一次可编程内存或其他安全机制来确保篡改证据功能。
  • 注意:确保信任根的安全性,防止被篡改。

方案4:dm-verity 内核模块使用的公钥

  • dm-verity 内核模块使用刷写操作系统时存储的公钥进行完整性检查。
  • 注意:确保公钥的安全性,防止被篡改。

通过上述解决方案,可以更好地理解和实施 Android 验证启动过程及其与自定义 ROM 的关系。

正文完