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 固件攻击面全景图

下面这张图把上面讲的攻击面串起来了。我习惯用这种图来给团队做安全培训,一目了然。

固件攻击面全景图 固件攻击面全景图 固件 (Firmware) 物理攻击 JTAG/SWD调试接口 SPI Flash嗅探 芯片开盖/探针 电压/时钟毛刺 网络攻击 OTA更新劫持 固件降级攻击 远程代码执行 DNS劫持 侧信道攻击 功耗分析(SPA/DPA) 电磁辐射分析 时序分析 缓存侧信道 防御建议 1. 物理攻击 → 锁定调试接口、加密存储、加装屏蔽罩 2. 网络攻击 → TLS双向认证、固件签名、版本号防降级 3. 侧信道攻击 → 恒定时间算法、功耗加噪、差分逻辑

1.4 固件签名能防住什么?防不住什么?

这个问题我经常被问到。咱们得实事求是:

固件签名能防住:

  • OTA更新包被篡改或伪造
  • 非授权方发布的“冒牌”固件
  • 固件被逆向工程后重新打包(签名校验会失败)

固件签名防不住:

  • 物理攻击直接读取Flash(签名不加密数据)
  • 侧信道攻击窃取签名私钥
  • 已经存在的漏洞被利用(签名不修复代码bug)

所以你看,固件签名是安全体系里的一环,不是万能药。我习惯把它比作“门锁”——能防住路过的小偷,但防不住拿着电钻的强盗。你需要配合加密存储、安全启动、运行时保护等机制,才能构建一个相对完整的安全防线。

我的建议:做固件安全设计时,先做威胁建模。把攻击面列出来,然后针对每个攻击面选择对应的防护手段。签名只是其中一项,但往往是最基础、性价比最高的一项。