2. 安全固件基础:固件启动链、信任根与安全启动原理

2.1 固件启动链(Boot Chain)

嵌入式设备从加电到操作系统运行,经历一个分阶段、逐级验证的启动过程,称为固件启动链。每一级负责加载并验证下一级的镜像,形成一条不可中断的信任传递链条。

2.1.1 典型启动链阶段

阶段 存储介质 主要职责 安全关注点
ROM Boot 芯片内部 ROM 初始化最小硬件,加载 BootROM 不可篡改,信任根起点
BL1 (Boot Loader 1) 片上 SRAM / 安全存储 验证 BL2 签名,配置安全环境 必须防回滚,抗物理攻击
BL2 (Boot Loader 2) Flash / eMMC 初始化 DRAM,加载 BL3x 镜像完整性校验
BL31 (EL3 Monitor) DRAM 安全监控器,处理 SMC 异常 隔离安全/非安全世界
BL32 (Secure OS) DRAM 运行 OP-TEE 等安全操作系统 安全服务与 TA 管理
BL33 (UEFI / U-Boot) DRAM 加载操作系统内核 启动参数防篡改
关键概念: 启动链的每一级只信任上一级传递过来的公钥或哈希值,任何一级验证失败则立即停止启动(Boot Halt)。

2.1.2 启动链信任传递流程

固件启动链信任传递流程 ROM Boot BL1 BL2 BL31 BL32 (OP-TEE) BL33 (U-Boot) 验证方向:从 ROM 到 BL33,每一级验证下一级的签名与哈希,形成单向信任链 任何一级验证失败 → 硬件复位或进入安全恢复模式
实践提示: 在移植 OP-TEE 时,BL31 与 BL32 之间的 SMC 通信通道是安全世界与非安全世界的唯一入口,必须确保 BL31 正确注册 OP-TEE 的异常向量表。

2.2 信任根(Root of Trust, RoT)

信任根是启动链中绝对可信的起点,通常固化在芯片 ROM 或一次性可编程(OTP)存储中。信任根一旦被攻破,整个安全体系将完全失效。

2.2.1 信任根的分类

类型 存储位置 不可变性 典型实现
硬件信任根 芯片 ROM / eFuse 物理不可更改 BootROM 代码、OTP 公钥
软件信任根 安全 Flash 区域 受硬件保护 签名的 BL1 镜像
派生信任根 DRAM / SRAM 运行时动态建立 安全会话密钥、测量值

2.2.2 信任根在启动链中的位置

信任根层级与依赖关系 硬件信任根 BootROM / eFuse 软件信任根 签名的 BL1 派生信任根 运行时密钥 信任根不可伪造:硬件信任根由芯片制造商烧录,软件信任根由硬件验证签名 派生信任根通过安全协议(如 Diffie-Hellman)在运行时建立 ⚠ 如果硬件信任根泄露,所有上层信任全部失效
安全警告: 信任根的公钥必须存储在 OTP 或 eFuse 中,不能存储在可重写的 Flash 中。攻击者若替换公钥,即可用自己的镜像通过验证。

2.3 安全启动(Secure Boot)

安全启动是启动链的核心安全机制,它确保只有经过授权、未被篡改的固件才能被执行。安全启动通常结合数字签名验证和哈希度量两种技术。

2.3.1 安全启动验证流程

  1. 镜像签名: 开发阶段使用私钥对固件镜像进行签名,生成签名附加在镜像尾部。
  2. 公钥存储: 对应的公钥烧录在芯片 OTP 或安全存储中,作为信任根。
  3. 加载验证: 启动加载器读取镜像,使用公钥验证签名有效性。
  4. 哈希比对: 计算镜像哈希,与签名中的哈希值比对,确保完整性。
  5. 执行决策: 验证通过则跳转执行;失败则进入安全恢复或硬件复位。

2.3.2 安全启动验证架构

安全启动签名验证架构 固件镜像 镜像数据 哈希值 签名数据 验证引擎 1. 提取签名 2. 公钥解密签名 3. 比对哈希值 信任根存储 OTP / eFuse 公钥 根证书 验证通过 → 执行 验证失败 → 复位

2.3.3 安全启动的关键参数

参数 推荐值 说明
签名算法 RSA-2048 / ECDSA P-256 避免使用 SHA-1,推荐 SHA-256
哈希算法 SHA-256 / SHA-384 抗碰撞性满足安全要求
公钥长度 2048 bit 以上 低于 2048 bit 存在被破解风险
回滚保护 版本计数器(OTP) 防止攻击者降级到有漏洞版本
工程要点: 在 OP-TEE 驱动移植中,安全启动直接影响 TA(Trusted Application)的加载验证。OP-TEE 内核在加载 TA 时,会使用安全启动相同的公钥体系验证 TA 签名,确保只有受信任的 TA 才能在安全世界中运行。

2.4 启动链安全威胁与防护

2.4.1 常见攻击向量

  • 镜像替换攻击: 攻击者将 Flash 中的固件替换为恶意版本。
  • 回滚攻击: 将固件降级到存在已知漏洞的旧版本。
  • 物理探测攻击: 通过 JTAG/SWD 接口读取信任根密钥。
  • 侧信道攻击: 通过功耗/电磁分析提取签名密钥。
  • BootROM 漏洞: 利用 ROM 代码中的缓冲区溢出等漏洞。

2.4.2 防护措施对照

威胁 防护措施 实现层级
镜像替换 数字签名验证 + 哈希度量 BL1 / BL2
回滚攻击 OTP 版本计数器 + 防回滚策略 硬件 + 软件
物理探测 JTAG 熔断 + 安全调试锁定 芯片设计
侧信道攻击 恒定时间比较 + 随机延时 软件实现
BootROM 漏洞 ROM 代码安全审计 + 补丁机制 芯片设计
实践建议: 在开发阶段,建议开启芯片的调试锁定功能(如 STM32 的 RDP Level 2),防止攻击者通过调试接口读取信任根密钥。生产阶段必须熔断 JTAG/SWD 接口。

2.5 本章小结