2、固件安全威胁模型:攻击面、攻击向量与威胁建模方法论
做固件安全,第一件事不是拿起IDA就开始逆向。你得先搞清楚:敌人能从哪些地方下手?
我见过太多团队,花了大半年把固件写得滴水不漏,结果OTA升级接口裸奔,攻击者直接远程替换了整个文件系统。说白了,不知道敌人从哪里来,你防得再严也是白搭。
这一章,我们就来梳理边缘网关固件的攻击面、常见攻击向量,以及一套实用的威胁建模方法论。嗯,这里面的坑,我基本都踩过一遍。
2.1 固件攻击面分析
攻击面,就是攻击者能接触到固件的所有入口。我把它们分成三大类:物理面、网络面、供应链面。
| 攻击面分类 | 具体入口 | 攻击难度 | 危害等级 |
|---|---|---|---|
| 物理面 | JTAG/SWD调试接口、UART串口、SPI Flash引脚、SD卡槽、USB口 | 中 | 极高 |
| 网络面 | OTA升级接口、Web管理后台、MQTT/CoAP协议栈、SSH/Telnet服务、云平台API | 低-中 | 高 |
| 供应链面 | 第三方SDK、开源组件、固件编译工具链、硬件代工厂、镜像分发渠道 | 高 | 极高 |
你想想看,一个边缘网关放在工厂车间里,物理接触几乎不受限制。攻击者只要拆开外壳,用夹子夹住SPI Flash的引脚,整个固件就被读走了。我在一次现场评估中就遇到过这种情况——客户说他们的网关很安全,结果我花了15分钟,用树莓派加几个杜邦线,就把固件完整dump了出来。
2.2 常见攻击向量
攻击面是入口,攻击向量是具体的攻击手法。我挑三个最要命的讲:OTA劫持、物理提取、供应链植入。
2.2.1 OTA劫持
OTA(Over-The-Air)升级是边缘网关最常用的功能,也是最容易被攻击的环节。攻击路径通常是这样:
- 中间人攻击:劫持升级流量,替换固件包。如果没做签名校验,攻击者直接塞一个带后门的固件进去。
- 重放攻击:抓取合法的升级包,在设备下次升级时重放一个旧版本(含已知漏洞)。
- 降级攻击:强制设备回退到有漏洞的固件版本,然后利用漏洞提权。
我曾经帮一家物联网公司做安全审计,发现他们的OTA升级只做了简单的CRC校验,连签名都没有。攻击者只要在同一个Wi-Fi网络里,用ARP欺骗就能劫持升级流量。说白了,没有签名的OTA,等于把设备的管理权拱手让人。
2.2.2 物理提取
物理提取是最直接、最暴力的攻击方式。攻击者拿到设备后,通过硬件接口直接读取固件内容。
- SPI Flash读取:用编程器夹住Flash芯片的引脚,直接读出二进制镜像。这是最常用的手法。
- JTAG/SWD调试:如果调试接口没锁,攻击者可以直接连接CPU,读取整个内存空间,甚至单步调试固件。
- UART串口:很多设备在启动时会通过串口输出内核日志,里面可能包含文件系统挂载信息、IP地址、甚至root密码。
- 冷启动攻击:对DRAM模块降温,然后快速重启读取内存中的残留数据(比如加密密钥)。
嗯,这里要注意:物理提取的防护成本其实不高。比如在量产时烧断JTAG保险丝、对SPI Flash进行读保护、在UART上增加电平转换芯片让信号不易被直接监听——这些措施花不了几毛钱,但能挡住90%的脚本小子。
2.2.3 供应链植入
供应链攻击是最隐蔽、最难追溯的。攻击者不是在设备出厂后攻击,而是在生产或开发阶段就埋下后门。
| 供应链环节 | 植入方式 | 检测难度 |
|---|---|---|
| 第三方SDK | 在SDK中插入恶意代码,比如收集设备信息的后门 | 高 |
| 开源组件 | 使用被投毒的npm/PyPI包,或带有CVE漏洞的旧版本库 | 中 |
| 编译工具链 | 在编译器或链接器中植入后门,编译出的每个固件都带毒 | 极高 |
| 硬件代工厂 | 在Flash芯片中预烧录带后门的固件,或替换为有后门的芯片 | 极高 |
我记得有个真实案例:某厂商的智能门锁,固件里莫名其妙多了一个UDP监听端口。后来查了半年,发现是供应商提供的Wi-Fi模组SDK里自带了一个调试后门。你想想看,你信任的第三方,可能正在帮你“开门”。
2.3 威胁建模方法论
知道了攻击面和攻击向量,接下来就是系统性地做威胁建模。我个人习惯用STRIDE模型,它把威胁分成六类,覆盖了固件安全的方方面面。
2.3.1 STRIDE模型
| 威胁类型 | 含义 | 固件场景举例 |
|---|---|---|
| Spoofing(欺骗) | 冒充合法实体 | 伪造OTA升级服务器、伪造设备身份 |
| Tampering(篡改) | 修改数据或代码 | 篡改固件镜像、修改配置文件、注入恶意代码 |
| Repudiation(抵赖) | 否认做过某操作 | 设备否认执行过恶意指令、日志被删除 |
| Information Disclosure(信息泄露) | 敏感数据被窃取 | 固件被dump、密钥被提取、用户数据泄露 |
| Denial of Service(拒绝服务) | 系统不可用 | 刷入损坏固件导致变砖、耗尽Flash寿命 |
| Elevation of Privilege(权限提升) | 获得更高权限 | 从用户态提权到root、绕过安全启动 |
做威胁建模时,我通常按这个步骤走:
- 画数据流图:把固件的启动流程、升级流程、通信流程画出来,标出每个数据流的起点、终点、存储位置。
- 逐节点分析:对每个数据流节点,问自己“这个节点可能被STRIDE中的哪几种威胁攻击?”
- 评估风险等级:用DREAD模型(Damage, Reproducibility, Exploitability, Affected Users, Discoverability)打分,优先处理高风险项。
- 制定缓解措施:针对每个威胁,给出具体的加固方案。
2.3.2 固件威胁建模实战流程
下面这张图是我自己总结的固件威胁建模流程,你可以直接拿来用:
2.3.3 一个实战案例
我拿一个真实的边缘网关项目举例。当时我们做威胁建模,发现OTA升级流程存在三个高风险威胁:
- Spoofing:升级服务器没有证书校验,攻击者可以伪造服务器下发恶意固件。
- Tampering:固件包没有数字签名,攻击者可以篡改升级包内容。
- Denial of Service:升级过程中断电会导致设备变砖,没有恢复机制。
对应的缓解措施:
- 升级服务器启用TLS双向认证,设备端预置CA证书。
- 固件包使用ECDSA签名,设备启动时校验签名,签名失败拒绝启动。
- 采用A/B分区升级方案,升级失败自动回滚到上一个正常分区。
做完这些,我们又重新评估了一遍风险等级,把三个高风险都降到了中低风险。嗯,威胁建模的价值就在这里——让你在攻击发生之前,就把漏洞堵上。
docs/threat_model/ 目录,每次固件迭代都更新对应的威胁模型。这样审计的时候,你能清楚地看到每个版本解决了哪些威胁。
好了,这一章的内容就到这里。攻击面、攻击向量、威胁建模方法论,这三样东西是固件安全分析的基石。你拿着这套框架去分析任何一个边缘网关,都能快速找到它的薄弱环节。