2. 安全启动基础
安全启动(Secure Boot)并不是一个单独的功能开关,而是一套从芯片上电那一刻就开始执行的“逐级验证、逐级放行”机制。理解它,关键要抓住三个概念:信任根(Root of Trust, RoT)、信任链(Chain of Trust)以及启动阶段划分。只有把这三者串起来,才能看清安全启动与普通启动的本质差异。
一、信任根:一切验证的起点
信任根是整个安全启动体系中被无条件信任的最小单元。它必须满足两个条件:一是不可篡改,通常固化在芯片 ROM 或一次性可编程(OTP/eFuse)区域;二是可被验证,即它自身携带或能访问一个可信的密钥/哈希基准。常见的信任根形态包括:
- BootROM 中的固化代码:芯片出厂即固定,负责上电后的第一段执行逻辑。
- 硬件信任根(HRoT):如 TPM、TEE、安全引擎,提供密钥存储与度量能力。
- 公钥哈希(PK Hash):烧录在 eFuse 中的根公钥摘要,用于验证第一级引导程序。
信任根一旦被攻破,整条信任链都会失效。因此工程上强调“信任根不可写、不可调试、不可旁路”。
二、信任链:逐级度量与传递
信任链的核心思想是:上一级验证下一级,验证通过才移交执行权。每一级在被加载前,都要先计算其镜像的哈希/签名,并与上一级保存的基准比对。典型链路如下:
每一级验证通常包含三个动作:度量(Measure)、校验(Verify)、记录/传递(Extend/Pass)。度量产生摘要,校验比对签名或哈希,记录则把结果写入可信寄存器(如 TPM PCR)或传递给下一级,形成可审计的启动证据。
三、启动阶段划分
不同芯片平台阶段命名略有差异,但逻辑上可归纳为四个阶段:
| 阶段 | 执行主体 | 主要任务 | 验证对象 |
|---|---|---|---|
| 阶段 0 | BootROM | 上电自检、加载 BL1 | BL1 签名/哈希 |
| 阶段 1 | BL1 | 初始化安全环境、加载 BL2 | BL2 镜像 |
| 阶段 2 | BL2 / SPL | 加载固件与安全监控 | 固件、TEE |
| 阶段 3 | Bootloader / Kernel | 加载内核与根文件系统 | 内核、dtb、initramfs |
阶段划分的意义在于:越早的阶段,信任级别越高,验证越严格;越往后,镜像越大、更新越频繁,验证策略也需兼顾性能与灵活性。
四、安全启动与普通启动的差异
普通启动只关心“能不能跑起来”,安全启动还要回答“跑的是不是被授权的镜像”。两者的差异可以归纳为下表:
| 维度 | 普通启动 | 安全启动 |
|---|---|---|
| 信任假设 | 默认镜像可信 | 默认不可信,逐级验证 |
| 镜像校验 | 无或仅 CRC | 签名 + 哈希 + 证书链 |
| 密钥管理 | 无 | 根密钥烧录、密钥轮换、吊销 |
| 失败处理 | 继续尝试或报错 | 停机、回滚、进入恢复模式 |
| 启动耗时 | 短 | 增加验签开销,通常几十到几百毫秒 |
| 可审计性 | 弱 | 度量日志、PCR 记录 |
五、典型场景与常见误区
以嵌入式 Linux 设备为例,安全启动通常这样落地:eFuse 烧录根公钥哈希 → BootROM 验证 BL1 → BL1 验证 BL2 → BL2 验证 U-Boot 与 TEE → U-Boot 验证内核与 dtb → 内核验证根文件系统。任何一级失败,设备都会停在安全恢复模式,而不是继续启动。
总结来看,信任根提供起点,信任链提供传递路径,启动阶段划分提供执行顺序,而安全启动与普通启动的差异则体现在“是否验证、验证什么、失败怎么办”。掌握这四点,就掌握了安全启动的骨架。