3、可信启动链原理:信任根(RoT)、信任链传递机制、启动流程中的度量与验证、安全启动与可信启动的区别

在嵌入式系统中,启动过程是系统安全的“第一道闸门”。如果启动链被篡改,攻击者可以在操作系统加载之前注入恶意代码,从而完全控制设备。可信启动链(Trusted Boot Chain)的核心思想是:从硬件信任根出发,逐级度量、验证、传递信任,确保每一级启动组件的完整性和真实性。本章将深入剖析信任根(RoT)的构成、信任链的传递机制、启动流程中的度量与验证方法,并厘清安全启动(Secure Boot)与可信启动(Trusted Boot)的本质区别。

信任根(RoT) 信任链传递 度量与验证 Boot ROM(不可变) 芯片出厂固化,不可修改 eFuse / OTP 存储根密钥、安全配置 安全协处理器 独立执行密码运算 RoT 根密钥 RSA/ECC 公钥哈希 Bootloader 1级 度量 Bootloader 2级 Bootloader 2级 度量 OS Kernel OS Kernel 度量系统服务 系统服务/应用 度量策略执行 度量(Measure) SHA-256/384 哈希计算 验证(Verify) 签名比对/哈希比对 记录(Record) PCR/TCB 日志记录 执行(Execute) 通过则跳转,失败则阻断 硬件不可变基础 逐级度量→验证→传递 任何一级失败→安全阻断

3.1 信任根(RoT)的核心构成与设计原则

核心原理:信任根是整个可信启动链的“锚点”,它是一组在物理上不可篡改或极难篡改的硬件/固件实体。信任根不依赖任何外部软件来建立自身可信性,而是通过芯片制造工艺和硬件隔离机制来保证。在嵌入式系统中,信任根通常由以下四个部分协同构成:

  • Boot ROM:芯片出厂时固化的只读存储器,是CPU复位后执行的第一段代码。Boot ROM不可编程、不可擦除,其代码逻辑在芯片流片前已经过严格审计。
  • eFuse/OTP(一次性可编程存储器):用于存储根密钥的哈希值、安全启动使能位、调试接口锁定位等关键安全配置。eFuse一旦写入不可逆转,从硬件层面防止密钥被覆盖。
  • 安全协处理器(如ARM TrustZone、RISC-V PMP):提供独立的密码运算能力,包括RSA/ECC签名验证、SHA哈希计算、真随机数生成(TRNG)等。安全协处理器与主CPU隔离,即使主CPU被攻破,密钥材料也不会泄露。
  • 根密钥(Root Key):通常为RSA-2048/4096或ECC-256公钥的哈希值,存储在eFuse中。Boot ROM使用该公钥验证第一级Bootloader的签名。
设计原则:信任根必须满足三个基本属性——不可绕过性(CPU复位后强制从Boot ROM执行)、不可篡改性(物理隔离+OTP保护)、最小化原则(信任根代码量越少,攻击面越小)。例如,NXP i.MX8系列将RoT放在SRAM中的Boot ROM,仅约32KB代码,极大降低了被利用的风险。

3.2 信任链传递机制:从RoT到操作系统的逐级认证

操作流程:信任链传递遵循“度量→验证→跳转”的循环模型。每一级启动组件在获得执行权之前,必须由上一级完成完整性度量和签名验证。具体步骤如下:

  1. 阶段0(Boot ROM):CPU复位后,Boot ROM首先读取eFuse中的根密钥哈希,锁定调试接口(如JTAG),然后定位第一级Bootloader(通常存储在片外Flash的固定偏移地址)。
  2. 阶段1(度量与验证):Boot ROM计算第一级Bootloader镜像的SHA-256哈希值,使用根公钥验证镜像的数字签名。验证通过后,将控制权交给Bootloader;失败则进入安全错误处理流程(如死循环、LED告警、进入恢复模式)。
  3. 阶段2(逐级传递):第一级Bootloader(通常为SPL/ATF)继续度量第二级Bootloader(如U-Boot、UEFI),第二级再度量OS Kernel(如Linux内核、RTOS镜像),以此类推。
  4. 阶段3(策略执行):操作系统启动后,可信启动链的“静态信任”结束,转入“动态信任”阶段(如IMA完整性度量架构),对后续加载的驱动、模块、脚本进行运行时度量。
启动阶段 度量者 被度量对象 验证方式 失败处理
阶段0 Boot ROM 一级Bootloader RSA签名验证 进入恢复模式
阶段1 一级Bootloader 二级Bootloader RSA/ECC签名验证 阻断启动
阶段2 二级Bootloader OS Kernel 签名+哈希比对 阻断启动
阶段3 OS Kernel 驱动/模块/脚本 IMA策略度量 拒绝加载/隔离
实战经验:在Zynq UltraScale+ MPSoC平台上,FSBL(First Stage Boot Loader)由Boot ROM验证,然后FSBL验证U-Boot,U-Boot验证ATF(ARM可信固件),ATF验证Linux内核。整个链条中任何一级的签名密钥不匹配,都会导致启动失败。建议在开发阶段使用“开发密钥”,量产阶段切换为“生产密钥”,并确保eFuse中的根密钥哈希与生产密钥严格对应。

3.3 启动流程中的度量与验证:技术细节与实现

核心原理:度量(Measure)是指对启动镜像进行哈希计算,生成唯一的“指纹”;验证(Verify)是将该指纹与预期值或签名中的哈希值进行比对。两者必须配合使用,缺一不可。度量解决“镜像是否被篡改”的问题,验证解决“镜像是否来自可信来源”的问题。

度量与验证的三种典型模式:

  • 哈希比对模式:将镜像的哈希值与存储在eFuse/OTP中的黄金哈希值比对。优点是实现简单、无需密码学协处理器;缺点是更新固件时需要同步更新哈希值,灵活性差。
  • 数字签名模式:使用非对称密码算法(RSA/ECC)验证镜像附带的签名。签名由私钥生成,公钥存储在信任根中。优点是支持安全固件更新(只需用私钥签名新固件);缺点是计算开销较大。
  • 混合模式:先验证签名(确认来源可信),再计算哈希(确认内容完整)。这是当前工业界的主流做法,兼顾安全性与性能。
// 典型可信启动验证伪代码(以ARM Trusted Firmware为例)
void verify_image(uintptr_t img_addr, size_t img_size, 
                  const uint8_t *sig, size_t sig_size) {
    // 1. 计算镜像哈希
    sha256_context_t ctx;
    sha256_init(&ctx);
    sha256_update(&ctx, (uint8_t *)img_addr, img_size);
    sha256_final(&ctx, hash_output);
    
    // 2. 使用根公钥验证签名
    if (rsa_verify(root_pubkey, hash_output, sig, sig_size) != 0) {
        panic("Image signature verification failed!\n");
    }
    
    // 3. 验证通过,记录PCR值(用于远程证明)
    tpm_pcr_extend(0, hash_output);
    
    // 4. 跳转到镜像入口
    ((entry_point_t)img_addr)();
}
常见误区:很多开发者认为“只要验证了签名就万事大吉”,但实际上签名验证只能证明镜像未被篡改且来自可信私钥持有者,无法防止“重放攻击”(攻击者截获旧版本的合法签名镜像并回滚)。因此,必须在镜像中嵌入版本号或单调计数器,并在验证时检查版本是否不低于当前最低允许版本。

3.4 安全启动与可信启动的区别:概念澄清与选型

核心原理:安全启动(Secure Boot)和可信启动(Trusted Boot)经常被混用,但它们在技术内涵和安全目标上有本质区别。安全启动侧重于“验证启动组件的真实性和完整性”,防止未授权代码执行;可信启动则更进一步,不仅验证,还记录整个启动过程的度量值,并支持远程证明(Remote Attestation),让外部实体确认设备处于可信状态。

对比维度 安全启动(Secure Boot) 可信启动(Trusted Boot)
核心目标 阻止未签名/篡改代码运行 建立并记录完整的信任链证据
技术手段 数字签名验证、哈希比对 安全启动 + TPM/PCR度量 + 日志记录
信任根位置 Boot ROM + eFuse密钥 Boot ROM + eFuse + TPM芯片
是否支持远程证明 不支持 支持(通过PCR值签名)
固件更新灵活性 需要私钥签名新固件 同样需要,但可记录更新历史
典型应用 消费电子、IoT设备 金融终端、汽车ECU、军工设备

选型建议:对于成本敏感、安全威胁模型相对简单的产品(如智能家居设备),安全启动通常已足够。但对于需要合规审计、防回滚、远程证明的行业(如车规级ECU、医疗设备、工业控制器),必须采用可信启动方案。值得注意的是,可信启动是安全启动的超集——可信启动必然包含安全启动的验证机制,但额外增加了度量记录和报告能力。

案例拆解:汽车OTA固件更新中的可信启动应用

背景与约束:某Tier 1供应商为车规级域控制器设计OTA更新方案。约束条件:AUTOSAR标准要求、ISO 21434网络安全合规、ECU存储空间仅32MB、启动时间要求小于2秒。

初始现象:早期方案仅使用安全启动,OTA更新后出现部分ECU启动失败,且无法定位是更新包损坏还是攻击行为。

分析过程:通过日志发现,失败ECU的Bootloader版本号低于最低允许版本,属于典型的回滚攻击。由于安全启动不记录度量历史,无法区分“意外回滚”和“恶意回滚”。

解决方案:引入可信启动机制——在Boot ROM中增加版本单调计数器,每次OTA更新后计数器递增;同时将启动度量值扩展到TPM PCR[0-7],并通过安全通道上报给云端管理平台。

结果对比:升级后,回滚攻击被硬件计数器阻断,云端可实时监控每台ECU的启动度量值,异常启动行为在30秒内被识别。代价是启动时间增加了约120ms(TPM扩展操作),但仍在2秒预算内。

复盘经验:安全启动解决“能不能启动”的问题,可信启动解决“启动过程是否可信、可审计”的问题。在车规场景中,后者是刚需。

3.5 常见误区与总结复盘

误区一:信任根必须是一个独立芯片。实际上,信任根可以是SoC内部的一个安全域(如ARM TrustZone + Boot ROM),只要满足物理隔离和不可篡改即可,不一定需要独立TPM芯片。

误区二:可信启动会显著拖慢启动速度。现代硬件密码加速器(如ARM Cryptocell)可以在毫秒级完成RSA-2048签名验证。以i.MX8M Plus为例,完整可信启动链(Boot ROM→SPL→U-Boot→Kernel)仅增加约300ms开销,对于大多数嵌入式场景可以接受。

误区三:启用安全启动后就不需要其他安全措施。可信启动链只保护启动阶段,一旦操作系统运行,仍然需要内存保护、权限隔离、安全通信等纵深防御措施。启动链是安全体系的地基,但不是全部。

误区四:开发阶段和生产阶段使用同一套密钥。这是极其危险的做法。开发密钥一旦泄露,攻击者可以签名恶意固件。必须严格分离开发密钥和生产密钥,并在量产前将生产公钥哈希烧录到eFuse中,同时锁定调试接口。

总结复盘:可信启动链的本质是“以硬件信任根为锚点,通过逐级度量与验证,建立一条从Boot ROM到操作系统的可信传递路径”。安全启动是可信启动的必要条件,但可信启动额外提供了度量记录和远程证明能力。在实际工程中,应根据产品的威胁模型、合规要求和成本预算,合理选择安全启动或可信启动方案,并严格管理密钥生命周期。