1. MQTT协议安全威胁全景:从嗅探到中间人攻击
各位同学,咱们今天聊点实在的。MQTT 这协议,说白了就是物联网世界的"信使"。设备多、网络杂、带宽小,MQTT 正好能扛。但问题来了——它设计之初,压根没把安全放在第一位。
我最早接触 MQTT 是在一个智能楼宇项目里。当时客户说"内网没事",结果上线第三天,有人用 Wireshark 抓包,直接把温控器的控制指令全读出来了。嗯,从那以后,我再也不敢信"内网安全"这四个字。
这一章,咱们就把 MQTT 面临的安全威胁从头到尾捋一遍。你想想看,攻击者能干什么?
核心观点:MQTT 协议本身不加密、不认证、不授权。所有安全能力,全靠上层叠加。不理解威胁,就做不好防护。
1.1 嗅探攻击:明文传输的"裸奔"风险
MQTT 默认走 TCP 1883 端口,数据是明文。这意味着,只要攻击者能接入同一网络,就能用 Wireshark、tcpdump 这类工具,把 PUBLISH 报文里的 payload 看得一清二楚。
我在一个智慧农业项目里遇到过类似情况。传感器把土壤湿度、温度数据通过 MQTT 发到云端,结果被隔壁大棚的"技术爱好者"抓包分析,直接抄走了我们的灌溉策略。你说气不气?
嗅探能拿到什么?
- Topic 名称——暴露业务逻辑,比如
factory/zone1/temperature - Payload 内容——传感器数值、控制指令、设备状态
- Client ID——设备身份标识,可被用于伪造
- Username/Password——如果使用明文认证,直接泄露
避坑指南:我曾经见过一个项目,开发人员把数据库密码直接写在 MQTT payload 里下发。抓包一看,全裸。记住:MQTT 报文里永远不要放敏感信息,除非你用了 TLS。
1.2 中间人攻击:最危险的"窃听+篡改"组合
嗅探只是"看",中间人攻击(MITM)是"看+改"。攻击者通过 ARP 欺骗、DNS 劫持或伪造 Broker,在客户端和 Broker 之间插入一个"代理"。
为什么说它最危险?因为攻击者不仅能偷看数据,还能篡改指令。比如,你发了一条"关闭阀门"的指令,攻击者改成"打开阀门",后果可想而知。
我参与过一个工业边缘计算项目,现场网络环境复杂,有人伪造了一个假的 MQTT Broker。设备连上去之后,所有数据都被劫持。还好我们做了 Broker 证书校验,不然整个产线都得停。
MITM 的常见手法:
- ARP 欺骗——局域网内,伪造网关 MAC,劫持流量
- DNS 劫持——把 Broker 域名指向攻击者 IP
- 伪造 Broker——部署同名 Broker,诱导设备连接
- SSL Stripping——强制降级到明文连接
个人建议:客户端一定要做 Broker 证书的强校验,别只检查域名。我习惯在代码里固定 CA 证书的指纹,这样就算 DNS 被劫持,证书对不上也连不上。
1.3 身份伪造与未授权访问
MQTT 协议本身没有强制认证机制。CONNECT 报文里的 username/password 是可选的,而且很多 Broker 默认允许匿名连接。
你想想看,一个匿名客户端连上 Broker,订阅了 # 通配符,所有设备的 Topic 都能看到。这不是"裸奔"是什么?
常见的身份攻击包括:
- 匿名连接——无需任何凭证,直接连 Broker
- 弱口令爆破——用常见密码字典尝试登录
- Client ID 冲突——伪造相同 Client ID,踢掉合法设备
- Token 泄露——JWT 或 Token 被截获后重放
| 攻击类型 | 影响范围 | 常见场景 |
|---|---|---|
| 匿名连接 | 全 Topic 可订阅 | 开发环境未配置认证 |
| 弱口令爆破 | 单个设备或 Broker | 使用默认密码的设备 |
| Client ID 冲突 | 特定设备离线 | 攻击者主动踢掉合法设备 |
| Token 重放 | 会话劫持 | Token 未绑定 IP 或设备指纹 |
1.4 拒绝服务攻击:让 Broker 直接"躺平"
MQTT Broker 的资源是有限的。攻击者可以通过大量 CONNECT 报文、超大 Payload 或高频 PUBLISH,把 Broker 的 CPU、内存、连接数打满。
我记得有个车联网项目,测试阶段有人写了个脚本,每秒发 10000 个 CONNECT 请求。Broker 直接 OOM,所有在线车辆都断连了。还好是测试环境,要是生产环境,后果不敢想。
常见的 DoS 手法:
- 连接风暴——大量伪造 Client ID 发起连接
- Payload 炸弹——发送超大 payload,耗尽内存
- Topic 泛洪——订阅大量不存在的 Topic,触发 Broker 内部遍历
- 遗嘱消息滥用——利用 Will Message 机制,频繁断连触发遗嘱
我曾经踩过的坑:有个项目没限制单 IP 的连接数,结果一个摄像头模组因为网络抖动,反复重连,把 Broker 的连接池占满了。从那以后,我每个项目都会配连接速率限制和 IP 白名单。
1.5 订阅劫持与 Topic 泄露
MQTT 的 Topic 是分层的,比如 factory/zone1/sensor/temperature。如果权限控制不到位,攻击者可以通过订阅 # 或 +/sensor/# 拿到所有数据。
更隐蔽的是,有些 Broker 在客户端订阅不存在的 Topic 时,会返回"订阅失败"或"Topic 不存在"的提示。攻击者可以利用这个特性,反向探测你的 Topic 结构。
Topic 泄露的危害:
- 暴露业务拓扑——知道你有几个工厂、几个区域、什么设备
- 定位敏感数据——比如
admin/command这种 Topic - 辅助其他攻击——结合嗅探数据,精准篡改指令
个人习惯:我一般会在 Broker 层面做 Topic ACL,每个设备只能订阅/发布特定前缀的 Topic。而且,我会把控制指令和传感器数据分到不同的 Topic 层级,方便做细粒度权限控制。
1.6 安全威胁全景图
下面这张图,是我梳理的 MQTT 安全威胁全景。从网络层到应用层,每个环节都有对应的攻击面。
1.7 威胁优先级与应对思路
威胁这么多,不可能一次性全防住。我个人的经验是,按优先级来:
- 第一优先级:加密与认证——TLS + 证书,防嗅探和 MITM
- 第二优先级:访问控制——ACL + 密码策略,防未授权访问
- 第三优先级:资源保护——连接限制 + Payload 校验,防 DoS
- 第四优先级:监控与审计——日志 + 告警,发现异常行为
一句话总结:MQTT 的安全,不是协议本身能解决的。它需要你在网络层、传输层、应用层层层设防。后面的章节,咱们会一个一个拆解这些防护手段。