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 攻击手法:

  1. 中间人攻击:劫持升级包,替换成恶意固件
  2. 重放攻击:抓取合法的升级包,反复刷入旧版本(降级攻击)
  3. 固件提取:通过分析 OTA 协议,逆向出固件格式

我记得有个智能家居项目,OTA 升级包用 HTTP 明文传输,连个校验都没有。攻击者在公共 Wi-Fi 上做了个 ARP 欺骗,把升级包换成了自己的。结果全小区 200 多台设备一夜之间全部「叛变」。

1.2.3 外设接口攻击面

物理接口是最容易被忽视的攻击面。很多工程师觉得「设备在我手里,谁能碰得到?」

你想想看,产品卖出去以后,用户就是攻击者。他们可以:

  • 用逻辑分析仪抓 UART 数据,拿到调试日志
  • 用 SPI Flash 编程器直接读取固件
  • 用 JTAG/SWD 调试器接管 CPU 控制权

我曾经帮客户做渗透测试,只用了 30 块钱买了个 USB 逻辑分析仪,就抓到了他们产品的串口登录密码。密码是 admin123。嗯,你没看错,出厂默认密码都没改。

⚠️ 警告: 不要低估物理接触攻击。攻击者只要有 5 分钟接触设备的机会,就能做很多事。JTAG/SWD 接口在生产后必须熔断或禁用,UART 日志不要打印敏感信息。

1.3 安全防护的必要性

说了这么多攻击,你可能会问:「我的产品就是个传感器,谁闲得没事来攻击我?」

我跟你讲个真实案例。有个做智能水表的客户,也觉得没人会攻击他们。结果呢?某个黑客团体为了「炫技」,远程批量篡改了 1000 多块水表的固件,把用水量全部改成 0。自来水公司损失了几十万水费。

安全防护不是「有没有必要」的问题,而是「什么时候做」的问题。我个人习惯是在产品设计阶段就把安全架构定好,而不是等出了问题再打补丁。

防护的核心目标就三个:

  • 防提取:让攻击者拿不到你的固件二进制
  • 防篡改:即使拿到了,改了也无法运行
  • 防注入:阻止恶意代码在设备上执行

而实现这些目标,最核心的手段就是——签名包机制。这也是咱们这门课的主题。

下面这张图,帮你理清本章的知识脉络:

固件安全威胁全景图 固件安全威胁 逆向工程 固件篡改 代码注入 Bootloader OTA 升级 外设接口 防护目标:防提取 → 防篡改 → 防注入 核心手段:签名包机制

从这张图你能看到,攻击类型和攻击面是交织的。逆向工程可能通过外设接口实现,篡改可能通过 OTA 完成,注入可能发生在 Bootloader 阶段。而签名包机制,就是把这些攻击路径全部堵死的核心手段。