4. 安全威胁建模:STRIDE威胁模型在配网场景的应用
做物联网安全这么多年,我越来越觉得一件事:不懂威胁建模的安全方案,基本等于裸奔。你想想看,连敌人都不知道是谁、从哪来、想干嘛,你怎么防?
这一章,我们就拿STRIDE模型,把BLE配网场景从头到尾过一遍筛子。我当年第一次做配网安全审计时,就是靠这个模型挖出了好几个致命漏洞——嗯,其中一个还是我自己写的代码。
4.1 STRIDE模型快速回顾
STRIDE是微软提出的威胁分类框架,每个字母代表一类威胁:
| 字母 | 威胁类型 | 配网场景举例 |
|---|---|---|
| S | Spoofing(假冒) | 攻击者伪造合法设备身份 |
| T | Tampering(篡改) | 修改配网数据包中的WiFi凭据 |
| R | Repudiation(抵赖) | 设备否认曾发起过配网请求 |
| I | Information Disclosure(信息泄露) | WiFi密码被窃听 |
| D | Denial of Service(拒绝服务) | 大量虚假配网请求耗尽设备资源 |
| E | Elevation of Privilege(权限提升) | 从普通设备获取管理员权限 |
说白了,STRIDE就是一张安全检查清单。你对着这张表,把配网流程的每个环节都问一遍「这里能不能被攻击?」,漏洞自然就浮出来了。
我的经验:别试图一次性覆盖所有STRIDE类别。我习惯的做法是——先聚焦S、T、I这三类,因为它们跟配网安全最相关。剩下的R、D、E,可以在后续迭代中补上。
4.2 中间人攻击(MITM)分析
MITM在BLE配网里有多常见?非常常见。BLE的广播和连接过程本身没有强制加密,攻击者只要在信号范围内,就能插一脚。
典型的MITM攻击流程是这样的:
- 攻击者同时伪装成「手机」和「设备」
- 对手机说:「我就是你要配网的那个设备」
- 对设备说:「我就是你的配网手机」
- 两边数据都经过攻击者中转,密码被一览无余
为什么会这么容易?因为BLE的配对过程如果选择了Just Works方式,就没有任何用户验证环节。攻击者只需要在信号范围内,就能建立两条独立的连接。
避坑指南:我曾经在一个智能门锁项目里,发现产品经理为了「用户体验」选了Just Works配对。我当场演示了MITM攻击——用一台树莓派Zero W,在10秒内拿到了门锁的管理密码。从那以后,那个项目再也没人提Just Works了。
防御MITM,核心就两招:
- 使用OOB(带外)配对:比如通过扫码或NFC交换配对密钥
- 启用LE Secure Connections:强制使用ECDH密钥交换,防止中间人插入
4.3 重放攻击与暴力破解
重放攻击,说白了就是「录下来,再放一遍」。攻击者不需要破解你的加密,只需要原封不动地重发之前抓到的合法数据包。
在BLE配网场景里,重放攻击的典型目标是:
- 配网请求包
- WiFi凭据传输包
- 设备认证令牌
怎么防?我一般用这三种手段:
| 防御手段 | 原理 | 实现难度 |
|---|---|---|
| 时间戳+窗口 | 每个包携带时间戳,接收方只接受窗口内的包 | 低 |
| 随机数挑战 | 每次通信前,双方交换随机数,保证每次数据唯一 | 中 |
| 序列号递增 | 每个设备维护单调递增的序列号,重复包直接丢弃 | 低 |
至于暴力破解,嗯,这个更头疼。BLE配网时,如果PIN码或配对码太短,攻击者可以在几秒内穷举所有可能。
我的建议:BLE配网中,永远不要使用6位数字PIN作为唯一安全措施。我在一个智能灯泡项目里见过这种设计——攻击者用手机APP,3分钟就破解了所有灯泡的配网PIN。后来我们改成了6位字母+数字混合码,破解时间从3分钟变成了3年。
4.4 隐私泄露风险
很多人只关心WiFi密码会不会被偷,却忽略了隐私泄露这个更大的坑。
BLE配网过程中,可能泄露的隐私信息包括:
- 设备MAC地址:可被用于追踪用户位置
- WiFi SSID:暴露用户家庭网络信息
- 设备类型和固件版本:帮助攻击者定位漏洞
- 用户地理位置:通过信号强度估算
我记得有个真实案例:某智能家居厂商的配网APP,在配网过程中会广播设备的完整固件版本号。攻击者收集这些信息后,发现某个旧版本存在远程代码执行漏洞——结果就是,超过10万台设备被远程控制。
关键原则:配网过程中,只暴露最少必要信息。能不发MAC地址就不发,能用随机地址就用随机地址,能隐藏固件版本就隐藏。你暴露的每一条信息,都可能成为攻击者的突破口。
4.5 本章知识体系总览
下面这张图,把STRIDE模型在BLE配网场景中的映射关系画出来了。我建议你把它存下来,做安全审计时对着看:
实用技巧:每次做新项目的配网安全设计,我都会打印一张STRIDE检查表贴在工位上。每完成一个功能,就在对应的威胁类别上打个勾。这个方法帮我避免过至少3次上线前的紧急修复——嗯,都是因为提前发现了MITM的漏洞。
好了,这一章的内容就到这里。记住一句话:威胁建模不是一次性的工作,而是贯穿整个开发周期的习惯。下次写配网代码前,先花10分钟过一遍STRIDE,你会发现很多问题在代码层面就能避免。