一、固件安全概述:什么是固件、固件安全的重要性、常见固件攻击面分析
1.1 到底什么是固件?
先问个问题:你每天用的手机、路由器、智能门锁,它们为什么能工作?
硬件是骨架,软件是灵魂。但有个东西卡在中间——固件。
我个人习惯把固件理解为「硬件的操作系统」。它不像 Windows 或 Linux 那样通用,而是专门为某个芯片或设备写的。说白了,固件就是烧录在 ROM、Flash 里的底层代码,负责初始化硬件、调度资源、提供基础服务。
举个例子:你按下路由器电源键,最先跑起来的不是 OpenWrt,而是 Bootloader(比如 U-Boot)。Bootloader 就是固件的一部分。它初始化内存、时钟、外设,然后才把操作系统加载起来。
固件的三个核心特征:
- 固化性:存储在非易失性存储器中,掉电不丢失
- 底层性:直接操作硬件寄存器,没有操作系统那层抽象
- 专用性:每款芯片、每个板子,固件几乎都是定制的
我在项目中遇到过不少刚入行的朋友,把固件和嵌入式软件混为一谈。其实有区别:嵌入式软件可以跑在 RTOS 上,而固件更接近硬件,甚至包含微码(Microcode)。你想想看,CPU 内部的那套指令解码逻辑,也算固件的一种。
1.2 固件安全为什么重要?
嗯,这里要敲黑板了。
很多人觉得固件离用户很远,攻击者够不着。但现实恰恰相反——固件是攻击者的「黄金入口」。
为什么?因为固件拥有最高权限。它跑在 Ring 0 甚至 Ring -1(SMM 模式)。一旦固件被攻破,操作系统层面的安全机制全成了摆设。
我给你们讲个真实案例。几年前某知名品牌的路由器爆出漏洞,攻击者通过 Web 接口上传了恶意固件。结果呢?路由器变成了僵尸网络的一员,用户完全不知情。更可怕的是,即使用户恢复了出厂设置,恶意固件依然存在——因为它写进了 Flash,普通重置根本清不掉。
固件被攻破的后果:
- 设备完全失控,攻击者可任意执行代码
- 持久化驻留,常规杀毒软件无法检测
- 可横向渗透,从 IoT 设备跳转到内网 PC
- 供应链污染,出厂即带后门
我曾经帮一家工控厂商做审计,发现他们的 PLC 固件居然没有签名校验。攻击者只要物理接触设备,用编程器就能刷入恶意固件。你想想看,工厂里的 PLC 要是被篡改,后果是什么?生产线停摆都是轻的。
1.3 常见固件攻击面分析
搞安全的人都知道,攻击面就是「能碰到的入口」。固件的攻击面,我把它分成四大类。下面这张图可以帮你快速建立整体认知:
1.3.1 固件提取攻击面
攻击者首先要拿到固件。怎么拿?
- 物理提取:拆开设备,用编程器直接读 Flash 芯片。SPI Flash 最常见,夹子一夹,数据就出来了。
- OTA 抓包:升级固件时抓取网络流量。很多设备用 HTTP 明文传输,一抓一个准。
- 固件解包:从官方固件更新包中提取。有些厂商连加密都不做,直接 zip 打包。
避坑指南:我曾经审计过一个智能摄像头,厂商把固件放在公开的 CDN 上,URL 还是固定的。攻击者只要改个版本号,就能下载到所有历史固件。嗯,这种低级错误其实很常见。
1.3.2 逆向分析攻击面
拿到固件后,攻击者会进行逆向。常用的工具有 Binwalk、Ghidra、IDA Pro。
他们找什么?
- 硬编码凭据:比如 telnet 的 root 密码写死在代码里
- 后门接口:调试用的串口没关,或者隐藏的 Web 端点
- 加密密钥:AES 密钥、RSA 私钥直接放在固件中
我见过最离谱的一个案例:某路由器固件里,厂商把 SSH 私钥放在了 /etc/dropbear/ 目录下,而且所有设备共用同一把密钥。攻击者拿到固件后,直接就能 SSH 登录任何同型号设备。
1.3.3 运行时攻击面
固件运行起来之后,攻击面更多了。
| 攻击类型 | 常见入口 | 危害等级 |
|---|---|---|
| 缓冲区溢出 | Web 接口、网络协议栈 | 高危 |
| 命令注入 | CGI 脚本、管理界面 | 高危 |
| 堆溢出 | 内存管理模块 | 中高危 |
| 格式化字符串 | 日志输出、调试接口 | 中危 |
为什么会这样?因为很多嵌入式设备用的都是老旧的 Linux 内核,或者干脆是裸机程序。没有 ASLR、没有堆栈保护,攻击者一个缓冲区溢出就能拿到 shell。
我记得有个项目,客户说他们的智能电表「绝对安全」。结果我随手试了个长 URL,直接触发了 Web 服务器的缓冲区溢出。嗯,那场面挺尴尬的。
1.3.4 供应链攻击面
这个攻击面最隐蔽,也最难防。
攻击者不直接攻击设备,而是污染固件的开发或分发环节:
- SDK 后门:芯片厂商提供的 SDK 里就藏着恶意代码
- 编译链投毒:在编译器里植入后门,编译出的固件自动带毒
- 更新服务器劫持:伪造固件更新包,签名校验被绕过
注意:供应链攻击最难检测,因为恶意代码是在「信任链」内部植入的。你审计固件时,即使代码写得再干净,如果 SDK 本身有问题,那一切都是白搭。
我曾经帮一家车厂做 T-Box 审计,发现他们用的某款通信模组,SDK 里自带了一个调试用的 telnet 服务。厂商说「出厂时我们会关掉」,但代码里只是注释掉了启动脚本。攻击者只要取消注释,重新编译,就能开启后门。这种问题,靠常规的代码审计根本发现不了。
小结
固件安全,说白了就是「守住硬件的最底层」。攻击者只要突破这一层,上面所有的安全措施都形同虚设。
我个人习惯把固件审计分成三步:拿得到、读得懂、攻得破。后面的章节,我会一步步带你走完这三个阶段。今天先把攻击面理清楚,后面才好对症下药。
本章核心要点:
- 固件是硬件和软件之间的桥梁,拥有最高权限
- 固件被攻破后,攻击者可持久化驻留,难以清除
- 四大攻击面:提取、逆向、运行时、供应链
- 供应链攻击最隐蔽,需要从信任链角度思考
公众号:蓝海资料掘金营,微信deep3321