MQTT协议安全分析与条件竞争漏洞利用
字数 1817 2025-12-17 12:18:44
MQTT协议安全分析与条件竞争漏洞利用教学文档
一、MQTT协议概述
1.1 什么是MQTT
MQTT(Message Queuing Telemetry Transport)是一种轻量级、基于发布/订阅模式的网络通信协议,专为低带宽、高延迟、不可靠的网络环境(如物联网IoT场景)设计。
1.2 MQTT基本组成
| 组件 | 说明 |
|---|---|
| 客户端(Client) | 发布或订阅消息的设备(如手机、传感器、服务器) |
| 代理服务器(Broker) | 消息中枢,负责接收所有消息并转发给订阅者(如Mosquitto、EMQX、HiveMQ) |
| 主题(Topic) | 消息的"地址"或"频道",用于路由消息 |
二、MQTT环境搭建
2.1 MQTT Broker部署
MQTT Broker是MQTT协议架构中的核心组件,扮演"消息中枢"或"通信枢纽"的角色。推荐使用Mosquitto:
- 启动后默认监听1883端口
- 可前台运行并指定监听端口
2.2 C语言MQTT客户端开发
使用Eclipse Paho C客户端库进行开发:
关键函数详解
MQTTClient_create参数说明:
参数:
- handle:指向MQTTClient类型变量的指针
- serverURI:Broker地址(tcp://host:port、ssl://host:port、ws://host:port/path)
- clientId:必须唯一!Broker用它识别客户端
- persistence_type:持久化方式
- persistence_context:持久化上下文
持久化类型:
| 类型 | 宏定义 | 说明 |
|---|---|---|
| 无持久化 | MQTTCLIENT_PERSISTENCE_NONE | 所有状态仅保存在内存中,程序退出后消息丢失 |
| 默认文件持久化 | MQTTCLIENT_PERSISTENCE_DEFAULT | 状态保存到本地文件,重启后可恢复 |
| 用户自定义持久化 | MQTTCLIENT_PERSISTENCE_USER | 开发者提供持久化函数 |
MQTTClient_setCallbacks:
- 为MQTT客户端注册回调函数
- 在特定事件发生时自动触发用户自定义处理逻辑
MQTTClient_subscribe参数:
参数:
- handle:有效的MQTT客户端句柄
- topic:主题字符串(支持+匹配单级、#匹配多级)
- qos:客户端希望以什么QoS接收消息(0/1/2)
MQTTClient_publishMessage:
- 用于发布消息到指定主题
2.3 心跳机制(Keep Alive)
MQTT心跳是用于检测客户端与Broker之间连接有效性的保活机制。
工作机制:
- 客户端在CONNECT报文中指定保活间隔(秒)
- 如果在指定时间内没有发送任何MQTT报文,Broker认为客户端离线
- 通过设置
conn_opts.keepAliveInterval来配置心跳间隔
三、MQTT安全风险分析
3.1 认证缺失风险
如果Broker没有实施任何认证措施:
- 任何客户端都可以连接到Broker
- 可以接收所有订阅的主题消息
- 可以向任意主题发送数据
- 可能通过主题内容获取敏感信息
3.2 实际漏洞案例:pcb_2025-Heartbeat_Out_of_Bounds
漏洞分析
- 程序功能:程序订阅了diag主题,通过diag主题发送数据与题目交互
- 回调函数:使用cjson库解析JSON数据
- 认证机制:存在加密认证函数,密文会循环打印在sub_1E1A函数中
漏洞细节
- 命令注入漏洞:在set_vin分支存在命令注入漏洞
- 安全检查:输入检查只允许字符和数字,阻止特殊字符输入
- 时间窗口:命令检查和执行之间存在2秒时延
- 进程处理:启动子进程处理命令
条件竞争漏洞利用
利用原理:
- 首先传入正常的命令通过检查
- 在2秒等待时间内再次传入恶意命令
- 利用时间差绕过安全检查
EXP利用步骤:
- 通过认证机制获取合法访问权限
- 向set_vin分支发送合法命令通过检查
- 在2秒时间窗口内发送包含特殊字符的恶意命令
- 实现命令注入执行
四、安全防护建议
4.1 Broker安全配置
- 启用身份认证机制
- 实施访问控制列表(ACL)
- 使用TLS加密通信
- 定期更新Broker软件
4.2 客户端安全开发
- 输入验证和过滤
- 避免使用系统命令执行
- 实施适当的错误处理
- 使用安全的编码实践
4.3 条件竞争漏洞防护
- 消除不必要的时间延迟
- 实施原子操作
- 使用锁机制保护临界区
- 在关键操作前后进行完整性检查
五、总结
MQTT协议在物联网环境中广泛应用,但其安全性往往被忽视。通过分析实际漏洞案例,特别是条件竞争漏洞的利用方式,可以帮助开发人员和安全研究人员更好地理解MQTT协议的安全风险,并采取相应的防护措施。