4. 蓝牙网关安全威胁模型:常见攻击向量与攻击面分析
做蓝牙网关安全,第一件事不是写代码,而是搞清楚——谁会攻击你?从哪下手?
我入行那会儿,总觉得蓝牙通信距离短,攻击者够不着。后来在客户现场亲眼看到有人用一根树莓派加个USB蓝牙dongle,站在大楼外就把一层楼的蓝牙网关给嗅了个遍。嗯,从那以后我再也不敢低估攻击者的物理接近能力了。
这一章,咱们把蓝牙网关的威胁模型掰开揉碎。我会从攻击向量和攻击面两个维度来讲。说白了,攻击向量是攻击者用的“招式”,攻击面是你能被攻击的“破绽”。
4.1 四大常见攻击向量
蓝牙网关面临的攻击,归纳起来就四类。我按危害程度排了个序,你感受一下。
| 攻击类型 | 攻击目标 | 危害等级 | 常见场景 |
|---|---|---|---|
| 嗅探攻击 | 窃取通信数据 | 中 | 被动监听,收集设备信息 |
| 中间人攻击 | 篡改/劫持通信 | 高 | 配对过程、密钥协商 |
| 重放攻击 | 伪造合法指令 | 高 | 门锁、开关控制 |
| 拒绝服务攻击 | 使网关瘫痪 | 中-高 | 连接耗尽、广播风暴 |
4.1.1 嗅探攻击
嗅探是最基础的攻击方式。攻击者不需要和网关建立连接,只需要在通信范围内打开抓包工具就行。
我记得有一次做渗透测试,客户说他们的蓝牙网关很安全,因为用了加密。结果我拿Ubertooth One在网关旁边蹲了十分钟,抓到了配对阶段的PIN码交换包——明文传输。你想想看,加密算法再强,密钥都被人看光了,还有什么用?
我曾经见过一个产品,BLE通信用了AES-128加密,但配对时的临时密钥(TK)是硬编码的“000000”。嗅探到配对包后,密钥直接暴露。所以,不要以为用了加密就万事大吉,密钥管理才是命门。
嗅探攻击能拿到什么?
- 设备MAC地址(可用于设备追踪)
- 服务UUID和特征值(暴露设备功能)
- 未加密的载荷数据(传感器读数、控制指令)
- 配对过程中的密钥材料
4.1.2 中间人攻击
中间人攻击(MITM)是蓝牙安全里最头疼的问题之一。为什么?因为蓝牙的配对过程天然存在被劫持的风险。
你想想看,两个蓝牙设备第一次见面,怎么确认对方是“真身”?如果没有带外验证(比如输入PIN码或NFC碰一碰),攻击者完全可以同时扮演两个角色——对网关假装自己是合法设备,对设备假装自己是网关。
我在一个智能门锁项目里就遇到过这种攻击。攻击者用两台手机,一台模拟门锁,一台模拟网关,在配对阶段把密钥给换了。结果网关发的“开锁”指令,攻击者能解密、篡改、再加密转发。门锁收到的是“开锁”,但实际执行的是“永久开锁”——嗯,那个漏洞后来被定为严重级别。
BLE 4.2及以上版本引入了LE Secure Connections,使用ECDH密钥交换和数字签名,能有效抵抗MITM。但前提是——双方都必须支持并启用。我在项目中见过太多“支持但不启用”的情况,等于白搭。
4.1.3 重放攻击
重放攻击听起来简单,但危害极大。攻击者不需要破解你的加密,只需要把之前抓到的合法数据包再发一遍就行。
举个例子。你家的蓝牙智能门锁,网关每天定时发送“锁定”指令。攻击者嗅探到这个指令包,虽然看不懂加密内容,但他知道这个包能让门锁执行某个操作。等主人出门后,他把这个包重放一遍——门锁收到指令,执行了“开锁”。
为什么会这样?因为很多蓝牙网关在设计时,没有给每条指令加上时间戳或序列号。网关不检查“这条指令是不是已经执行过了”,只要格式对、签名对,就照做。
在应用层协议里,每条指令必须包含单调递增的序列号或时间戳。网关收到指令后,检查序列号是否大于上次接收的值。小于等于的,直接丢弃。这个逻辑写起来不超过20行代码,但能挡住99%的重放攻击。
4.1.4 拒绝服务攻击
蓝牙网关的DoS攻击,和传统网络不太一样。蓝牙的物理层和链路层资源非常有限,攻击者不需要多大的带宽就能搞垮你。
常见的蓝牙DoS手段:
- 连接请求洪泛:攻击者伪造大量设备,不断发起连接请求。网关的连接表满了,合法设备就进不来了。
- 广播包风暴:在BLE的广播信道上发送大量无效广播包,导致网关的扫描窗口被占满。
- L2CAP分片攻击:发送畸形的L2CAP分片包,让网关的协议栈崩溃或死锁。
我测试过一个国产蓝牙芯片的网关,用一台手机连续发送1000次连接请求,网关直接重启了。后来查原因,是协议栈里连接管理模块的内存泄漏——每次连接失败,分配的内存没释放。嗯,这种问题在量产前很难发现,但一旦上线,攻击者分分钟让你下线。
4.2 攻击面分析
攻击向量是“怎么打”,攻击面是“打哪里”。我把蓝牙网关的攻击面分成四个层次,从上到下:
这个图我画了很多次。每次给团队做安全培训,我都会指着它说:攻击面越往下,攻击难度越大,但一旦得手,危害也越大。物理层攻击需要近距离接触,但能拿到最底层的数据;应用层攻击远程就能搞,但需要先摸清业务逻辑。
4.2.1 应用层攻击面
应用层是攻击者最喜欢下手的地方。为什么?因为代码是人写的,人就会犯错。
常见的应用层漏洞:
- 设备绑定逻辑缺陷:很多网关的“一键配网”功能,没有做身份验证。攻击者在配网窗口期内发送伪造的绑定请求,就能把自己注册成合法设备。
- 指令注入:如果网关把收到的蓝牙数据直接拼接到SQL查询或系统命令里,那就是经典的注入漏洞。我见过一个温控器网关,通过蓝牙发送的“温度值”直接拼到了update语句里——嗯,你懂的。
- 认证绕过:有些网关只在第一次连接时做认证,之后就用session token。如果token生成算法太简单(比如自增ID),攻击者可以伪造token。
4.2.2 协议层攻击面
协议层的攻击,需要对蓝牙协议栈有深入了解。攻击者通常会拿开源协议栈(比如Zephyr、BlueZ)做fuzz测试,找边界条件。
我印象最深的是一个ATT协议栈的漏洞。攻击者发送一个超长的Read By Type Request,协议栈在处理时没有做长度检查,直接memcpy到固定缓冲区——经典的栈溢出。利用这个漏洞,攻击者可以在网关内核态执行任意代码。
协议栈漏洞的修复周期通常很长。很多物联网设备用的蓝牙芯片,厂商提供的SDK可能几年不更新。我建议你在选型时,优先选择有活跃社区维护、定期发布安全更新的协议栈。闭源的黑盒协议栈,出了漏洞你连修都修不了。
4.2.3 链路层攻击面
链路层的攻击,核心是连接管理和跳频机制。
蓝牙的跳频(AFH)本来是为了抗干扰设计的,但跳频序列是可以预测的。攻击者只要抓到几个连接事件包,就能推算出后续的跳频模式,然后精准地在目标信道上注入干扰包。
另外,连接请求的洪泛攻击也属于链路层。网关的链路层通常有一个最大连接数限制,比如同时支持8个连接。攻击者伪造8个虚拟设备,把连接池占满,合法设备就只能排队等着——如果网关没有超时踢出机制,这个队能排到天荒地老。
4.2.4 物理层攻击面
物理层攻击,说白了就是“靠近你”。
攻击者可以用高增益天线,在100米外嗅探你的蓝牙信号。也可以用软件无线电(SDR)设备,直接发送物理层的伪随机序列,干扰你的解调。
我做过一个实验:用HackRF在2.4GHz频段上发送连续波干扰,距离网关5米,功率只有10mW。结果网关的蓝牙连接全部断开,而且重连失败——因为干扰信号把广播信道给淹没了。
物理层的攻击很难完全防御,但可以缓解。比如:
- 使用BLE的Channel Selection Algorithm #2(CSA #2),增加跳频的随机性
- 在网关部署环境中做信号强度指纹识别,检测异常的近距离信号源
- 硬件设计时,屏蔽调试接口(SWD、JTAG),防止物理提取固件
4.3 威胁建模小结
说了这么多,其实就一句话:蓝牙网关的安全,不能只盯着加密算法。
我见过太多团队,花大价钱买了AES-256加密芯片,结果应用层连基本的输入校验都没做。攻击者根本不需要破解加密,直接绕过你——你想想看,门锁得再牢,窗户开着有什么用?
做威胁建模时,我习惯用STRIDE模型过一遍:
- Spoofing:设备身份能否被伪造?
- Tampering:通信数据能否被篡改?
- Repudiation:操作日志能否被抵赖?
- Information Disclosure:敏感信息是否泄露?
- Denial of Service:服务能否被中断?
- Elevation of Privilege:权限能否被提升?
每个攻击面,都对应着STRIDE里的至少一个威胁。把这张表填满,你的安全设计才算有了方向。