1. 固件安全概述

大家好,我是你们这期课程的主讲。在固件安全这个领域摸爬滚打了十几年,踩过的坑比写过的代码还多。今天咱们先聊聊最基础的东西——固件到底是什么?它为什么会有安全问题?我们又为什么要花时间去做测试?

说实话,很多人一听到「固件」两个字,第一反应就是「哦,就是那个烧在芯片里的程序」。这个理解没错,但太笼统了。你想想看,从你手机里的基带芯片,到路由器里的操作系统,再到汽车里的ECU,这些统统都叫固件。它们的形态、复杂度、攻击面,天差地别。

1.1 固件定义与分类

固件,说白了就是「固化在硬件中的软件」。它介于硬件和操作系统之间,负责初始化硬件、提供底层服务。我个人习惯把固件分成三类:

分类 典型代表 存储介质 更新方式
Boot ROM CPU启动代码、安全引导 Mask ROM / OTP 不可更新
系统固件 UEFI、BIOS、uboot SPI Flash 可更新(需签名)
外设固件 网卡、硬盘、摄像头固件 EEPROM / NOR Flash 可更新(常无签名)

这里我要特别提醒一句:外设固件往往是安全测试的盲区。我在做项目时遇到过好几次,主芯片的安全防护做得固若金汤,结果攻击者从一块不起眼的Wi-Fi模块固件里找到了突破口。嗯,这个后面我们会专门讲。

1.2 固件安全威胁模型

搞安全的人都知道,没有威胁模型的安全分析就是耍流氓。固件安全的威胁模型,我习惯从三个维度去拆解:

核心威胁模型:攻击者能接触到什么?

  • 物理接触:拆机、JTAG调试、SPI嗅探、芯片开盖
  • 网络接触:远程漏洞利用、固件OTA劫持、协议重放
  • 供应链接触:恶意固件预装、第三方库漏洞、开发工具后门

你可能会问:「物理接触的威胁是不是太极端了?」我刚开始也这么想。直到有一次,客户送测的设备,我们只是用镊子短接了Flash的两个引脚,就能直接读出完整的固件镜像。从那以后,我再也不敢低估物理攻击的威力。

下面这张图,是我自己总结的固件安全威胁模型框架,你可以对照着理解:

固件安全威胁模型框架 攻击入口 物理攻击面 网络攻击面 供应链攻击面 JTAG/SWD调试 SPI/I²C嗅探 远程溢出漏洞 OTA中间人 恶意固件预装 第三方库后门 攻击目标:固件提取 / 逆向 / 篡改 / 持久化 💡 说明: 实际攻击中,攻击者往往组合使用多个攻击面。 例如:通过网络漏洞获取远程代码执行 → 再通过物理接口提取完整固件。

1.3 固件安全测试的重要性

讲完了威胁,咱们聊聊为什么非得做测试。我见过太多团队,产品功能做得漂漂亮亮,一到安全测试就露馅。原因无非这几点:

  • 固件一旦部署,修复成本极高——不像App可以热更新,很多嵌入式设备需要现场刷机甚至返厂
  • 固件漏洞影响面广——一个路由器漏洞可能影响几百万台设备
  • 固件攻击往往不可逆——Boot ROM被篡改后,设备基本就变砖了

⚠️ 我曾经踩过的坑:

有一款智能门锁产品,所有功能测试都通过了。结果我们做固件安全测试时发现,它的OTA更新包居然没有做签名校验。攻击者只要在同一个Wi-Fi网络里,就能伪造更新包把恶意固件刷进去。门锁?直接变成别人的开门器。这个漏洞如果等到量产后再发现,召回成本至少七位数。

所以,固件安全测试不是「锦上添花」,而是「雪中送炭」。它应该贯穿在整个产品开发周期里,而不是等到快上市了才临时抱佛脚。

💡 我的建议:

如果你刚开始接触固件安全测试,别急着上高级工具。先学会怎么把固件从芯片里读出来,怎么用binwalk解包,怎么识别文件系统。这些基本功打扎实了,后面的路就好走了。