一、一次性可编程存储器(OTP):芯片的第一道防线
大家好,我是你们的嵌入式安全讲师。今天我们来聊聊OTP——一次性可编程存储器。这玩意儿,说白了就是芯片出厂后只能写一次、不能擦除的存储单元。你想想看,如果攻击者能随意修改芯片的密钥或配置,那整个安全体系就形同虚设了。OTP就是用来锁死这些关键信息的。
1.1 OTP原理与类型
OTP的原理其实不复杂。每个存储单元在出厂时都是"0"状态,通过施加高电压或大电流,把某些单元永久性地变成"1"。一旦烧录,就回不去了。就像一张纸,你写错了也不能擦掉重写。
常见的OTP类型有几种:
- 熔丝型(Fuse):物理上烧断金属丝。我在项目中见过,这种最可靠,但占面积大。
- 反熔丝型(Anti-fuse):烧穿绝缘层形成导通。三星芯片里用得比较多。
- 电荷存储型:利用浮栅晶体管存储电荷。成本低,但数据保持力稍差。
关键点:三星Exynos系列芯片主要采用反熔丝型OTP。为什么?因为它在高温下数据保持力好,而且抗物理攻击能力强。我个人习惯在选型时优先考虑反熔丝型,尤其是做车规级芯片时。
1.2 三星芯片中的OTP布局
三星的OTP布局,我画个简化的示意图给你看。实际上,它分布在芯片的不同区域:
| 区域 | 存储内容 | 大小(典型值) |
|---|---|---|
| 安全域 | 根密钥、芯片唯一ID | 256-512 bits |
| 配置域 | 启动模式、电压配置 | 128-256 bits |
| 调试域 | JTAG锁定、调试权限 | 64-128 bits |
| 用户域 | 厂商自定义数据 | 1-4 Kbits |
嗯,这里要注意:安全域的OTP是物理隔离的。我记得有一次调试,发现某个芯片的根密钥被意外读取了,后来查出来是布局时安全域和调试域靠得太近,导致侧信道攻击。从那以后,我建议团队在布局时至少留出20μm的隔离带。
1.3 OTP烧录流程
烧录OTP,不是简单地把数据写进去就完事了。流程上,我一般分三步走:
- 预烧录验证:先读一遍OTP的初始状态,确保全是0。我曾经遇到过一批芯片,出厂时就有几个bit是1,直接导致烧录失败。
- 烧录操作:施加编程电压(通常是3.3V或5V),按位写入。三星的烧录时序比较严格,脉冲宽度要控制在1-10μs之间。
- 回读校验:烧完后立即读回来对比。如果发现不一致,嗯,这块芯片就废了。
避坑指南:我曾经在量产线上发现,烧录器接触不良会导致部分bit烧录不完整。后来我加了一个接触电阻检测步骤,问题就解决了。建议你在烧录前先测一下探针的接触电阻,小于1Ω才算合格。
下面是一个简化的烧录代码示例(伪代码):
// OTP烧录流程示例
int otp_program(uint32_t address, uint64_t data) {
// 1. 预烧录验证
if (otp_read(address) != 0x0) {
return ERROR_OTP_NOT_BLANK;
}
// 2. 施加编程电压
otp_set_voltage(OTP_VPP, 3.3); // 3.3V编程电压
// 3. 按位烧录
for (int i = 0; i < 64; i++) {
if (data & (1ULL << i)) {
otp_program_bit(address, i);
delay_us(5); // 5μs脉冲
}
}
// 4. 回读校验
uint64_t readback = otp_read(address);
if (readback != data) {
return ERROR_OTP_VERIFY_FAIL;
}
return SUCCESS;
}
1.4 OTP的安全防护
OTP本身是安全的,但攻击者不会直接攻击存储单元。他们更倾向于攻击烧录接口或读取路径。我总结了几种常见的攻击方式和防护手段:
- 电压毛刺攻击:在烧录瞬间注入异常电压,导致烧录不完整。防护:加电压检测电路,检测到异常立即终止。
- 激光切割:用激光切断OTP的读取路径。防护:在OTP上方覆盖金属屏蔽层。
- 侧信道分析:通过功耗或电磁辐射推断烧录的数据。防护:烧录时加随机延时,打乱时序特征。
重要警告:千万别把OTP的烧录接口暴露在芯片外部!我见过一个设计,把OTP编程引脚直接连到了测试焊盘上,结果攻击者用探针台直接烧录了恶意数据。正确的做法是:烧录接口只在工厂模式下可用,量产完成后永久禁用。
最后,我想强调一点:OTP是信任链的根。如果根被污染了,整个安全体系就崩塌了。所以,我个人建议在OTP烧录完成后,立即锁定烧录接口,并且把锁定位也烧进OTP里。这样,就算攻击者拿到了芯片,也无法再修改任何内容。
好了,这一章就到这里。下一章我们会讲硬件安全模块(HSM),那是比OTP更复杂的东西。有什么问题,欢迎在课后交流。