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 启动链信任传递流程
实践提示: 在移植 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 信任根在启动链中的位置
安全警告: 信任根的公钥必须存储在 OTP 或 eFuse 中,不能存储在可重写的 Flash 中。攻击者若替换公钥,即可用自己的镜像通过验证。
2.3 安全启动(Secure Boot)
安全启动是启动链的核心安全机制,它确保只有经过授权、未被篡改的固件才能被执行。安全启动通常结合数字签名验证和哈希度量两种技术。
2.3.1 安全启动验证流程
- 镜像签名: 开发阶段使用私钥对固件镜像进行签名,生成签名附加在镜像尾部。
- 公钥存储: 对应的公钥烧录在芯片 OTP 或安全存储中,作为信任根。
- 加载验证: 启动加载器读取镜像,使用公钥验证签名有效性。
- 哈希比对: 计算镜像哈希,与签名中的哈希值比对,确保完整性。
- 执行决策: 验证通过则跳转执行;失败则进入安全恢复或硬件复位。
2.3.2 安全启动验证架构
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 接口。