一、固件安全概述

1.1 什么是固件

固件这东西,说白了就是「嵌入在硬件里的软件」。它不像你电脑上的 Word 或浏览器,想装就装想删就删。固件是焊死在 Flash、EEPROM 或 NOR Flash 里的程序代码,负责让硬件「活起来」。

我习惯把固件比作硬件的「灵魂」。你想想看,一块 STM32 芯片,没有固件它就是块废硅片。烧上固件,它就能控制电机、采集传感器、跑网络协议栈。路由器、智能电表、汽车 ECU、医疗输液泵……这些设备的核心,都靠固件撑着。

固件有几个明显的特点:

  • 紧耦合硬件:直接操作寄存器、中断向量、内存映射
  • 资源受限:Flash 可能只有 256KB,RAM 只有 64KB
  • 更新困难:很多设备部署后没法轻易拆机刷写
  • 长期运行:可能 5 年、10 年不关机
我的经验: 2018 年我接手过一个工业网关项目,固件只有 512KB。客户要求 OTA 升级,结果发现 Flash 里连放两份固件的空间都不够。最后只能做差分升级——嗯,这就是资源受限带来的真实挑战。

1.2 固件面临的安全威胁

固件一旦部署到现场,就成了攻击者的「靶子」。我这些年做安全审计,见过太多被攻破的设备。威胁主要分三类:

1.2.1 篡改攻击

攻击者修改固件二进制内容,植入后门或恶意逻辑。这是最常见的攻击方式。

  • 固件替换:把原厂固件换成带后门的版本
  • 配置篡改:修改启动参数、密钥证书、MAC 地址
  • 代码注入:在固件中插入恶意代码段
真实案例: 2021 年某品牌路由器被爆出固件篡改漏洞。攻击者通过未签名的固件更新接口,植入了挖矿程序。用户发现路由器变慢、CPU 一直 100%,但重启也没用——因为恶意代码已经写进 Flash 了。

1.2.2 逆向分析

攻击者拿到固件文件,用反汇编器、IDA Pro、Ghidra 等工具分析你的代码逻辑。

  • 提取密钥:从固件中硬编码的 AES 密钥、证书私钥
  • 破解协议:分析通信协议格式,伪造设备身份
  • 寻找漏洞:发现缓冲区溢出、整数溢出等可利用点

我记得有个客户,把 Wi-Fi 密码硬编码在固件里,还觉得「没人能读出来」。结果我用 binwalk 一把解开文件系统,grep 一下就看到明文密码了。嗯,这种坑我踩过不止一次。

1.2.3 注入攻击

通过通信接口(UART、SPI、I2C、USB、网络)向运行中的固件注入恶意数据或命令。

  • 缓冲区溢出:发送超长输入覆盖栈返回地址
  • 命令注入:在输入中嵌入系统命令分隔符
  • 格式化字符串:利用 printf 类函数泄露内存
核心观点: 这三种威胁往往组合出现。攻击者先逆向分析固件找到漏洞,然后通过注入攻击获得控制权,最后篡改固件实现持久化。一个环节失守,全盘皆输。

1.3 签名验证的价值

签名验证,就是给固件加一道「防伪标识」。它解决一个根本问题:你怎么知道手里的固件是原厂发布的,而不是被人动过手脚的?

原理其实不复杂:

  1. 原厂用私钥对固件哈希值签名
  2. 设备端用公钥验证签名
  3. 签名不匹配,拒绝启动或更新

我画了一张图,帮你理清这个流程:

固件签名验证流程 固件签名验证流程 固件发布方 计算固件哈希 私钥签名 打包固件+签名 发布 传输通道 接收 设备端 提取固件+签名 公钥验签 签名不匹配 → 拒绝 签名匹配 → 启动 关键点:私钥永远留在发布方,设备只存公钥。公钥本身也需要防篡改保护。 哈希算法推荐 SHA-256,签名算法推荐 ECDSA 或 RSA-2048 以上。

签名验证的价值,我总结为三点:

价值维度 具体说明 我的亲身经历
完整性保护 确保固件从发布到烧录,中间没被改过 有次客户说设备批量变砖,一查是产线烧录器被植入了恶意脚本,把固件第 0x1000 字节改了。如果有签名验证,这种问题根本不会发生。
来源认证 确认固件确实来自原厂,不是第三方伪造 IoT 设备经常被仿冒厂商刷入劣质固件,导致安全事故。签名验证能从根上切断这种「李鬼固件」。
抗抵赖性 发布方不能否认自己签过某个固件版本 这在合规审计中特别重要。FDA 对医疗设备有明确要求:固件必须有数字签名,且签名密钥必须硬件隔离。
一句话总结: 没有签名验证的固件更新,就像你家大门没上锁——不是一定会被偷,但小偷来了你一点办法都没有。

1.4 常见误区与避坑

这些年我见过不少团队在签名验证上栽跟头,这里列几个典型:

  • 误区一:签名了就不需要加密 —— 签名防篡改,加密防泄露,两码事。我见过有人把私钥明文放在固件里,还加了签名,结果攻击者直接提取私钥自己签名去了。
  • 误区二:验签只在 OTA 时做一次 —— 启动加载、运行时校验、回滚保护都要做。我曾经遇到一个设备,OTA 验签通过了,但下次冷启动时直接跳过了验签步骤,攻击者只要物理接触就能刷入恶意固件。
  • 误区三:公钥随便存 —— 公钥如果可以被替换,签名就形同虚设。一定要把公钥烧死在 OTP(一次性可编程)区域或硬件安全模块里。
避坑指南: 我曾经帮一个客户做安全审计,发现他们把 RSA 公钥放在文件系统里,权限还是 777。攻击者只要拿到 shell,直接覆盖公钥文件,然后用自己的私钥签名固件——整个签名体系瞬间崩塌。记住:公钥的存储安全,和私钥的保护同等重要。

好了,这一章我们聊了固件是什么、面临哪些威胁、签名验证为什么重要。这些是后续所有技术实战的基础。你心里有个底就行——后面我们会一步步把签名验证落地到真实项目中。