3. 安全启动与验证启动

在Android系统的启动安全体系中,Secure Boot与Verified Boot是两个经常被混用的概念。它们都涉及“启动时验证”,但目标、验证对象、失败后果和信任模型并不相同。理解二者的区别,是掌握Android Verified Boot系统工程的第一道门槛。

一、核心原理:两种“启动验证”的不同使命

Secure Boot(安全启动)的核心目标是只允许运行被授权的软件。它通常由SoC厂商或平台固件实现,验证对象是引导加载程序(Bootloader)、TEE、系统固件等。如果验证失败,设备会拒绝继续启动,甚至直接变砖。Secure Boot强调的是“准入控制”:不信任的代码,根本不允许执行。

Verified Boot(验证启动)的核心目标是保证系统分区的完整性和真实性,并允许设备在可恢复的前提下启动。它验证的是boot、system、vendor、vbmeta等Android分区。验证失败时,设备可能进入恢复模式、显示警告,或根据dm-verity策略降级运行。Verified Boot强调的是“可检测、可恢复、可审计”:即使系统被篡改,也要让用户和上层知道。

一句话区分:Secure Boot决定“能不能启动”,Verified Boot决定“启动的东西是不是原厂的、有没有被改过”。

二、信任根与信任链:从不可变硬件到可变系统

无论是Secure Boot还是Verified Boot,都依赖信任根(Root of Trust, RoT)。信任根是系统中第一个被无条件信任的组件,通常由硬件实现,例如SoC内部的BootROM、eFuse中烧录的公钥哈希、或TEE中的安全存储。

信任链(Chain of Trust)则是从信任根出发,逐级验证下一级组件的过程:

  1. BootROM:芯片上电后执行的第一段代码,不可修改,是信任根。
  2. Primary Bootloader:由BootROM验证其签名,验证通过后执行。
  3. Secondary Bootloader / ABL:由Primary Bootloader验证。
  4. vbmeta:包含各分区哈希和签名,由ABL验证。
  5. boot / system / vendor:由vbmeta中的哈希和签名间接验证。

这条链上任何一环验证失败,信任链即断裂。Secure Boot通常要求链上每一环都必须通过,否则停止启动;Verified Boot则允许在特定条件下继续启动,但会记录状态并提示用户。

Secure Boot 与 Verified Boot 的信任链与验证范围 信任根 → 逐级验证 → Android 分区;Secure Boot 管“准入”,Verified Boot 管“完整性” 信任根 RoT BootROM / eFuse 公钥哈希 / TEE 验证签名 Secure Boot 验证域 Primary Bootloader 签名验证 ABL / SBL 签名验证 失败后果:停止启动 / 变砖 / 进入紧急下载模式 核心思想:准入控制,不信任不执行 验证 vbmeta Verified Boot 验证域(Android 分区) vbmeta 哈希 + 签名清单 boot 内核 + ramdisk system dm-verity vendor dm-verity 失败后果:显示警告 / 进入恢复模式 / 降级启动(取决于设备状态) 核心思想:完整性验证 + 真实性验证,可检测、可恢复、可审计 Secure Boot:硬件信任根 → 固件 → 引导程序 Verified Boot:vbmeta → Android 分区 → 运行时

三、完整性验证与真实性验证:两个不能混淆的目标

完整性验证(Integrity Verification)回答的是:“数据有没有被改动?”它通过哈希算法(如SHA-256)计算分区内容的摘要,并与预期值比对。如果哈希不匹配,说明数据被篡改或损坏。

真实性验证(Authenticity Verification)回答的是:“数据是不是由可信来源签发的?”它通过数字签名实现:厂商用私钥对哈希签名,设备用预置公钥验签。只有签名有效,才能证明数据来自持有私钥的授权方。

对比维度完整性验证真实性验证
核心问题数据是否被改动数据是否来自可信来源
典型算法SHA-256、dm-verity哈希树RSA、ECDSA、AVB签名
依赖密钥不需要密钥,只需预期哈希需要公钥/私钥对
能否防伪造不能,攻击者可同时改哈希能,无私钥无法伪造签名
Android对应dm-verity、vbmeta哈希AVB签名、Bootloader验签

关键理解:完整性验证是“防意外损坏”,真实性验证是“防恶意伪造”。Verified Boot同时使用两者:先用签名验证vbmeta的真实性,再用哈希验证各分区的完整性。

四、方法流程:一次典型Android启动的验证路径

以支持AVB 2.0的设备为例,启动验证流程如下:

1. BootROM 加载并验证 Primary Bootloader 签名
2. Primary Bootloader 验证 ABL 签名
3. ABL 读取 vbmeta 分区,验证其签名(真实性)
4. ABL 解析 vbmeta 中的哈希描述符,计算 boot/system/vendor 哈希(完整性)
5. 若验证通过,设置 verified boot state = green
6. 若验证失败,根据设备状态设置 yellow/orange/red,并决定是否继续启动
7. 内核启动后,dm-verity 对 system/vendor 进行块级完整性校验
8. 运行时通过 AVB 状态接口向上层报告启动可信状态

其中,vbmeta是Verified Boot的“信任枢纽”:它本身由ABL验证签名,同时携带其他分区的哈希和签名信息。这种“签名清单”结构,使得一次验签即可覆盖多个分区,避免逐个分区重复验证。

五、案例与场景:验证失败时会发生什么

假设一台设备被解锁了Bootloader,用户刷入了修改过的boot镜像:

  • Secure Boot层面:如果Bootloader仍处于锁定状态,修改后的boot镜像签名不匹配,ABL会拒绝启动,设备可能进入fastboot或恢复模式。
  • Verified Boot层面:如果Bootloader已解锁,设备会显示“设备已解锁”警告,启动状态变为orange,系统仍可启动,但dm-verity可能被禁用或降级。
  • 完整性验证:如果system分区被篡改但未重新签名,dm-verity会在读取到损坏块时返回I/O错误,导致应用崩溃或系统异常。

常见误区:很多人认为“解锁Bootloader就等于关闭了Verified Boot”。实际上,解锁只是改变了验证失败后的处理策略,验证逻辑本身仍然存在。解锁设备通常会进入orange状态,系统会明确告知用户“当前启动未通过官方验证”。

六、复盘:Secure Boot与Verified Boot的协作关系

Secure Boot和Verified Boot不是替代关系,而是分层协作关系:

  • Secure Boot负责从信任根到Bootloader的“硬信任链”,确保最底层固件不被替换。
  • Verified Boot负责从vbmeta到Android分区的“软信任链”,确保系统镜像的完整性和真实性。
  • 信任根是两者的共同起点,通常由硬件不可变存储保护。
  • 信任链是两者的共同机制,逐级签名验证,任何一环断裂都会影响整体可信度。

在Android Verified Boot系统工程中,理解“完整性验证防损坏、真实性验证防伪造、信任根不可变、信任链逐级传递”这四个核心思想,才能正确设计、调试和评估启动安全策略。Secure Boot管“门禁”,Verified Boot管“体检”,二者结合,才构成Android设备从芯片到系统的完整启动安全防线。