2、可信开机链基础:Secure Boot 与信任根

好,我们正式开始聊可信开机。这一章是整个课程的基石,说白了,后面所有关于调试接口的安全分析,都建立在你对可信开机链的理解上。我个人习惯把可信开机想象成一场接力赛——每一棒都必须确认上一棒的身份,才能继续跑下去。

2.1 什么是可信开机(Secure Boot)?

Secure Boot,不是指“安全的开机过程”这么简单。它是一套密码学验证机制,确保设备从按下电源键到操作系统启动,每一段执行的代码都是经过签名的、未被篡改的。

我遇到过不少工程师,觉得 Secure Boot 就是检查一下 bootloader 的哈希值。嗯,这只是冰山一角。真正的 Secure Boot 要覆盖整个启动链:

  • Boot ROM —— 芯片出厂固化的第一段代码
  • SPL / 一级 bootloader —— 初始化内存和时钟
  • U-Boot / 二级 bootloader —— 加载内核和设备树
  • 操作系统内核 —— 比如 Linux kernel
  • 关键内核模块 —— 驱动、文件系统等

每一级在加载下一级之前,都要验证其数字签名。只要有一级验证失败,启动就中断。你想想看,如果攻击者能在 bootloader 里植入后门,那整个系统就毫无安全可言了。

核心原则:Secure Boot 不是防物理攻击的,它防的是持久性恶意软件。攻击者无法通过替换启动镜像来获得持久控制权。

2.2 信任根(Root of Trust)

信任根,英文叫 Root of Trust,简称 RoT。它是整个安全体系的起点。为什么叫“根”?因为它是不可伪造、不可篡改的。

在嵌入式系统里,信任根通常由以下几部分组成:

组件 作用 存储位置
不可变 Boot ROM 芯片上电后执行的第一段代码 芯片内部掩膜 ROM
公钥哈希 / 公钥 用于验证 bootloader 签名 一次性可编程存储器(eFuse / OTP)
硬件安全模块 提供安全存储和密码运算 独立安全芯片或 SoC 内部

我个人习惯把信任根比作“不可说谎的证人”。它不会执行任何外部代码,只做一件事:验证。Boot ROM 是芯片出厂时就写死的,你改不了它。公钥存储在 eFuse 里,一旦烧写就无法修改。这就是信任的起点。

注意:如果攻击者能够物理篡改 eFuse 或替换 Boot ROM,那信任根就不存在了。这也是为什么调试接口(如 JTAG)如果不受保护,可以直接绕过信任根——我后面会详细讲。

2.3 信任链的传递机制

信任链,英文叫 Chain of Trust。它的核心思想是:每一级代码在加载下一级之前,先验证下一级的签名。验证通过,信任就传递下去;验证失败,启动终止。

我画了一张图,帮你理解这个流程:

可信开机信任链传递流程 可信开机信任链传递流程 Boot ROM(信任根) 验证 SPL / 一级 bootloader 签名 SPL / 一级 bootloader 验证 U-Boot / 二级 bootloader 签名 U-Boot / 二级 bootloader 验证 Linux 内核签名 关键点 • 每一级验证下一级 • 验证失败即停止 • 信任从 Boot ROM 开始

这个流程看起来简单,但实际落地时有很多细节。我举一个我在项目中踩过的坑:

避坑指南:我曾经在一个 IoT 芯片项目里,SPL 验证 U-Boot 时只检查了哈希值,没检查签名。结果攻击者只要替换了 U-Boot 镜像,同时修改哈希值,就能绕过验证。记住:哈希只能防意外篡改,签名才能防恶意篡改。一定要用非对称签名验证。

2.4 信任链的两种模式

在实际工程中,信任链有两种常见实现模式:

  • 静态信任链(Static Chain of Trust):所有验证都在启动阶段完成,启动后不再验证。优点是性能好,缺点是运行时加载的模块无法被覆盖。
  • 动态信任链(Dynamic Chain of Trust):不仅启动时验证,运行时加载的模块(如内核模块、固件更新)也要验证。安全性更高,但需要额外的运行时验证机制。

我个人建议,只要硬件性能允许,尽量用动态信任链。因为现在很多攻击是在系统运行后注入恶意模块的,静态信任链防不住这种情况。

2.5 信任链的薄弱环节

信任链再强,也有几个常见的薄弱点:

薄弱环节 风险描述 典型攻击方式
Boot ROM 漏洞 Boot ROM 本身存在代码漏洞 利用缓冲区溢出执行任意代码
公钥存储被篡改 eFuse 被物理篡改或未正确烧写 激光切割、电压故障注入
签名验证逻辑缺陷 验证代码存在逻辑错误 绕过验证、降级攻击
调试接口未锁定 JTAG/SWD 在启动后仍可访问 通过调试接口读取内存、修改寄存器

你想想看,如果调试接口在 Secure Boot 完成后还开着,攻击者就能直接读取内存中的密钥,或者修改内核代码。这就是为什么调试接口的安全管理,是可信开机链中不可忽视的一环。

总结一下:可信开机链的核心是“信任根 + 信任链传递”。信任根不可篡改,信任链逐级验证。调试接口如果不受控,就等于在信任链上开了一个后门。后面几章,我会详细拆解调试接口如何影响这个链条。