2. 安全启动基础

安全启动(Secure Boot)并不是一个单独的功能开关,而是一套从芯片上电那一刻就开始执行的“逐级验证、逐级放行”机制。理解它,关键要抓住三个概念:信任根(Root of Trust, RoT)、信任链(Chain of Trust)以及启动阶段划分。只有把这三者串起来,才能看清安全启动与普通启动的本质差异。

一、信任根:一切验证的起点

信任根是整个安全启动体系中被无条件信任的最小单元。它必须满足两个条件:一是不可篡改,通常固化在芯片 ROM 或一次性可编程(OTP/eFuse)区域;二是可被验证,即它自身携带或能访问一个可信的密钥/哈希基准。常见的信任根形态包括:

  • BootROM 中的固化代码:芯片出厂即固定,负责上电后的第一段执行逻辑。
  • 硬件信任根(HRoT):如 TPM、TEE、安全引擎,提供密钥存储与度量能力。
  • 公钥哈希(PK Hash):烧录在 eFuse 中的根公钥摘要,用于验证第一级引导程序。

信任根一旦被攻破,整条信任链都会失效。因此工程上强调“信任根不可写、不可调试、不可旁路”。

二、信任链:逐级度量与传递

信任链的核心思想是:上一级验证下一级,验证通过才移交执行权。每一级在被加载前,都要先计算其镜像的哈希/签名,并与上一级保存的基准比对。典型链路如下:

BootROM(信任根) → 一级引导 BL1 → 二级引导 BL2 → 安全监控/固件 → 操作系统内核 → 应用/容器

每一级验证通常包含三个动作:度量(Measure)、校验(Verify)、记录/传递(Extend/Pass)。度量产生摘要,校验比对签名或哈希,记录则把结果写入可信寄存器(如 TPM PCR)或传递给下一级,形成可审计的启动证据。

三、启动阶段划分

不同芯片平台阶段命名略有差异,但逻辑上可归纳为四个阶段:

阶段执行主体主要任务验证对象
阶段 0BootROM上电自检、加载 BL1BL1 签名/哈希
阶段 1BL1初始化安全环境、加载 BL2BL2 镜像
阶段 2BL2 / SPL加载固件与安全监控固件、TEE
阶段 3Bootloader / Kernel加载内核与根文件系统内核、dtb、initramfs

阶段划分的意义在于:越早的阶段,信任级别越高,验证越严格;越往后,镜像越大、更新越频繁,验证策略也需兼顾性能与灵活性。

安全启动信任链与启动阶段 信任根 RoT BootROM / eFuse 阶段 0 BL1 验证 阶段 1 BL2 验证 阶段 2 固件 / TEE 阶段 3:Bootloader / Kernel 内核 · dtb · initramfs · 根文件系统 度量 Measure 哈希 / 摘要 校验 Verify 签名 / 公钥比对 记录 Extend PCR / 可信寄存器 失败 Fail 停机 / 回滚 / 告警 通过 Pass 移交执行权 每一级验证通过后,才将执行权交给下一级;失败则终止启动

四、安全启动与普通启动的差异

普通启动只关心“能不能跑起来”,安全启动还要回答“跑的是不是被授权的镜像”。两者的差异可以归纳为下表:

维度普通启动安全启动
信任假设默认镜像可信默认不可信,逐级验证
镜像校验无或仅 CRC签名 + 哈希 + 证书链
密钥管理无根密钥烧录、密钥轮换、吊销
失败处理继续尝试或报错停机、回滚、进入恢复模式
启动耗时短增加验签开销,通常几十到几百毫秒
可审计性弱度量日志、PCR 记录

五、典型场景与常见误区

以嵌入式 Linux 设备为例,安全启动通常这样落地:eFuse 烧录根公钥哈希 → BootROM 验证 BL1 → BL1 验证 BL2 → BL2 验证 U-Boot 与 TEE → U-Boot 验证内核与 dtb → 内核验证根文件系统。任何一级失败,设备都会停在安全恢复模式,而不是继续启动。

常见误区:把“开启 Secure Boot”等同于“系统绝对安全”。实际上,安全启动只保证启动链路的完整性,无法防御运行时的内存攻击、侧信道或已授权镜像中的漏洞。它是一道门,而不是整座城堡。
工程建议:调试阶段可保留“验证失败但继续启动”的宽松模式,量产阶段必须切换为严格模式;同时把度量日志接入远程证明,才能让信任链真正可审计、可追溯。

总结来看,信任根提供起点,信任链提供传递路径,启动阶段划分提供执行顺序,而安全启动与普通启动的差异则体现在“是否验证、验证什么、失败怎么办”。掌握这四点,就掌握了安全启动的骨架。