1. 安全威胁概述:固件面临的常见攻击类型
大家好,我是你们这堂课的主讲人。咱们开门见山,先聊聊一个扎心的问题:你的固件,真的安全吗?
我做了十几年嵌入式安全,见过太多产品上市后被秒破的案例。说实话,很多团队把精力全放在功能开发上,觉得安全是「上线后再补」的事。结果呢?要么被抄板,要么被远程控制,要么直接变砖。
这一章,咱们先把敌人看清楚。你只有知道攻击者会从哪下手,才能把防护做到位。
1.1 固件面临的常见攻击类型
攻击固件的手段,说白了就三大类。我按危害程度排个序:
1.1.1 逆向工程
这是最基础、也最致命的一步。攻击者拿到你的固件二进制,用反汇编工具一读,你的算法、协议、密钥全暴露了。
我记得有个客户,产品用了三年都没事。结果竞品买了台设备,把 Flash 芯片吹下来,用编程器读出固件,直接克隆了整套逻辑。嗯,这就是典型的「物理逆向」。
ST-Link 或 J-Link 配合电压毛刺就能绕过读保护的案例。硬件逆向的门槛,比你想象的低得多。
1.1.2 固件篡改
篡改比逆向更危险。攻击者不光看你的代码,还改你的代码。
举个例子:一个智能门锁,攻击者把固件里「验证指纹是否匹配」的函数直接 NOP 掉(就是改成空操作)。你想想看,这锁还安全吗?
篡改的常见手法包括:
- 二进制补丁:直接修改 Flash 中的机器码
- 函数挂钩:替换关键函数的入口地址
- 数据段篡改:修改配置参数、白名单、阈值
我在项目中遇到过最离谱的一次,是攻击者把 OTA 升级包的校验函数给 patch 了。结果后续所有恶意固件都能正常刷入。你说这锅该谁背?
1.1.3 代码注入
注入攻击,就是攻击者把恶意代码「塞」进你的固件运行空间。常见场景包括:
- 缓冲区溢出:利用栈溢出覆盖返回地址,跳转到 shellcode
- 格式化字符串漏洞:通过
printf类函数泄露或改写内存 - 命令注入:在输入参数中嵌入系统命令
我曾经帮一个路由器厂商做安全审计,发现他们的 Web 管理界面有个 ping 功能。你输入 IP,它直接拼到系统命令里执行。攻击者输入 127.0.0.1; rm -rf /,你猜会发生什么?
1.2 攻击面分析
攻击面,就是攻击者能接触到固件的所有入口。我把它分成三个主要维度:
| 攻击面 | 典型入口 | 攻击难度 | 常见后果 |
|---|---|---|---|
| Bootloader | 串口、USB DFU、SD 卡启动 | 中 | 刷入恶意固件、绕过签名校验 |
| OTA 升级 | 网络、蓝牙、NFC | 低-中 | 远程控制、批量变砖 |
| 外设接口 | UART、SPI、I2C、JTAG/SWD | 低 | 固件提取、调试接口劫持 |
1.2.1 Bootloader 攻击面
Bootloader 是芯片上电后第一个执行的代码。它负责初始化硬件、校验主固件、决定启动哪个镜像。
问题在哪?很多 Bootloader 为了调试方便,留了「后门」:
- 按住某个 GPIO 进入下载模式
- 串口输入特定字符跳过校验
- 支持从外部存储(SD 卡、U 盘)启动
我见过一个工业控制器,Bootloader 里有个隐藏命令:输入 debug 就能直接进入固件烧录模式,连密码都不用。你说这设计是不是给攻击者铺红地毯?
strings 命令把你的固件翻个底朝天。
1.2.2 OTA 升级攻击面
OTA 是攻击者的最爱。为什么?因为它是远程的,而且通常涉及网络传输。
常见的 OTA 攻击手法:
- 中间人攻击:劫持升级包,替换成恶意固件
- 重放攻击:抓取合法的升级包,反复刷入旧版本(降级攻击)
- 固件提取:通过分析 OTA 协议,逆向出固件格式
我记得有个智能家居项目,OTA 升级包用 HTTP 明文传输,连个校验都没有。攻击者在公共 Wi-Fi 上做了个 ARP 欺骗,把升级包换成了自己的。结果全小区 200 多台设备一夜之间全部「叛变」。
1.2.3 外设接口攻击面
物理接口是最容易被忽视的攻击面。很多工程师觉得「设备在我手里,谁能碰得到?」
你想想看,产品卖出去以后,用户就是攻击者。他们可以:
- 用逻辑分析仪抓 UART 数据,拿到调试日志
- 用 SPI Flash 编程器直接读取固件
- 用 JTAG/SWD 调试器接管 CPU 控制权
我曾经帮客户做渗透测试,只用了 30 块钱买了个 USB 逻辑分析仪,就抓到了他们产品的串口登录密码。密码是 admin123。嗯,你没看错,出厂默认密码都没改。
1.3 安全防护的必要性
说了这么多攻击,你可能会问:「我的产品就是个传感器,谁闲得没事来攻击我?」
我跟你讲个真实案例。有个做智能水表的客户,也觉得没人会攻击他们。结果呢?某个黑客团体为了「炫技」,远程批量篡改了 1000 多块水表的固件,把用水量全部改成 0。自来水公司损失了几十万水费。
安全防护不是「有没有必要」的问题,而是「什么时候做」的问题。我个人习惯是在产品设计阶段就把安全架构定好,而不是等出了问题再打补丁。
防护的核心目标就三个:
- 防提取:让攻击者拿不到你的固件二进制
- 防篡改:即使拿到了,改了也无法运行
- 防注入:阻止恶意代码在设备上执行
而实现这些目标,最核心的手段就是——签名包机制。这也是咱们这门课的主题。
下面这张图,帮你理清本章的知识脉络:
从这张图你能看到,攻击类型和攻击面是交织的。逆向工程可能通过外设接口实现,篡改可能通过 OTA 完成,注入可能发生在 Bootloader 阶段。而签名包机制,就是把这些攻击路径全部堵死的核心手段。