3、信任根与信任链:什么是信任根(RoT)、信任链的建立过程,以及从BootROM到应用层的信任传递机制

在Secure Boot的体系架构中,信任不是凭空产生的,而是从一个绝对可信的起点开始,通过逐级验证、逐级授权的方式,将信任范围像链条一样延伸至整个系统。这个起点被称为信任根(Root of Trust, RoT),而信任延伸的路径则被称为信任链(Chain of Trust)。理解信任根与信任链,是设计安全启动方案、分析启动故障、评估系统抗攻击能力的基础。本章将从信任根的定义与形态出发,详细拆解信任链的建立过程,并深入分析从BootROM到应用层的完整信任传递机制。

信任根 (RoT) BootROM eFuse / OTP RoT公钥哈希 物理不可变 · 出厂烧录 一级引导 SPL / U-Boot SPL 验证BL1签名 加载到SRAM RoT公钥验证 二级引导 U-Boot / BL2 验证BL2签名 初始化DDR 一级引导公钥验证 内核/应用 Kernel / OS 验证内核签名 dm-verity 二级引导公钥验证 信任边界 1 信任边界 2 信任边界 3 信任边界 4 攻击面与防护要点 • 物理攻击:eFuse/OTP 防篡改、防侧信道 • 回滚攻击:版本号单调递增计数器(RPMB / TBBR) • 签名绕过:强制校验、禁止未签名 fallback • 调试接口:JTAG/SWD 熔丝禁用、串口鉴权 • 密钥泄露:HSM 保护、密钥分级、吊销机制 • 启动介质替换:RoT 公钥哈希锁定,防伪造介质

3.1 信任根(RoT)的核心原理与形态

3.1.1 信任根的定义与本质

信任根是系统中无条件可信的最小集合,它不依赖任何外部实体来验证自身的可信性。在Secure Boot体系中,信任根通常固化在芯片内部的BootROM(只读存储器)中,以及一次性可编程存储器(eFuse/OTP)内。BootROM是芯片出厂时由硅片厂商写入的不可修改代码,它构成了整个信任链的第一环。信任根的本质在于:它必须物理不可变、逻辑不可绕过、内容不可篡改。任何试图修改BootROM的行为都意味着物理破坏芯片,这在绝大多数攻击场景中是不现实的。

3.1.2 信任根的组成要素

一个完整的信任根通常包含以下三个核心要素:

  • 不可变代码:BootROM中的启动代码,负责最基础的硬件初始化和引导加载。
  • 根密钥材料:存储在eFuse/OTP中的RoT公钥哈希(或公钥本身),用于验证第一级引导程序的签名。
  • 安全状态寄存器:记录芯片的安全状态(如是否已锁定调试接口、是否已启用安全启动),这些寄存器只能被BootROM写入,且一旦写入不可逆。
信任根组件存储介质不可变性作用
BootROM代码Mask ROM物理不可变执行初始引导、验证一级引导程序
RoT公钥哈希eFuse/OTP一次性烧写,不可回退锁定信任根公钥,防止密钥替换
安全配置位eFuse/OTP熔断后不可恢复禁用调试接口、强制安全启动
版本号计数器eFuse/RPMB单调递增防止固件回滚攻击

3.1.3 信任根的判断方法

在实际嵌入式项目中,判断一个系统是否具备合格的信任根,可以从以下维度进行验证:

  1. 代码不可改性验证:检查BootROM是否位于Mask ROM中,能否通过任何软件手段修改。
  2. 密钥存储安全性:确认RoT公钥哈希是否存储在eFuse中,且烧写后无法通过JTAG/SWD等调试接口读取。
  3. 启动路径唯一性:确保芯片不存在未经验证的备用启动路径(如UART下载模式、USB烧录模式),这些路径必须在量产前被熔断禁用。
  4. 安全状态锁定:检查安全启动使能位是否已熔断,调试接口是否已永久关闭。
风险提示:部分低成本芯片将RoT公钥存储在外部SPI Flash中,这实际上将信任根暴露在可物理替换的攻击面之下。攻击者可以更换Flash芯片,植入自制的公钥和签名固件,从而完全绕过安全启动。因此,信任根必须位于芯片内部且物理不可变,这是不可妥协的安全底线。

3.2 信任链的建立过程

3.2.1 信任链的逐级验证模型

信任链的建立遵循逐级验证、逐级授权的原则。每一级引导程序在获得执行权之前,必须由上一级完成对其完整性和真实性的验证。验证通过后,当前级才将控制权移交给下一级,同时传递信任。这个过程可以形式化地表示为:

信任根(BootROM) --验证--> 一级引导(SPL) --验证--> 二级引导(U-Boot) --验证--> 内核 --验证--> 应用

每一级验证都包含两个关键步骤:完整性校验(确保镜像未被篡改)和真实性校验(确保镜像来自合法发布者)。完整性通常通过哈希算法(如SHA-256)实现,真实性则通过非对称签名算法(如RSA-2048/ECC-256)实现。

3.2.2 信任链建立的操作流程

以典型的ARM Cortex-A系列嵌入式平台为例,信任链的建立过程如下:

  1. BootROM阶段:芯片上电后,BootROM首先初始化时钟、SRAM和基本外设,然后从eFuse中读取RoT公钥哈希,并从固定地址(如BootROM映射的SPI Flash起始地址)读取一级引导程序(SPL)及其签名。
  2. 一级验证:BootROM使用RoT公钥对SPL的签名进行验签,同时计算SPL的哈希值并与签名中的哈希比对。验证通过后,将SPL加载到SRAM并跳转执行。
  3. 二级引导阶段:SPL初始化DDR控制器,将U-Boot(BL2)从Flash加载到DDR中,并使用SPL内置的公钥(该公钥由RoT公钥签名,形成密钥链)验证U-Boot的签名。
  4. 内核加载阶段:U-Boot验证内核镜像(如zImage/Image)的签名,验证通过后将内核加载到内存并跳转。
  5. 应用层验证:内核启动后,通过dm-verity、IMA(完整性度量架构)或文件系统签名验证机制,确保根文件系统和关键应用的完整性。

3.2.3 信任链的密钥体系

信任链的强度依赖于密钥的层级管理。常见的密钥体系包括:

密钥层级用途存储位置签名关系
RoT私钥签名一级引导程序HSM/离线安全环境对应eFuse中的公钥哈希
一级引导私钥签名二级引导程序HSM/离线安全环境由RoT私钥签名
二级引导私钥签名内核构建服务器HSM由一级引导私钥签名
内核私钥签名内核模块/驱动构建服务器HSM由二级引导私钥签名
经验之谈:在实际项目中,建议将RoT私钥与一级引导私钥分开管理。RoT私钥仅在芯片出厂或极少数安全更新时使用,平时应离线保存在硬件安全模块(HSM)中。一级引导私钥可以用于常规的固件更新签名。这种分离可以降低RoT私钥泄露的风险,同时保证日常更新的灵活性。

3.3 从BootROM到应用层的信任传递机制

3.3.1 信任传递的完整链路

信任传递并非简单的“验证一次就完事”,而是一个贯穿整个启动过程、持续到应用运行时的动态机制。完整的信任传递链路包括:

  • 启动时静态信任传递:从BootROM到内核的逐级签名验证,确保启动镜像的完整性和真实性。
  • 运行时动态信任传递:内核启动后,通过安全启动扩展(如UEFI Secure Boot、Linux IMA)对后续加载的驱动、模块、脚本进行验证。
  • 应用层信任维持:通过文件系统完整性校验(dm-verity)、强制访问控制(SELinux/AppArmor)以及代码签名机制,维持应用运行时的可信状态。

3.3.2 信任传递中的关键机制

在信任传递过程中,有几个关键机制决定了整个链条的安全性:

  1. 密钥轮换与吊销:当某一级私钥泄露时,需要能够吊销该密钥并轮换新密钥。这通常通过版本号计数器或证书吊销列表(CRL)实现。
  2. 防回滚机制:攻击者可能尝试使用旧版本的固件(包含已知漏洞)来降级系统。防回滚通过单调递增的版本号计数器实现,每次固件更新时版本号必须递增,BootROM和各级引导程序会检查版本号是否低于当前值。
  3. 测量启动(Measured Boot):与Secure Boot的“验证后执行”不同,Measured Boot将每个阶段的哈希值记录在TPM(可信平台模块)的PCR(平台配置寄存器)中,系统启动后可以远程证明这些测量值,从而让外部实体确认系统运行在预期的可信状态。

3.3.3 案例拆解:基于i.MX8M Plus的信任链部署

下面以一个典型的工业物联网网关项目为例,说明信任链从BootROM到应用层的完整部署过程。

项目背景与约束:该网关基于NXP i.MX8M Plus处理器,需要满足IEC 62443-4-2安全等级要求,防止固件被篡改、防止非法固件升级、防止调试接口被滥用。系统使用Yocto构建Linux发行版,采用U-Boot作为引导加载程序。

初始状态与目标:设备出厂时,BootROM已由NXP烧录,eFuse中烧写了RoT公钥哈希(SHA-256)。项目目标是在此基础上建立完整的信任链,并确保应用层的关键服务(如MQTT Broker、OTA客户端)也纳入信任体系。

实施步骤:

  1. 生成密钥对:在离线HSM中生成RoT密钥对(RSA-4096)、一级引导密钥对(RSA-3072)、二级引导密钥对(RSA-3072)和内核密钥对(RSA-2048)。
  2. 烧写eFuse:将RoT公钥的SHA-256哈希烧写到eFuse中,同时熔断JTAG调试接口和串行下载模式。
  3. 签名SPL:使用RoT私钥对SPL镜像签名,生成包含签名的SPL镜像。
  4. 签名U-Boot:使用一级引导私钥对U-Boot镜像签名,并将一级引导公钥嵌入SPL中。
  5. 签名内核:使用二级引导私钥对内核镜像签名,并将二级引导公钥嵌入U-Boot中。
  6. 配置dm-verity:在内核中启用dm-verity,对根文件系统进行哈希树校验,防止文件系统被篡改。
  7. 应用层签名:对关键应用(如OTA客户端)进行代码签名,内核通过IMA在应用启动时验证签名。

验证结果:经过上述部署后,攻击者即使物理接触设备,也无法通过替换SPI Flash中的固件来植入恶意代码,因为BootROM会验证SPL签名。同时,由于JTAG已被熔断,攻击者无法通过调试接口读取内存或篡改运行状态。在OTA升级测试中,使用未签名的固件包进行升级,被U-Boot正确拒绝,并记录安全日志。

风险与代价:该方案的代价是密钥管理复杂度较高,且一旦RoT私钥丢失,将无法进行任何固件更新(需要更换芯片)。此外,每次固件更新都需要在HSM中完成签名,增加了构建流程的复杂度。

经验总结:在部署信任链时,建议先在一台开发板上完成全流程验证,再批量烧写eFuse。同时,务必在量产前确认eFuse烧写策略,因为eFuse一旦熔断不可恢复。建议保留至少一个未熔断的样机用于后续调试和密钥轮换测试。

3.4 常见误区与总结复盘

3.4.1 常见误区

  • 误区一:信任根可以放在外部存储中。部分开发者为了节省成本,将RoT公钥放在外部SPI Flash中,这等于将信任根暴露在物理攻击之下。
  • 误区二:只验证启动镜像,不验证运行时。Secure Boot只保证启动过程的信任,但内核启动后加载的驱动、模块和脚本同样可能被篡改,必须配合IMA、dm-verity等运行时验证机制。
  • 误区三:忽略防回滚机制。如果没有版本号计数器,攻击者可以降级到存在已知漏洞的旧版本固件,从而绕过安全启动。
  • 误区四:调试接口未关闭。即使Secure Boot正常工作,如果JTAG/SWD接口仍然开放,攻击者可以通过调试接口直接读写内存、修改寄存器,完全绕过信任链。
  • 误区五:密钥管理不当。将RoT私钥存储在开发者的电脑上,或使用弱密码保护HSM,都会导致信任根被攻破。

3.4.2 总结复盘

信任根与信任链是Secure Boot的基石。信任根必须物理不可变、逻辑不可绕过,而信任链的每一环都必须严格验证下一环的完整性和真实性。从BootROM到应用层的信任传递,不仅包括启动时的静态验证,还包括运行时的动态验证和持续监控。在实际部署中,需要综合考虑密钥管理、防回滚、调试接口关闭、运行时验证等多个维度,才能构建真正可信的嵌入式系统。

核心要点回顾:
  • 信任根 = BootROM + eFuse/OTP中的RoT公钥哈希 + 安全状态寄存器。
  • 信任链 = 逐级签名验证,每一级验证通过后才移交控制权。
  • 信任传递 = 静态验证(启动时)+ 动态验证(运行时)+ 持续监控(应用层)。
  • 安全底线 = 信任根不可变、调试接口关闭、防回滚启用、密钥离线管理。