1. 固件安全概述
大家好,我是你们的嵌入式安全讲师。今天咱们聊聊固件签名这件事。说实话,十年前我刚入行时,很多工程师觉得固件签名就是个“锦上添花”的东西——产品能跑就行,加签名反而拖慢开发节奏。直到我亲眼见证了一个没有签名的设备被远程篡改,整个产线被迫召回……嗯,从那以后,我再也不敢轻视签名了。
1.1 为什么需要固件签名?
固件签名,说白了就是给固件打上一个“数字指纹”。这个指纹能证明三件事:
- 身份验证——固件确实来自你信任的厂商,不是第三方伪造的
- 完整性校验——固件在传输或存储过程中没有被篡改过
- 抗抵赖性——厂商不能事后否认“这不是我签的”
我遇到过不少团队,觉得“我们的产品不上网,不需要签名”。结果呢?物理接触攻击照样能改写Flash。你想想看,一个工控设备如果被人用编程器直接刷了恶意固件,后果有多严重?
核心观点:固件签名不是可选项,而是嵌入式设备的“安全带”。平时用不上,但一旦出事,就是生死攸关。
1.2 常见的固件攻击面分析
攻击者想搞你的固件,通常从三个方向下手。我按攻击难度从低到高给你捋一遍。
1.2.1 物理攻击
这是最直接、也最容易被忽视的攻击方式。攻击者手里拿着设备,什么招都能使出来。
| 攻击类型 | 具体手法 | 我见过的真实案例 |
|---|---|---|
| JTAG/SWD调试接口 | 通过调试接口直接读取或写入Flash | 某路由器厂商没锁调试口,竞品直接dump了全部固件 |
| SPI Flash嗅探 | 用逻辑分析仪抓取SPI总线上的固件数据 | 我曾经帮客户审计,发现Flash芯片引脚直接裸露,示波器一夹就完 |
| 芯片开盖/探针 | 用酸腐蚀芯片封装,用微探针读取内部总线 | 这个成本高,但国家级攻击者确实会这么干 |
| 电压/时钟毛刺 | 通过电源或时钟信号注入故障,绕过安全校验 | 我做过一次glitch攻击演示,3分钟就跳过了签名验证 |
避坑指南:我曾经见过一个团队,把安全启动的密钥硬编码在Flash里,还觉得“没人能读到”。结果攻击者用热风枪吹下Flash芯片,用编程器直接读出来了。记住:物理可接触的设备,默认就是“裸奔”状态。
1.2.2 网络攻击
联网设备越来越多,网络攻击面也在快速扩大。这里有几个典型场景:
- OTA更新劫持——中间人攻击,把恶意固件伪装成官方更新包推送给设备
- 固件降级攻击——强制设备回滚到有已知漏洞的旧版本固件
- 远程代码执行——通过协议栈漏洞(比如缓冲区溢出)直接注入shellcode
- DNS劫持——把更新服务器域名指向恶意服务器
你想想看,一个智能门锁如果OTA更新被劫持,攻击者远程刷个后门固件进去……这已经不是技术问题了,是人身安全问题。
个人经验:我建议所有OTA更新必须做到三点:① 使用HTTPS+TLS双向认证传输;② 固件包本身要有独立签名(不能只依赖传输层安全);③ 设备端必须校验版本号,禁止降级。
1.2.3 侧信道攻击
这个方向比较“学术”,但在实际攻击中越来越常见。侧信道攻击不直接攻击固件本身,而是通过“旁路信息”来推断密钥或敏感数据。
| 攻击类型 | 利用的信息 | 防御思路 |
|---|---|---|
| 功耗分析(SPA/DPA) | 芯片执行不同指令时的功耗差异 | 使用恒定时间算法、加噪 |
| 电磁辐射分析 | 芯片运行时泄露的电磁信号 | 屏蔽罩、差分逻辑 |
| 时序分析 | 不同分支执行时间的差异 | 确保所有路径执行时间一致 |
| 缓存侧信道 | CPU缓存命中/未命中的时间差异 | 禁用数据依赖的缓存访问模式 |
我记得有一次做安全评估,客户用的RSA签名验证库没有做恒定时间处理。我们用简单的功耗分析,采集了1000次签名验证的功耗曲线,就把私钥的比特位推断出来了。嗯,那个项目后来重写了整个密码库。
1.3 固件攻击面全景图
下面这张图把上面讲的攻击面串起来了。我习惯用这种图来给团队做安全培训,一目了然。
1.4 固件签名能防住什么?防不住什么?
这个问题我经常被问到。咱们得实事求是:
固件签名能防住:
- OTA更新包被篡改或伪造
- 非授权方发布的“冒牌”固件
- 固件被逆向工程后重新打包(签名校验会失败)
固件签名防不住:
- 物理攻击直接读取Flash(签名不加密数据)
- 侧信道攻击窃取签名私钥
- 已经存在的漏洞被利用(签名不修复代码bug)
所以你看,固件签名是安全体系里的一环,不是万能药。我习惯把它比作“门锁”——能防住路过的小偷,但防不住拿着电钻的强盗。你需要配合加密存储、安全启动、运行时保护等机制,才能构建一个相对完整的安全防线。
我的建议:做固件安全设计时,先做威胁建模。把攻击面列出来,然后针对每个攻击面选择对应的防护手段。签名只是其中一项,但往往是最基础、性价比最高的一项。