2. 安全启动基础
安全启动(Secure Boot)是一套由硬件信任根逐级验证、逐级传递信任的启动机制。它的核心目标不是“让系统启动得更快”,而是确保设备从上电到操作系统运行之间,每一段被执行的代码都经过密码学验证,未被篡改、未被替换、未被降级。在 Android 设备中,安全启动通常与 Verified Boot、dm-verity、AVB(Android Verified Boot)等机制协同工作,形成一条从 BootROM 到 system 分区的可信链。
一、安全启动的核心原理与信任链
安全启动依赖一个不可变的硬件信任根(Root of Trust, RoT)。在 Android 设备中,这个信任根通常固化在 BootROM 或硬件熔丝中,负责验证第一阶段引导程序(如 Primary Bootloader / SPL)的数字签名。验证通过后,控制权才交给下一阶段;下一阶段再验证再下一阶段,依次类推,直到 boot、dtbo、vbmeta、system、vendor 等分区。
这条链的关键在于“信任传递”:每一级只信任由上一级验证通过的下一级。如果某一级签名不匹配、哈希不一致或版本被回滚,启动流程会拒绝继续,或进入恢复模式、显示警告、甚至触发硬件熔断。Android 的 AVB 还引入了 vbmeta 结构,把多个分区的哈希和签名集中管理,使验证更高效、更易扩展。
二、威胁模型:安全启动到底防什么
安全启动的威胁模型主要针对“启动早期代码被篡改”这一类攻击。攻击者可能通过物理接触、fastboot 刷机、OTA 劫持、恶意固件替换、降级攻击等方式,试图让设备运行未授权代码。安全启动要防的不是所有攻击,而是把信任边界前移到硬件,使攻击者无法轻易绕过验证。
- 未签名代码执行:攻击者替换 boot 分区,植入自定义内核或 rootkit,安全启动会因签名不匹配而拒绝。
- 分区篡改:直接修改 system/vendor 分区内容,dm-verity 与 AVB 会在块级别发现哈希不一致。
- 降级攻击:把系统回滚到存在已知漏洞的旧版本,Rollback Index 会阻止版本号低于当前熔丝值的镜像启动。
- 持久化植入:在引导链中插入恶意阶段,逐级验证会因上一级签名不匹配而中断。
- OTA 中间人:篡改 OTA 包,签名验证与元数据校验会拒绝安装或启动。
三、与普通启动的区别
普通启动的目标是“尽快把系统跑起来”,通常默认信任 Flash 中的内容;安全启动的目标是“只运行被授权的代码”,在每一步增加密码学验证。两者在流程、失败行为、性能开销和可调试性上都有明显差异。
| 对比维度 | 普通启动 | 安全启动 |
|---|---|---|
| 信任假设 | 默认信任 Flash 内容 | 只信任硬件信任根与已验证镜像 |
| 验证方式 | 无签名或哈希校验 | 逐级签名验证 + 哈希校验 |
| 失败行为 | 继续启动或随机崩溃 | 中断启动、警告、恢复模式或熔断 |
| 性能开销 | 较低 | 增加验证时间,但可并行与缓存优化 |
| 可调试性 | 可自由刷机、改内核 | 需解锁或使用签名镜像,调试受限 |
| 典型场景 | 开发板、工程机 | 量产手机、支付终端、车机、IoT |
四、在 Android 中的重要性
Android 生态高度依赖“设备可信”这一前提。支付、DRM、企业 MDM、生物识别、密钥存储等能力,都要求系统在启动时没有被篡改。安全启动是这些能力的底座:只有启动链可信,TEE 才能安全地保存密钥,KeyStore 才能证明应用运行在可信环境,远程证明才能向服务器报告设备完整性。
从 Android 7 开始,Verified Boot 逐步强制化;Android 10 以后,AVB 与 dm-verity 成为量产设备的基本要求。Google 的 CDD/GMS 认证也把安全启动与 Bootloader 锁定列为关键项。对开发者而言,理解安全启动有助于排查“刷机后无法开机”“OTA 失败”“dm-verity 报错”等问题;对安全工程师而言,它是分析启动链攻击面和设计可信执行环境的基础。
fastboot getvar all、avbtool verify_image 与 adb shell dmesg | grep -i verity。
# 查看设备启动状态与验证信息(示例)
fastboot getvar unlocked
fastboot getvar secure
fastboot getvar current-slot
# 校验 vbmeta 与 boot 镜像(主机侧)
avbtool verify_image --image vbmeta.img
avbtool verify_image --image boot.img
# 设备侧查看 dm-verity 状态
adb shell dmesg | grep -i "dm-verity"
adb shell getprop ro.boot.veritymode
总结来看,安全启动是 Android 可信链的起点。它通过硬件信任根、逐级签名验证、回滚保护和只读分区完整性校验,把攻击者挡在启动早期之外。理解其定义、作用、威胁模型与普通启动的差异,是后续学习 AVB、dm-verity、TEE 与远程证明的必要基础。