问题描述
在尝试理解 Android 验证启动(Verified Boot)过程及其与自定义 ROM 的关系时,发现现有的文档可能不够清晰或已过时。验证启动的过程涉及多个步骤,包括解锁 bootloader、擦除用户数据以及存储自定义 ROM 的公钥等。
验证启动过程大致如下:
- 在刷写之前:
- bootloader 初始锁定,需要通过 fastboot 命令解锁,并要求用户确认。
- 擦除用户数据以防止未经授权的访问(例如设备被盗时窃贼尝试访问私人数据)。
当操作系统刷写时,在用户设定的信任根中存储自定义 ROM 的公钥。
启动过程(刷写之后):
- 设备开机(物理按钮)。
- 内置 BIOS 读取信任根中的公钥(制造商和用户设定的),验证内核镜像未被篡改。
- 如果使用用户设定的公钥进行内核完整性检查,则显示 10 秒警告,提示用户当前使用的公钥不是制造商的。
- 确认内核完整性后,加载初始 RAM 映像并调用 init 进程。
- 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 的关系。
正文完