2. 安全启动基础
安全启动不是某一个单独的功能,而是一套从芯片上电第一刻就开始执行的信任建立机制。它的核心目标只有一个:确保设备运行的每一级固件都经过授权且未被篡改。要理解 BootROM 到 Bootloader 的信任链工程,必须先掌握四个基础概念——信任根、信任链、度量与验证,以及支撑它们落地的安全启动标准。
一、信任根:一切信任的起点
信任根(Root of Trust, RoT)是整个安全启动体系中不可被篡改、必须无条件被信任的最小基元。它通常由硬件实现,因为软件可以被替换,而硬件在流片后其逻辑就固定了。信任根一般包含三个部分:
- 可信根存储(RTS):存放不可更改的密钥或哈希,例如熔丝(eFuse)中烧录的公钥哈希、OTP 区域中的根密钥。
- 可信根度量(RTM):负责对下一级固件计算哈希,是度量链的起点。
- 可信根验证(RTV):使用 RTS 中的密钥或哈希对度量结果进行校验,决定是否放行。
在典型的 SoC 中,BootROM 就是信任根的执行载体。它固化在芯片内部 ROM 中,上电后首先运行,负责验证第一级可引导固件(通常是 BL1 或 SPL)。如果 BootROM 本身可被改写,整个信任链就失去了根基,因此它必须只读、不可绕过。
二、信任链:逐级传递的信任
信任链(Chain of Trust, CoT)是把信任根的单点信任,逐级传递到后续每一级固件的过程。其基本逻辑是:上一级验证下一级的完整性与真实性,验证通过后把控制权交给下一级,同时下一级继续验证再下一级。这样形成一条从 BootROM 到 Bootloader、再到操作系统内核的完整链条。
信任链有两种常见形态:
- 验证式信任链:每一级在加载下一级之前先验证签名或哈希,验证失败则停止启动。这是安全启动最常用的模式。
- 度量式信任链:每一级把下一级的度量值记录到受保护的寄存器或 TPM 中,启动后再由远端或本地策略判断是否可信。度量不阻断启动,但会留下证据。
实际工程中,两者经常结合使用:先验证再度量,既保证启动安全,又保留可审计的度量日志。
三、度量与验证:两种互补的安全手段
度量(Measurement)和验证(Verification)经常被混为一谈,但它们在安全启动中承担不同职责。
| 维度 | 度量 Measurement | 验证 Verification |
|---|---|---|
| 核心动作 | 计算固件的哈希值并记录 | 用公钥或哈希比对判断是否可信 |
| 是否阻断启动 | 通常不阻断,只留证据 | 失败即阻断,拒绝交出控制权 |
| 典型实现 | TPM PCR、TEE 度量寄存器 | RSA/ECDSA 签名校验、哈希比对 |
| 主要用途 | 远程证明、审计、合规 | 安全启动、防篡改 |
| 失败后果 | 记录异常,供策略判断 | 停止启动或进入恢复流程 |
度量解决的是“我能不能证明自己运行了什么”,验证解决的是“我能不能阻止未授权代码运行”。在 BootROM 到 Bootloader 的信任链中,验证是主线,度量是旁路证据链。两者结合,才能同时满足安全启动和远程证明的需求。
四、安全启动标准:让信任链有章可循
不同芯片、不同操作系统对安全启动的实现方式差异很大,因此业界形成了一系列标准来统一信任链模型、镜像格式和验证策略。工程中最常接触的有以下几类:
- UEFI Secure Boot:定义基于 PK、KEK、db、dbx 的密钥层级和镜像签名验证流程,广泛用于 PC 和服务器。
- TCG(Trusted Computing Group):定义 TPM、CRTM、PCR 度量模型和远程证明接口,是度量式信任链的事实标准。
- ARM TBBR(Trusted Board Boot Requirements):ARM 平台安全启动的规范,定义 BL1、BL2、BL31、BL33 等阶段的信任链和镜像认证方式。
- NIST SP 800-193:面向平台固件弹性的指南,强调固件恢复、保护和检测能力。
五、常见误区与复盘
理解概念之后,还要避开工程中反复出现的误区:
- 把“签名校验”等同于“安全启动”:只校验镜像签名,却不保护验证公钥,攻击者可以替换公钥后重新签名。
- 信任根可写:把根公钥放在可修改的 Flash 中,等于没有信任根。
- 只做度量不做验证:度量日志再完整,也无法阻止恶意固件运行。
- 忽略回滚保护:攻击者用旧版本有漏洞但签名合法的固件替换新版本,版本号必须参与验证。
- 调试口未关闭:JTAG 或 UART 下载模式可绕过整条信任链,量产设备必须关闭或鉴权。
# 典型 FIT 镜像签名验证配置片段
[images]
kernel {
signature {
algo = "sha256,rsa2048";
key-name-hint = "dev-key";
sign-images = "kernel";
};
};
# 验证命令示例
mkimage -F -k keys -r image.its image.itb
fit_check_sign -f image.itb -k keys
复盘时可以问三个问题:信任根是否真正不可篡改?每一级是否在交出控制权之前完成了验证?度量值是否被安全记录并可用于后续证明?这三个问题答清楚了,安全启动的基础才算打牢。