2. 安全启动基础

安全启动(Secure Boot)并不是一个单一功能,而是一套贯穿芯片上电到操作系统运行的完整性验证机制。它的核心目标可以概括为一句话:确保设备每一次启动所执行的代码,都是经过授权且未被篡改的。在 TrustZone 安全启动与信任根工程中,理解安全启动的定义、威胁模型、启动链以及信任根分类,是后续所有工程实践的理论地基。

一、安全启动的定义与本质

安全启动是指设备从上电复位开始,按照预定义的顺序逐级加载并验证下一阶段镜像的完整性与真实性,只有验证通过才将控制权移交。它依赖密码学手段,通常使用非对称签名(如 RSA、ECDSA)或哈希校验,把“信任”从不可变的硬件锚点逐级传递到可变的应用层。

安全启动的本质是信任传递:硬件信任根不可篡改,它验证第一段固件;第一段固件验证第二段;第二段验证第三段……形成一条可验证的信任链。任何一级验证失败,启动流程即被中止或进入恢复模式,从而阻止恶意代码获得执行权。

安全启动解决的是“启动阶段代码是否可信”的问题,而不是“运行阶段行为是否安全”的问题。运行时的安全需要依赖 TrustZone、TEE、访问控制等机制协同完成。

二、威胁模型:安全启动要防住谁

设计安全启动之前,必须先明确威胁模型。常见攻击者能力与攻击面包括:

  • 镜像篡改:攻击者替换 Flash 中的 bootloader 或内核,植入后门。
  • 回滚攻击:将已修复的旧版本固件刷回,利用已知漏洞。
  • 降级与重放:复用旧签名镜像或旧认证令牌绕过校验。
  • 调试接口滥用:通过 JTAG/SWD 读取或修改启动代码。
  • 故障注入:电压毛刺、时钟毛刺跳过签名校验分支。
  • 供应链替换:在制造或物流环节替换未签名固件。

对应的安全目标包括:完整性、真实性、不可否认性、抗回滚、抗降级以及调试接口的可控关闭。威胁模型决定了信任根应放在哪里、使用何种算法、是否需要熔丝(eFuse)和一次性可编程存储。

三、启动链概念:从复位向量到操作系统

典型的安全启动链按阶段划分,每一阶段只信任上一阶段的验证结果。下图展示了从硬件信任根到应用系统的逐级验证关系,以及各阶段的关键对象与验证动作。

安全启动信任链:逐级验证与信任传递 硬件信任根 BootROM + eFuse 公钥哈希 / 不可改 一级引导 BL1 签名校验 / 解密 建立 SRAM 运行环境 二级引导 BL2 加载 BL31 / BL32 初始化 DDR / 时钟 安全监控 BL31 EL3 运行时 / PSCI TrustZone 切换 安全 OS / TEE OP-TEE / Trusty 可信应用 TA Bootloader U-Boot / UEFI 验证内核镜像 操作系统内核 Linux / Android dm-verity / AVB 验证失败 中止启动 / 恢复模式 记录安全事件 信任传递方向 校验失败路径 安全世界组件 非安全世界组件

启动链的每一级都包含三个关键动作:加载(从存储介质读取镜像)、验证(用上一级提供的公钥或哈希校验签名)、移交(验证通过后跳转执行)。在 ARM TrustZone 架构中,BL1 通常运行在 EL3,负责建立最初的异常级别环境;BL2 负责加载 BL31、BL32 和 BL33;BL31 作为安全监控器常驻 EL3,负责安全与非安全世界的切换。

四、信任根的基本分类与工程意义

信任根(Root of Trust, RoT)是整条信任链的起点,必须不可篡改、可验证且物理可信。按功能可划分为三类:

类型 英文 典型实现 工程意义
信任根测量 RoT for Measurement (RTM) BootROM 计算镜像哈希并扩展至 PCR 提供可审计的启动度量,支持远程证明
信任根验证 RoT for Verification (RTV) BootROM 内置公钥哈希,验证 BL1 签名 强制启动前校验,阻止未授权镜像执行
信任根报告 RoT for Reporting (RTR) 由 TEE 或安全硬件签名输出度量报告 向外部证明设备启动状态可信

工程上,信任根通常由 BootROM 代码和 eFuse 中的公钥哈希共同构成。BootROM 在芯片流片时固化,不可修改;eFuse 在产线烧录后不可逆。二者结合,形成“代码不可改 + 密钥不可换”的双重锚点。若信任根被攻破,整条信任链将失去意义,因此信任根的设计必须遵循最小化、可审计、抗物理攻击的原则。

在 ARM 平台上,BL1 的签名公钥哈希通常烧录在 OTP/eFuse 中,BootROM 只信任该哈希对应的公钥。即使攻击者替换了 Flash 中的 BL1 镜像,也无法通过 BootROM 的签名校验。

五、案例与场景:一次典型的启动验证

以某 ARM Cortex-A 平台为例,启动流程如下:

上电复位
  → BootROM 读取 eFuse 中的 BL1 公钥哈希
  → 从 Flash 加载 BL1 镜像与签名
  → 用公钥哈希验证公钥,再用公钥验证 BL1 签名
  → 校验通过,跳转 BL1
  → BL1 初始化 SRAM,加载 BL2 并验证
  → BL2 初始化 DDR,加载 BL31/BL32/BL33 并逐一验证
  → BL31 常驻 EL3,BL32 运行 TEE,BL33 运行 U-Boot
  → U-Boot 验证内核与 dtb,启动 Linux
  → Linux 通过 dm-verity 验证根文件系统

若任一环节签名不匹配,启动流程会进入错误处理分支:记录安全事件、点亮告警、进入恢复模式或直接挂起。工程实践中,还需要考虑抗回滚:在镜像元数据中加入单调递增的版本号,并与 eFuse 中的计数器比较,防止攻击者刷回旧版本。

六、常见误区与复盘

  • 误区一:安全启动等于安全运行。安全启动只保证启动阶段代码可信,运行阶段仍需 TrustZone、SELinux、访问控制等机制配合。
  • 误区二:信任根可以放在 Flash 中。Flash 可被替换或重写,信任根必须位于芯片内部不可改区域,如 BootROM + eFuse。
  • 误区三:只做签名不做回滚保护。旧版本固件可能包含已知漏洞,必须结合版本计数器实现抗回滚。
  • 误区四:忽略调试接口。未关闭的 JTAG/SWD 可绕过全部校验,量产设备必须通过 eFuse 永久关闭调试或设置认证调试。
安全启动的强度取决于最弱一环。若信任根公钥哈希未烧录、调试接口未关闭、或回滚计数器未启用,攻击者仍可绕过验证。工程落地时应对照威胁模型逐项检查,而不是只实现签名校验。

总结来看,安全启动是一套以信任根为锚点、以启动链为路径、以密码学验证为手段的完整性保障体系。理解其定义、威胁模型、启动链与信任根分类,是后续在 TrustZone 平台上进行安全启动工程实现与调试的前提。