1. 安全启动基础:什么是安全启动、信任链模型与硬件根信任
各位同学好,我是老周。做安全固件和硬件安全这块,一晃十几年了。今天咱们开始聊安全启动——这个听起来很基础、但实际坑特别多的领域。
先问大家一个问题:你按下电源键,CPU 开始跑的第一条指令,你确定它是你写的吗?
嗯,很多人没想过这个问题。但攻击者想过。他们会在你启动之前,就把恶意代码塞进 Flash,或者篡改 Bootloader。等你系统跑起来,一切看起来正常,其实后门早就开了。
安全启动,就是来解决这个问题的。
1.1 什么是安全启动
安全启动(Secure Boot),说白了就是一套「验身」机制。从芯片上电的第一刻起,每一段要执行的代码,都得先通过签名验证。验不过?对不起,不跑。
我习惯把它理解成「接力验证」——每一棒选手跑之前,先检查前一棒给的接力棒是不是真的。
核心要点:安全启动不是防你刷机,也不是防你改系统。它的目标是防止未经授权的代码在启动阶段执行。攻击者想植入持久化后门?先过签名验证这关。
实际项目中,我见过很多团队把安全启动和「加密启动」搞混。安全启动验证的是代码完整性,不是保密性。你的 Bootloader 可以是明文存储的,只要它有合法签名就行。
1.2 信任链模型
信任链(Chain of Trust)是安全启动的骨架。它长什么样?我画个图你就明白了。
你看这个图,从底到顶,每一级都只信任上一级。最底层的 BootROM 是硬件固化的,改不了。它验证完一级 Bootloader,一级 Bootloader 再去验证二级 Bootloader,以此类推。
我曾经在一个 IoT 项目里遇到过一个问题:客户说他们的安全启动总是不通过。查了两天,发现是二级 Bootloader 的签名公钥被存在了可写的 Flash 分区里。你想想看,攻击者只要改了这个公钥,就能用自己的签名代码通过验证。这信任链就断了。
避坑指南:信任链的强度取决于最弱的一环。公钥存储位置、签名算法强度、验证逻辑的完整性,任何一个环节出问题,整个信任链就形同虚设。我曾经见过一个产品,BootROM 验证做得很好,但二级 Bootloader 验证内核时用了硬编码的弱哈希——攻击者直接碰撞就绕过去了。
1.3 硬件根信任(RoT)概念
硬件根信任(Root of Trust, RoT),是整个安全启动的基石。它必须是不可伪造、不可篡改、不可绕过的。
常见的 RoT 实现方式有几种:
| 实现方式 | 存储位置 | 特点 | 常见场景 |
|---|---|---|---|
| BootROM | 芯片内部 Mask ROM | 出厂固化,物理不可改 | 手机 SoC、MCU |
| eFuse / OTP | 芯片内一次性可编程区域 | 可烧录公钥哈希,烧后不可逆 | PC 主板、服务器 |
| TPM / HSM | 独立安全芯片 | 隔离执行,防侧信道攻击 | 企业级设备、金融终端 |
| 安全飞地 | SoC 内独立安全域 | 硬件隔离,专用处理器 | ARM TrustZone、Intel SGX |
我个人习惯把 RoT 分成两类:
- 静态 RoT:启动时一次性验证,之后不再参与。BootROM 就是典型代表。
- 动态 RoT:运行时也可以触发重新验证。比如 Intel 的 Boot Guard 就支持动态重新测量。
这里有个容易忽略的点:RoT 不仅要防篡改,还要防绕过。我见过一个案例,某款芯片的 BootROM 有 JTAG 调试接口没关,攻击者直接通过 JTAG 注入代码,跳过了整个安全启动流程。嗯,这就是典型的「门锁得很好,但窗户没关」。
实战建议:选型时,别只看 RoT 的加密强度。先确认这几个问题:
- BootROM 有没有调试接口?能不能在生产时熔断禁用?
- eFuse 烧录后能不能回读?有些芯片的 eFuse 是可以通过特殊电压读出来的。
- RoT 的密钥是谁生成的?生成环境是否安全?
我踩过最大的坑就是 eFuse 烧录后没做物理防护,攻击者用电子显微镜直接读出了密钥。从那以后,我所有项目都要求 RoT 密钥必须在安全环境中生成,并且烧录后立即熔断回读路径。
1.4 信任链的验证流程
咱们把整个流程串起来,看看实际跑起来是什么样子:
- 芯片上电:CPU 从 BootROM 开始执行。BootROM 是只读的,攻击者改不了。
- BootROM 读取 eFuse:拿到根公钥的哈希,或者直接读取根公钥。
- 验证一级 Bootloader:BootROM 从 Flash 读取 PBL,用根公钥验签。验不过?直接死循环或者进恢复模式。
- PBL 验证二级 Bootloader:PBL 从 Flash 读取 SBL,用 PBL 内置的公钥验签。注意,这个公钥本身也是被 BootROM 保护的。
- SBL 验证 OS Kernel:SBL 加载内核镜像,验签。验过才跳转执行。
- 内核验证驱动和服务:现代系统里,内核也会验证后续加载的模块。比如 Linux 的模块签名验证。
每一步都环环相扣。只要有一环没验,或者验得不严,攻击者就能从那里切入。
我记得有一次帮客户做安全审计,发现他们的 SBL 验完内核签名后,没有清理验签用的公钥缓冲区。攻击者通过内存残留数据,逆向出了公钥结构,然后伪造了一个合法签名的内核。嗯,细节决定成败啊。
关键认知:安全启动不是「验一次就完事」。它是从硬件到软件、从启动到运行时的持续验证过程。信任链断了,安全就不存在了。
1.5 为什么硬件根信任这么重要
你可能会问:软件做根信任不行吗?
不行。软件是存在 Flash 里的,攻击者可以物理读取、修改。就算你加密了,密钥也得有个地方存。存哪?最后还是得靠硬件保护。
硬件根信任的核心价值在于:
- 物理不可篡改:BootROM 是芯片制造时刻进去的,出厂后改不了。
- 执行环境可信:BootROM 执行时,外部存储器还没初始化,攻击者无法注入代码。
- 密钥安全存储:eFuse 和 OTP 区域,一旦烧录就不可逆,物理攻击成本极高。
说白了,硬件根信任就是整个安全体系的「锚」。锚稳了,后面的链才能稳。锚松了,后面再强的加密也没用。
好了,这一章的基础概念就聊到这。记住三个关键词:验身、接力、锚点。后面几章我们会深入每个环节的攻防细节,包括怎么绕过、怎么防护、怎么检测。