BootROM:不可篡改的第一段代码
芯片上电那一刻,CPU 的 PC 指针会跳到一个固定地址。这个地址里存的是什么?就是 BootROM。说白了,它是固化在芯片内部的一块只读存储器,里面烧录了 SoC 启动的第一条指令。我做了这么多年底层固件,可以负责任地告诉你:BootROM 是整个信任链的物理根基,它要是被改了,后面所有安全机制都是白搭。
BootROM 为什么“不可篡改”?
你想想看,如果第一段代码能被随意改写,那攻击者直接把它换成恶意代码,后面加载什么操作系统都没用。BootROM 的不可篡改性来自两个层面:
- 物理层面:BootROM 是 Mask ROM,芯片流片时就固定了。出厂后无法通过任何电气方式改写。我曾经遇到一个项目,芯片回来发现 BootROM 有个小 bug,只能重新流片,代价是几百万美金和三个月周期。
- 逻辑层面:BootROM 的代码签名公钥也固化在其中。它只加载经过签名的下一级镜像。这个机制叫“信任根”(Root of Trust),是整个安全启动的起点。
核心要点:BootROM 是信任链的物理锚点。它不可篡改,所以信任链的第一环是可信的。如果 BootROM 被攻破,整个系统就没有任何可信基础了。
BootROM 到底干了哪些事?
很多人以为 BootROM 就是跳转到 Flash 执行,其实远没那么简单。我拆解一下它的核心任务:
- 硬件初始化:设置 CPU 模式、关闭中断、配置堆栈指针。这时候 DRAM 还没初始化,代码只能在 SRAM 或 Cache 里跑。
- 时钟与电源管理:配置 PLL,让 CPU 从低速时钟切换到正常工作频率。我记得有次调试,BootROM 里 PLL 配置参数写错了一位,导致芯片启动时频率只有标称值的 1/4。
- 基础外设初始化:至少要把启动介质(比如 eMMC、NAND Flash、SPI NOR)的控制器初始化好。不然怎么读下一级代码?
- 启动介质检测:按照预设优先级轮询各个启动设备。比如先看 eMMC 有没有镜像,没有就试 SPI Flash,再没有就进 USB 下载模式。
- 安全验证:读取下一级镜像(通常是 SPL 或 BL1),用固化在 BootROM 里的公钥验证其签名。验证通过才加载执行。
- 跳转执行:把控制权交给下一级代码。这一步通常涉及刷新 Cache、设置新的异常向量表。
经验之谈:BootROM 的代码量通常只有 8KB 到 64KB。在这么小的空间里塞下这么多功能,对工程师的优化能力要求极高。我见过有些芯片把 BootROM 的串口打印功能都砍掉了,调试起来非常痛苦。
BootROM 的启动流程
下面这张图展示了 BootROM 的典型执行流程。我建议你仔细看看,因为后面所有章节的信任传递都从这里开始。
BootROM 的安全机制
BootROM 的安全设计有几个关键点,我挑重要的说:
| 安全机制 | 作用 | 实现方式 |
|---|---|---|
| 公钥固化 | 防止公钥被替换 | 公钥直接烧录在 Mask ROM 中 |
| 签名验证 | 确保镜像来源可信 | RSA-2048 或 ECDSA P-256 |
| 哈希校验 | 检测镜像是否被篡改 | SHA-256 或 SHA-384 |
| 回滚保护 | 防止降级攻击 | 版本号存储在 OTP 中 |
| 调试接口锁定 | 防止 JTAG/SWD 调试 | efuse 熔断控制 |
注意:BootROM 的安全机制不是万能的。如果芯片有硬件漏洞(比如 Rowhammer 攻击),或者公钥算法强度不够(比如还在用 RSA-1024),攻击者可能绕过签名验证。我曾经在评估一款 IoT 芯片时发现它的 BootROM 公钥是硬编码的 RSA-512,用普通笔记本跑几个小时就能破解。
BootROM 的局限性
BootROM 虽然不可篡改,但它也有短板。我总结了几点:
- 功能固定:出厂后无法更新。如果发现 bug,只能通过后续软件打补丁,或者重新流片。
- 空间有限:通常只有几十 KB。复杂的启动逻辑(比如支持多种文件系统)放不下。
- 调试困难:没有标准输出,串口打印可能被砍掉。我调试 BootROM 时经常靠 GPIO 电平变化来推断执行到了哪一步。
- 安全风险:如果 BootROM 本身有漏洞(比如缓冲区溢出),攻击者可能利用它执行任意代码。这种漏洞一旦发现,基本无法修复。
避坑指南:我曾经接手过一个项目,BootROM 里有个 off-by-one 错误,导致在特定条件下读取启动介质时越界。这个 bug 在芯片量产半年后才被发现,最后只能通过修改下一级加载器来绕过。所以,BootROM 的代码审查和形式化验证一定要做到位,别省这个成本。
BootROM 与信任链的关系
BootROM 是信任链的第一环。它验证下一级镜像(通常是 SPL 或 BL1),下一级再验证再下一级,层层递进。这个链条的强度取决于最弱的一环。如果 BootROM 本身是可信的,那么只要每一级都严格执行签名验证,整个启动过程就是安全的。
但这里有个容易被忽略的点:BootROM 验证下一级镜像时,它用的公钥是固化在 ROM 里的。如果这个公钥对应的私钥泄露了,攻击者就可以签发恶意镜像。所以,私钥的保管比 BootROM 本身的安全更重要。我见过一些厂商把私钥放在 CI 服务器上,这简直是灾难。
嗯,BootROM 的内容就讲到这里。记住一句话:它是信任链的物理根基,不可篡改,但也不是无懈可击。下一级代码怎么被 BootROM 加载和验证,我们后面再细聊。