第4章 信任根与安全启动:核心概念、原理机制、实战要点
4.1 问题背景
芯片上电后的第一段代码决定了后续所有软件运行环境的可信性。如果攻击者能够篡改或替换引导镜像,上层安全机制——即使加密、隔离做得再完善——都可能被绕过。安全启动要解决的正是“系统从第一条指令开始,如何逐级建立可信状态”的问题。
典型攻击场景:
- 固件替换:将Bootloader或OS镜像替换为带后门的版本;
- 版本回滚:把安全补丁版本回退到存在已知漏洞的旧版本;
- 调试口劫持:在启动早期通过JTAG/SWD或调试串口接管CPU控制权。
4.2 核心概念
信任根是芯片内物理上不可篡改、逻辑上最先被信任的安全基点。没有信任根,安全启动的验证链条就没有可靠起点。
- Boot ROM:复位后执行的首段固化代码,通常由芯片厂写入ROM,不可在线修改。
- OTP/熔丝:一次性可编程存储区,用于固化根公钥哈希、安全使能位与版本号。
- PUF:基于物理随机特性生成设备唯一密钥,防止芯片被物理克隆。
4.3 原理机制
安全启动的密码学基础是“签名的逐级验证”。在每一级跳转之前,当前可信代码必须使用已知公钥校验下一级镜像的签名,通过后才能加载执行。签名算法应至少使用RSA-2048或ECDSA-P256,哈希算法使用SHA-256及以上。
- 公钥固化:芯片出厂时将根公钥的哈希写入OTP,Boot ROM在启动时读取该哈希并与镜像携带的证书进行比对。
- 逐级签名:Bootloader镜像由根私钥签名,内核镜像由设备密钥签名;每一级都验证下一级完整镜像的哈希和签名。
- 版本防回滚:OTP中维护单调递增版本号,任何低于当前版本的镜像都被拒绝加载。
- 运行时强化:安全启动只保证加载阶段可信,加载完成后的运行期通常还需要配合ASLR、PAC或MPU/MMU等机制防御后续攻击。
4.4 流程步骤
典型的安全启动处理流程(以Linux/ARM嵌入式系统为例):
1. CPU复位 → 取指地址映射到Boot ROM
2. Boot ROM检查OTP状态:
- SecureBoot_Enable = 1?
- Debug_Disable = 1?
3. Boot ROM从eMMC/NOR Flash加载Bootloader
4. Boot ROM使用OTP根公钥哈希验证Bootloader签名证书
5. 校验通过 → 跳转Bootloader
6. Bootloader加载内核镜像
7. Bootloader使用SPK/KBK验证内核签名及DTS签名
8. 校验通过 → 进入内核
9. 内核挂载根