4、BootROM(iROM)详解:iROM的启动流程、iROM的代码签名验证、iROM中的公钥存储、iROM的安全漏洞与防护
好,咱们今天来聊聊三星芯片里那个最底层的“小管家”——BootROM,也就是iROM。说实话,这部分内容我每次讲都觉得特别重要。你想想看,整个芯片的信任链,起点就在这儿。如果iROM被人动了手脚,那后面所有的安全机制都是白搭。
我个人习惯把iROM看作是芯片的“基因”。它出厂就固化在硅片里,谁也改不了。这既是它的优点,也是它的缺点。优点嘛,就是绝对可靠,没人能篡改;缺点呢,就是一旦有漏洞,那就是“绝症”,只能通过芯片改版来修复。
iROM的启动流程
芯片上电后,第一件事就是执行iROM里的代码。这个流程,我把它拆成几个关键步骤:
- 硬件初始化:关掉所有中断,设置好堆栈指针,初始化时钟和内存控制器。这一步很基础,但出问题也最多。我记得有一次,一个项目就是因为在iROM里没正确配置DDR的时序,导致后面所有代码都跑不起来。
- 启动介质检测:iROM会按照预设的顺序去检测启动介质。比如先看eMMC,再看UFS,最后看SD卡。这个顺序是写死的,但可以通过外部引脚的电平来调整。
- 加载BL1:从检测到的启动介质中,把第一段引导代码(BL1)加载到内部SRAM里。注意,这时候DDR还没初始化,所以只能加载到片内的SRAM。
- 验证BL1签名:这是最关键的一步。iROM会用内置的公钥去验证BL1的数字签名。验证通过,才把控制权交给BL1。
- 跳转到BL1:验证通过后,iROM会清理现场,然后跳转到BL1的入口地址。
核心要点:iROM的启动流程是“不可逆”的。一旦跳转到BL1,iROM就基本“退休”了,不会再被调用。所以,所有必须在最底层完成的安全检查,都得在iROM里做完。
iROM的代码签名验证
签名验证,说白了就是“验明正身”。iROM怎么知道加载进来的BL1是不是三星官方签发的?靠的就是数字签名。
具体流程是这样的:
- iROM从BL1的头部信息里,找到签名数据的位置和大小。
- 用内置的公钥,对BL1的镜像内容做哈希运算,然后解密签名数据,得到一个哈希值。
- 比较这两个哈希值。如果一致,说明BL1是完整的、未被篡改的,而且确实是由三星私钥签发的。
这里有个细节,我建议你注意一下。签名验证的对象,是整个BL1镜像,还是只验证了部分内容?嗯,不同的芯片实现不一样。有些芯片只验证了头部和关键代码段,有些则是全量验证。全量验证更安全,但启动时间会更长。我在项目中遇到过,为了优化启动时间,客户要求只验证关键部分,但被我坚决否定了。安全这东西,不能打折扣。
避坑指南:我曾经见过一个案例,工程师在生成签名时,忘了把BL1的头部信息包含进去。结果导致iROM验证签名时,拿到的哈希值总是对不上。排查了整整两天,才发现是签名工具的参数配错了。所以,签名生成和验证的逻辑,一定要前后对齐,一丝都不能差。
iROM中的公钥存储
公钥存在哪儿?这是个好问题。你不能把公钥放在Flash里,因为Flash可以被改写。也不能放在寄存器里,因为一掉电就没了。
三星的做法是,把公钥直接固化在iROM的掩膜里。也就是说,在芯片制造的时候,公钥就已经被“刻”进硅片了。这样做的好处是:
- 不可篡改:物理方式固化,任何软件手段都无法修改。
- 随时可用:上电就能用,不需要额外的加载过程。
- 高安全性:攻击者无法通过探测引脚或内存来窃取公钥。
但这也带来一个问题:公钥是固定的。如果有一天三星想更换密钥,那所有已出货的芯片都没法升级。所以,实际产品中,iROM里通常会存储一个“根公钥”,然后允许在后续的引导阶段,用这个根公钥去验证并更新次级公钥。这样既保证了底层的安全,又提供了灵活性。
| 存储方式 | 优点 | 缺点 |
|---|---|---|
| iROM掩膜 | 不可篡改,安全性最高 | 无法更新,灵活性差 |
| OTP(一次性可编程) | 可烧录一次,相对灵活 | 烧录后不可更改,容量有限 |
| eFuse | 可多次烧录,灵活性好 | 占用面积大,成本高 |
警告:千万不要尝试在iROM里存储私钥!私钥一旦泄露,整个信任链就崩塌了。iROM里只放公钥,私钥必须保存在三星的离线安全环境中。
iROM的安全漏洞与防护
iROM虽然固化在芯片里,但也不是无懈可击的。我总结了几类常见的攻击面:
- 电压/时钟毛刺攻击:通过瞬间改变供电电压或时钟频率,让iROM在执行关键判断时出错,从而绕过签名验证。防护手段是增加电压和时钟监测电路,一旦检测到异常,立即复位芯片。
- 激光故障注入:用激光照射芯片的特定区域,改变晶体管的状态,让iROM跳过某些指令。这需要物理接触,成本很高,但确实有成功的案例。防护手段是增加光敏检测层,或者对关键代码进行冗余执行。
- 调试接口攻击:如果芯片的JTAG或SWD调试接口没有正确锁定,攻击者可以直接读取iROM的代码,甚至修改执行流程。防护手段是在iROM启动后,立即禁用所有调试接口,或者设置硬件熔丝来永久关闭。
- 侧信道攻击:通过分析iROM在执行签名验证时的功耗、电磁辐射等物理特征,来推断出公钥或者签名算法的细节。防护手段是采用恒定时间算法,或者加入随机噪声来掩盖真实的物理特征。
嗯,说到这里,我想起一个真实的案例。某款芯片的iROM,在验证签名时,如果签名长度为零,就会直接跳过验证。攻击者发现这个漏洞后,只需要提供一个没有签名的BL1,就能轻松启动任意代码。这个漏洞的根源,就是iROM代码里少了一个“长度检查”。所以,写iROM代码时,一定要对所有输入做边界检查,一个字节都不能放过。
总结一下:iROM是信任链的“根”,它的安全决定了整个系统的安全。防护手段要“软硬结合”,既要有代码层面的安全检查,也要有硬件层面的抗攻击能力。而且,一定要做充分的渗透测试,别等到芯片量产了才发现漏洞,那就真的晚了。
好了,关于iROM的内容,今天就先聊到这儿。下一节,咱们会深入BL1,看看它是怎么接过iROM的接力棒的。