横向攻击原理:Broker内部消息路由机制、Topic通符滥用、订阅劫持
好,咱们进入第四讲。前面三章我们把会话隔离的概念和整体防御思路理清了。这一章,我得带你深入敌后——看看攻击者到底是怎么在Broker内部搞横向移动的。
说白了,横向攻击的核心就三个字:借道。攻击者攻陷一个设备后,不直接去砸另一个设备,而是利用MQTT协议本身的特性,通过Broker这个“中间人”去扩散攻击。我当年在一个智慧园区项目里,就亲眼见过一台被控的灯光控制器,通过Topic广播把整个楼宇的空调系统都搞瘫痪了。那场面,真叫一个惨烈。
核心认知:MQTT横向攻击的本质,是攻击者利用Broker的消息路由机制,将恶意载荷从一个受控客户端传播到其他客户端。防御的关键,就是切断这条“借道”路径。
4.1 Broker内部消息路由机制——攻击者的高速公路
先聊聊Broker内部是怎么干活儿的。你想想看,一个客户端发一条消息到Topic A,另一个客户端订阅了Topic A,Broker就得把消息从发送端搬到接收端。这个过程,就是消息路由。
大多数Broker(比如Mosquitto、EMQX、VerneMQ)内部都维护着一张巨大的订阅树。这张树的结构大致是这样的:
- 根节点是“$SYS”或空
- 每一层Topic分段(比如
home/kitchen/temp中的home、kitchen、temp)对应树的一层 - 叶子节点挂着订阅该Topic的客户端会话信息
当一条消息到达时,Broker会从根节点开始,沿着Topic路径往下走,找到所有匹配的叶子节点,然后把消息推送给对应的客户端。这个过程非常快,但问题也出在这里——它只认Topic,不认客户端身份。
我的经验:我曾经在调试一个工业物联网项目时,发现Broker的CPU飙升。查了半天,原来是一个客户端订阅了 #(多级通配符),导致每条消息都要遍历整棵订阅树。这就是路由机制被滥用的典型例子。
攻击者一旦控制了某个设备,就可以利用这个路由机制做两件事:
- 监听:订阅高权限Topic,窃取其他设备的数据
- 投毒:向高权限Topic发布恶意指令,控制其他设备
下面这张图,就是攻击者利用Broker内部路由进行横向扩散的完整路径:
4.2 Topic通配符滥用——攻击者的万能钥匙
MQTT的通配符设计,本来是为了方便订阅一组Topic。但在我眼里,它也是攻击者最趁手的武器。
MQTT有两个通配符:
- +(单级通配符):匹配一层,比如
home/+/temp可以匹配home/kitchen/temp和home/bedroom/temp - #(多级通配符):匹配剩余所有层,比如
home/#可以匹配home/kitchen/temp、home/kitchen/humidity等
攻击者一旦拿到设备权限,第一件事就是尝试订阅 #。为什么?因为只要Broker没有做权限控制,这个订阅就能让他看到整个Broker上所有的消息流量。
警告:千万不要在生产环境中给任何客户端开放 # 订阅权限,除非你100%确定这个客户端是可信的管理终端。我曾经见过一个项目,所有设备都用同一个Client ID,并且订阅了 #,结果一台传感器被攻破后,整个工厂的生产数据全部泄露。
通配符滥用的常见场景:
| 攻击场景 | 使用的通配符 | 攻击效果 |
|---|---|---|
| 全局监听 | # |
窃取Broker上所有Topic的消息 |
| 横向扫描 | +/+/status |
枚举所有设备的在线状态 |
| 指令注入 | +/+/cmd |
向所有设备发送控制指令 |
| 配置篡改 | +/config |
修改所有设备的配置参数 |
你想想看,如果攻击者订阅了 +/+/cmd,他就能向所有设备发送 reboot 指令。我一个朋友在智能家居公司,就遇到过这种攻击——攻击者通过一个被控的智能灯泡,向全屋的智能插座发送了 power/off 指令,整栋别墅瞬间断电。
4.3 订阅劫持——攻击者的潜伏术
订阅劫持,比通配符滥用更隐蔽。攻击者不直接订阅 #,而是通过一些技巧,让Broker把本该发给其他客户端的消息,也发给他一份。
常见的订阅劫持手法有三种:
- 共享订阅劫持:MQTT 5.0引入了共享订阅(
$share/group/topic),用于负载均衡。攻击者如果加入同一个共享组,就能“截胡”本该发给其他客户端的消息。 - Session接管:如果Broker允许重复的Client ID登录,攻击者可以用相同的Client ID连接,把合法设备的Session踢掉,然后接管它的订阅列表。
- 通配符覆盖:攻击者订阅一个比合法设备更宽泛的Topic,比如合法设备订阅
home/kitchen/temp,攻击者订阅home/+/temp,就能收到所有房间的温度数据。
避坑指南:我曾经在一个车联网项目里,发现某款T-Box(车载终端)的固件里硬编码了订阅 vehicle/+/status。结果一个攻击者利用这个漏洞,订阅了 vehicle/+/status,轻松获取了整个车队1000多辆车的GPS位置和车速信息。修复方案很简单——每个T-Box只订阅自己VIN码对应的Topic,比如 vehicle/{VIN}/status。
订阅劫持的检测难度很大,因为它不产生异常流量。攻击者只是静静地“听”,不发出任何声音。我建议你在Broker层面开启订阅审计日志,记录每个客户端的订阅行为。一旦发现某个客户端订阅了远超其职责范围的Topic,立刻告警。
4.4 攻击链全景:从入侵到横向扩散
把上面三个环节串起来,就是一条完整的横向攻击链:
- 初始入侵:攻击者通过漏洞或弱口令控制一个边缘设备
- 权限探测:攻击者利用该设备订阅
#或+/+/status,探测Broker上的Topic空间 - 目标锁定:通过监听消息,发现高价值设备(如网关、控制器)的Topic
- 横向移动:向目标设备的控制Topic发布恶意指令
- 权限提升:如果目标设备有更高权限,攻击者可以进一步扩大攻击范围
这个攻击链中,第2步和第4步是我们可以通过会话隔离策略来阻断的。具体怎么做?下一章我会详细讲。但这里先给你一个预告——核心思路就是:让每个会话只能看到它该看到的Topic,多一个都不行。
本章小结:
- Broker内部的消息路由机制,是横向攻击的“高速公路”
- Topic通配符
#和+是攻击者的“万能钥匙” - 订阅劫持通过共享订阅、Session接管、通配符覆盖实现隐蔽监听
- 完整的横向攻击链包括:入侵 → 探测 → 锁定 → 移动 → 提升