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)升级是边缘网关最常用的功能,也是最容易被攻击的环节。攻击路径通常是这样:

  1. 中间人攻击:劫持升级流量,替换固件包。如果没做签名校验,攻击者直接塞一个带后门的固件进去。
  2. 重放攻击:抓取合法的升级包,在设备下次升级时重放一个旧版本(含已知漏洞)。
  3. 降级攻击:强制设备回退到有漏洞的固件版本,然后利用漏洞提权。

我曾经帮一家物联网公司做安全审计,发现他们的OTA升级只做了简单的CRC校验,连签名都没有。攻击者只要在同一个Wi-Fi网络里,用ARP欺骗就能劫持升级流量。说白了,没有签名的OTA,等于把设备的管理权拱手让人。

💡 避坑指南: 我曾经见过一个产品,签名算法用了RSA-512,密钥硬编码在固件里。这比不签名好不了多少。建议使用RSA-2048或ECDSA,密钥存储在安全元件(SE)或TEE中。

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、绕过安全启动

做威胁建模时,我通常按这个步骤走:

  1. 画数据流图:把固件的启动流程、升级流程、通信流程画出来,标出每个数据流的起点、终点、存储位置。
  2. 逐节点分析:对每个数据流节点,问自己“这个节点可能被STRIDE中的哪几种威胁攻击?”
  3. 评估风险等级:用DREAD模型(Damage, Reproducibility, Exploitability, Affected Users, Discoverability)打分,优先处理高风险项。
  4. 制定缓解措施:针对每个威胁,给出具体的加固方案。
🔑 核心原则: 威胁建模不是一次性的工作。固件每更新一个版本、每引入一个新组件,都要重新做一遍。我见过最惨的案例是:产品上市前做了威胁建模,但后续三个大版本都没重新评估,结果新引入的第三方库直接开了个后门。

2.3.2 固件威胁建模实战流程

下面这张图是我自己总结的固件威胁建模流程,你可以直接拿来用:

固件威胁建模实战流程 1. 识别资产 2. 绘制数据流图 3. STRIDE威胁分析 4. DREAD风险评估 5. 制定缓解措施 迭代更新 每个版本迭代都要重新走一遍流程,特别是引入新组件或新功能时

2.3.3 一个实战案例

我拿一个真实的边缘网关项目举例。当时我们做威胁建模,发现OTA升级流程存在三个高风险威胁:

  • Spoofing:升级服务器没有证书校验,攻击者可以伪造服务器下发恶意固件。
  • Tampering:固件包没有数字签名,攻击者可以篡改升级包内容。
  • Denial of Service:升级过程中断电会导致设备变砖,没有恢复机制。

对应的缓解措施:

  1. 升级服务器启用TLS双向认证,设备端预置CA证书。
  2. 固件包使用ECDSA签名,设备启动时校验签名,签名失败拒绝启动。
  3. 采用A/B分区升级方案,升级失败自动回滚到上一个正常分区。

做完这些,我们又重新评估了一遍风险等级,把三个高风险都降到了中低风险。嗯,威胁建模的价值就在这里——让你在攻击发生之前,就把漏洞堵上。

💡 个人建议: 威胁建模的文档一定要和固件代码一起版本管理。我习惯在Git仓库里建一个 docs/threat_model/ 目录,每次固件迭代都更新对应的威胁模型。这样审计的时候,你能清楚地看到每个版本解决了哪些威胁。

好了,这一章的内容就到这里。攻击面、攻击向量、威胁建模方法论,这三样东西是固件安全分析的基石。你拿着这套框架去分析任何一个边缘网关,都能快速找到它的薄弱环节。