4、BootROM原理:芯片上电第一段代码
说实话,做安全启动这么多年,我觉得最容易被忽视、却又最关键的部分,就是BootROM。很多人一上来就研究U-Boot怎么签名、怎么验签,却忽略了芯片上电后那第一口“奶”——BootROM。这玩意儿要是没搞对,后面所有安全措施都是空中楼阁。
今天我们就来聊聊,芯片上电后到底发生了什么。
4.1 芯片上电第一段代码
你想想看,芯片刚上电的时候,DRAM还没初始化,Flash控制器还没配置,甚至连时钟都还没稳定。这时候CPU能执行什么代码?
答案只有一个:芯片内部固化的、不可修改的代码。这就是BootROM。
BootROM是芯片出厂时就被烧死在ROM里的程序。ROM是什么?只读存储器。一旦流片完成,这玩意儿就焊死在芯片里了,谁也改不了。我当年第一次接触这个的时候,还天真地问过:“能不能通过OTA升级BootROM?”——嗯,后来被老工程师教育了一顿。
BootROM的存放位置很特殊。它不在外部Flash里,也不在DDR里。它就在芯片内部,CPU可以直接寻址。上电后,CPU的复位向量直接指向BootROM的起始地址。这个过程是硬件决定的,软件插不上手。
关键点:BootROM是芯片上电后执行的第一段代码。它不可修改、不可绕过。这是整个安全启动链的起点。
4.2 BootROM的职责
BootROM虽然小,但活儿不少。我把它总结为三个核心职责:
- 初始化硬件——时钟、PLL、Cache、SRAM、基本外设
- 加载下一级Bootloader——从Flash、SD卡、UART等介质读取
- 验证下一级代码的完整性——这就是安全启动的核心
咱们一个一个说。
4.2.1 初始化硬件
BootROM首先要让芯片“活过来”。它需要配置最基本的时钟树,让CPU能跑起来。然后初始化内部SRAM——注意,这时候外部DRAM还没准备好。BootROM通常只使用芯片内部那块很小的SRAM,可能就几十KB到几百KB。
我遇到过的一个坑:某款芯片的BootROM在初始化Cache时有个bug,导致某些条件下Cache里的数据不一致。排查了整整两周才发现是BootROM的问题。嗯,这种问题你只能找芯片原厂要补丁,自己改不了。
4.2.2 加载下一级Bootloader
BootROM初始化完基本硬件后,就要去找下一级代码了。它怎么找?
通常按照预设的启动顺序去扫描各个启动介质。比如:
- 先从SD卡读
- 读不到再从eMMC读
- 还不行就从UART下载
这个顺序由芯片的Boot Pin或OTP(一次性可编程)配置决定。我建议你在设计产品时,生产环境一定要把UART下载口封掉。否则别人拿个串口线就能往你的设备里灌代码,那还谈什么安全?
4.2.3 验证下一级代码
这才是BootROM最核心的职责。它要确保加载进来的下一级Bootloader是合法的、没有被篡改过的。
怎么验证?用公钥验签。BootROM里固化了公钥的哈希值(或者公钥本身),它用这个公钥去验证下一级代码的数字签名。验证通过才执行,不通过就死循环或者报错。
个人经验:我建议你在BootROM阶段只做签名验证,不要做解密。解密会大大增加BootROM的代码量,而ROM里的代码每多一行,出bug的风险就多一分。签名验证就够了,代码加密可以放到下一级Bootloader去做。
4.3 不可篡改的信任根(Root of Trust)
好,现在到了最核心的概念——信任根。
什么叫信任根?说白了,就是整个安全体系里绝对可信的那个起点。它不能被篡改,不能被绕过,不能被欺骗。
在安全启动体系里,信任根就是BootROM + 它里面固化的公钥。
为什么说它不可篡改?
- BootROM在ROM里——物理上改不了
- 公钥哈希在OTP里——只能写一次,写死了就改不了
这就形成了一个信任链:
信任根(BootROM + 公钥)→ 验证 → Bootloader → 验证 → OS Kernel → 验证 → 应用
每一级都验证下一级的签名。只要信任根是安全的,整个链条就是安全的。
注意:信任根一旦被攻破,整个安全体系就崩塌了。我曾经见过一个案例,某厂商的BootROM里有个漏洞,攻击者可以通过电压毛刺攻击让签名验证跳过。结果就是,任何代码都能被执行。所以,信任根的安全不仅仅靠软件,还要靠硬件防护——比如电压检测、时钟检测、温度检测。
4.4 实际项目中的注意事项
最后,分享几个我在项目中踩过的坑:
| 问题 | 后果 | 建议 |
|---|---|---|
| BootROM里公钥写死了 | 换密钥必须换芯片 | 用OTP存公钥哈希,留更换余地 |
| BootROM代码有bug | 无法修复,只能换芯片 | 选型时选成熟芯片,别当小白鼠 |
| 启动介质顺序可被外部控制 | 攻击者可引导恶意代码 | 生产环境锁定启动顺序 |
| BootROM未做抗攻击设计 | 电压毛刺、激光攻击可绕过 | 选择有硬件防护的芯片 |
嗯,总结一下。BootROM是安全启动的基石。它不可篡改、不可绕过,是整个信任链的起点。理解BootROM的原理,你才能真正理解安全启动是怎么一回事。
下一章,我们会聊聊公钥怎么存、怎么管理。这个环节要是搞砸了,BootROM再安全也没用。