鉴源实验室·基于MQTT协议的模糊测试研究

作者 | 张渊策 上海控安可信软件创新研究院工控网络安全组

来源 | 鉴源实验室

社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区”

随着物联网技术的快速发展,越来越多的设备加入到互联网中,形成了庞大的物联网系统。这些设备之间的通信对于物联网系统的正常运行至关重要。MQTT(Message Queuing Telemetry Transport)协议作为一种轻量级、灵活的消息传输协议,因其简单易用的特点被广泛应用于物联网设备之间的通信。

然而随着MQTT协议的普及,其安全性和稳定性问题也逐渐突显出来。攻击者可以利用协议本身的漏洞或者错误来对系统进行攻击,可能导致系统崩溃、信息泄露等问题。因此,对MQTT协议进行深入研究和测试,发现潜在的问题并提出解决方案,对于保障物联网系统的安全性和稳定性具有重要意义。

01

MQTT协议简介

MQTT是一种基于发布/订阅模式的轻量级消息传输协议,最初由IBM开发。它采用轻量级的、简单的消息发布和订阅机制,适用于各种网络环境和设备。MQTT协议旨在为物联网(IoT)和机器到机器(M2M)通信提供一种简单、轻量级、可靠的解决方案。以下是MQTT协议的主要特点和工作原理:

(1)MQTT的发布/订阅模式

MQTT采用发布/订阅模式,其中设备可以发布(发送)消息到特定的主题,同时其他设备可以订阅(接收)这些主题的消息。这种模式使得设备之间的通信变得松耦合,设备可以独立于彼此进行通信,而不需要直接相互交互。在通信过程中主要包括三个角色:

· 发布者(Publisher):负责发布消息的设备或应用程序。

· 订阅者(Subscriber):负责订阅感兴趣的主题,并接收相关的消息。

· 代理服务器(Broker):负责接收来自发布者的消息,并将其传递给订阅者。

其中代理服务器是MQTT通信的中间人。在MQTT通信中需要一个中间人(Broker)来协调消息的发布和订阅。客户端向Broker发送消息,并由Broker负责将消息路由给对应的订阅者。具体拓扑图见图1:

图1 MQTT通信拓扑图

(2)MQTT报文类型

MQTT协议通过交换预定义的MQTT控制报文来通信。MQTT控制报文由固定头(Fixed Header)、可变头(Variable Header)和有效载荷(Payload)组成,这使得它易于实现和部署。每个MQTT控制报文都包含一个固定报头,见表1:

表1 固定报头格式

MQTT的报文总共有15种报文类型,对于MQTT的报文类型的定义以及各类报文的功能,见表2:

表2 控制报文类型

对于每一类报文,都有专门的报文结构和属性,由于篇幅原因,不在此过多赘述,具体见MQTT Version 5.0 (oasis-open.org)。

(3)MQTT的连接模式

MQTT的持久连接是指客户端与服务器之间的连接能够保持长期的状态,这种持久连接的特性是MQTT协议的一个重要特点,它为设备之间的通信提供了灵活性和效率。在传统的HTTP通信中,客户端向服务器发送请求后,服务器响应请求后即刻断开连接,这种请求/响应模式在某些场景下效率较低,因为每次通信都需要建立新的连接。而在MQTT中,客户端与服务器通过CONNECT报文连接后,即使在没有数据传输的情况下也能维持连接。为了确保连接的活跃性,客户端和服务器之间会定期交换心跳包。客户端会定期发送心跳包给服务器,告知自己的状态;服务器也会定期向客户端发送心跳包,确保客户端处于活跃状态,如图2。

图2 MQTT持久连接示意图

(4)MQTT的订阅主题

MQTT中客户端向服务器发送SUBSCRIBE报文用于创建一个或多个订阅。SUBSCRIBE报文支持通配符,也为每个订阅指定了最大的QoS等级,服务器根据这些信息分发应用消息给客户端。当服务器收到SUBSCRIBE报文,必须回复SUBACK报文,其中的报文标识符要与原始SUBSCRIBE报文相同。如果收到的主题过滤器与现有订阅相同,则应该替换现有订阅。订阅的主题过滤器必须是UTF-8字符串,服务器应支持通配符过滤器。每个过滤器后面跟着一个字节,表示请求的最大QoS等级,如图3。

图3 MQTT订阅主题

(5)MQTT的发布消息

MQTT定义了三个不同的服务质量等级(QoS):

· QoS 0:最多一次交付,消息发布后不做确认。

· QoS 1:至少一次交付,确保消息至少被接收一次。

· QoS 2:恰好一次交付,确保消息仅被接收一次。

QoS值表示应用消息分发的服务质量等级保证。不同的QoS等级决定了PUBLISH控制报文的处理方式。接收者(服务器或客户端)必须根据PUBLISH报文中的QoS等级发送相应的应答报文。MQTT根据QoS等级分发应用消息。当服务器向多个客户端(订阅者)分发消息时,每个客户端独立处理。消息的服务质量可能因订阅者指定的QoS等级而异。发布者在发布消息时指定了服务质量等级。

发布者必须发送QoS为0,DUP为0的PUBLISH报文。这种报文服务器不发送响应,发布者不重试,发送消息时立即丢弃。消息可能仅送达一次或根本不送达。服务器接收PUBLISH报文后将消息分发给订阅该主题的订阅者。

QoS1的PUBLISH控制报文确保消息至少送达一次,可能被多次处理。可变报头包含报文标识符,需要PUBACK报文确认。发布者必须分配未使用的报文标识符,并等待服务器的PUBACK报文确认。发送的PUBLISH报文必须包含报文标识符,QoS为1,DUP为0。如果收到PUBACK报文,发布者可以重复使用标识符。接收者的PUBACK报文必须包含来自PUBLISH报文的标识符。发送PUBACK后,接收者必须将相同标识符的入站PUBLISH报文视为新消息,忽略其DUP标志。

QoS2的PUBLISH控制报文提供最高服务质量,不容忍消息丢失和重复。消息变量头包含报文标识符。接收者使用两步确认过程来确认消息。发送者分配未使用的标识符,并等待PUBREC确认。收到PUBREC后,发送PUBREL,并等待PUBCOMP确认。发送PUBREL后不能重发PUBLISH。接收者发送PUBREC后可以存储消息并分发给订阅者(方案1),或等待PUBREL后再分发(方案2)。发送PUBCOMP后,可以丢弃标识符(方案1),或分发消息并丢弃(方案2)。接收者发送PUBCOMP后,任何后续PUBLISH报文被视为新的发布。

(6)MQTT取消订阅

客户端发送UNSUBSCRIBE报文给服务器以取消订阅主题。报文固定报头的特定位必须设置为0,0,1,0。有效载荷包含要取消订阅的主题过滤器列表,必须是UTF-8编码字符串。UNSUBSCRIBE报文必须至少包含一个有效载荷,包含已订阅的主题过滤器。服务器删除订阅后不再将该主题的消息发送给客户端,并完成任何QoS1和QoS2消息的分发。服务器必须发送UNSUBACK报文作为响应,包含与UNSUBSCRIBE相同的报文标识符。即使没有删除任何订阅,服务器也必须发送UNSUBACK响应。


图4 MQTT取消订阅

(7)MQTT断开连接

DISCONNECT报文是客户端发给服务端的最后一个控制报文,表示客户端正常断开连接。报文的固定报头保留位必须全为0。客户端发送DISCONNECT后必须关闭网络连接,不能再发送其他控制报文。服务端收到DISCONNECT后,必须丢弃与当前连接关联的未发布的遗嘱消息,并在客户端未关闭网络连接时主动关闭连接。

图5 MQTT断开连接

02

模糊测试技术

模糊测试(Fuzzing Test)是一种通过将随机数据(非预期输入)输入到目标系统以评估是否会出现非预期行为的测试方法,已经在计算机网络安全测试领域获得了广泛应用,在自动化漏洞挖掘方面具备优异表现。在MQTT协议的模糊测试中,我们可以通过向MQTT消息中注入异常数据或者随机生成各种消息格式和内容的数据包,来测试MQTT服务器的稳定性和安全性。

下面介绍一些通过模糊测试挖掘到的MQTT协议的CVE漏洞:

(1)数据包长度检测不当

网络数据包是在网络上传输和接收的格式化数据单元。每个MQTT数据包通常包含四个主要字段:控制头部、数据包长度、可变头部和有效载荷。前两个字段对于每个数据包都是必需的,其他字段是可选的。

图6 MQTT报文包格式[1]

数据包解析是提取和识别数据包字段的过程。然而,由于数据包构建方法的进步,攻击者可以利用协议漏洞来错误解析数据包,尤其是对于将解析视为顺序活动的协议。很多MQTT协议栈实现的漏洞都是由于在解析之前缺少或不正确的长度检查。例如,在CVE-2021-41036中,Eclipse Paho MQTT 客户端未验证收到报文中的剩余长度的大小。类似地,在CVE-2020-10071中,Zephyr MQTT解析代码对已发布消息的长度字段进行不充分的检查,这可能导致缓冲区溢出攻击和远程代码执行。还有其他一些漏洞,例如CVE-2020-10070和CVE-2020-10063,它们也是由于不正确的长度检查而存在。这些漏洞不仅可能导致DoS攻击,还可能导致其他严重威胁,如远程代码执行(RCE)或读取内存内容。

(2)缺乏必要字段检测

缺乏必要字段检查是由于在协议实现过程中忽略了对必需字段的验证而导致的。正如之前所述,在MQTT中,数据包长度和数据包字段随着数据包类型的不同而变化。因此,应该针对数据包类型明确实施必需字段检查的实现。例如,如果一个数据包包含用户名字段,那么相关的密码字段也必须存在,因为缺少这样的密码部分会使实现处于危险之中。在CVE-2019-9749中,Fluent Bit中MQTT输入插件对一个精心制作的数据包的处理导致服务器崩溃。在CVE-2018-11993中,对MQTT连接请求时访问堆栈的不当检查导致缓冲区溢出攻击。此外,在CVE-2018-8531中,Azure IoT Hub设备对MQTT协议内存访问的操作限制不当导致远程代码执行攻击。与不正确的必需字段检查实现缺陷相关的漏洞包括CVE-2016-9877(MQTT代理对具有有效用户名但省略密码部分的连接请求进行身份验证),CVE-2017-2893(MQTT代理在处理没有订阅参数的订阅数据包时崩溃)。

(3)缺少逻辑错误检测

该问题是由于数据包中缺乏逻辑错误检查以及实现中未对其进行识别而引起的。在CVE-2021-42386中,Busybox在运行AWK模式时会导致服务拒绝。在CVE-2019-9749中,Fluent Bit中的MQTT在输入插件处理特意编辑的数据包时会导致服务器崩溃。在CVE-2018-11998中,处理MQTT中的一个特意制作的数据包解码请求时发生了一个ace条件,导致缓冲区溢出攻击。在CVE-2020-13849中,由于缺乏对客户端发送的Keep-Alive值的逻辑检查,MQTT服务器受到了拒绝服务攻击。在CVE-2019-11778中,当处理一个“will delay interval”( 服务器等待再发布遗嘱消息的时间间隔)大于“session expiry interval”( 客户端与服务器之间的会话时间)的数据包时,MQTT服务器会崩溃。

(4)其他错误

还有一些CVE漏洞是由于对内容类型、数据类型、身份验证绕过、无效证书和无效访问的错误处理。由于不正确处理非UTF-8编码字符的客户端ID或主题名称而导致的漏洞CVE-2020-13932,攻击者利用了Apache ActiveMQ Artemis 2.5.0到2.13.0(MQTT服务器)中的一个漏洞,在服务器接受包含非UTF-8编码字符的客户端ID和主题名称的MQTT数据包。通过利用这种漏洞,攻击者可以执行任何易受攻击的脚本或命令来获取对MQTT服务器的访问权限,从而允许他进行恶意活动。类似地还有与数据类型相关的漏洞,由于变量的不正确初始化,如在CVE-2019-5917中,通过利用Microsoft Azure的MQTT客户端服务中的未指定的向量,进行了拒绝服务攻击。

身份验证绕过相关的漏洞,主要利用的是网络上传输的信息未加密和未编码。例如,在CVE-2019-5635中,由于未加密智能桥设备与MQTT代理之间的数据传输,攻击者使用默认用户名和密码攻击了MQTT代理。同样,无效访问相关的漏洞是由于错误的文件和对象权限导致的。例如,在CVE-2018-8531中,报告了Azure IoT Hub设备访问内存中的对象漏洞,这种情况下攻击者可以执行内存损坏的操作。

如果想要自己对MQTT服务器进行模糊测试,可以使用BlitzFuzz工具进行操作。BlitzFuzz(点击查看详情)作为一款专门针对工控网络协议的渗透模糊测试工具,支持CAN、CAN、UDS、SOME/IP、DoIP等汽车常用协议的报文仿真、解析功能,提供相关协议的渗透测试用例包、合规测试用例包以及模糊测试功能。

在BlitzFuzz的模糊测试界面中,可以选择添加MQTT模糊测试用例来对被测件进行模糊测试。针对不同的MQTT报文类型,可以选择不同的MQTT报文类型进行参数配置,选择变异策略进行不同方式的变异策略及模糊数据的生成。同时可以配置多种监控套件对被测件进行监控,查看模糊用例对被测件的影响,如图7。

图7 BlitzFuzz MQTT模糊配置界面

首先将将被测件通过网线连接BlitzFuzz工具。测试人员在BlitzFuzz前端界面配置需要进行模糊的MQTT报文信息及相关配置,包括被测件的基础信息如MAC、IP,以及选择使用的监控套件参数,用于判断被测件发送的模糊数据情况。参数填写完成后选择测试用例并运行,运行结束后即可在界面查看测试报告,如图8。

图8 BlitzFuzz模糊测试示意图

参考文献:

[1] Husnain M, Hayat K, Cambiaso E, et al. Preventing mqtt vulnerabilities using iot-enabled intrusion detection system[J]. Sensors, 2022, 22(2): 567.

[2] Hwang, H. C., Park, J., & Shon, J. G. (2016). Design and implementation of a reliable message transmission system based on MQTT protocol in IoT.

[3] Soni D, Makwana A. A survey on mqtt: a protocol of internet of things (iot)[C]//International conference on telecommunication, power analysis and computing techniques (ICTPACT-2017). 2017, 20: 173-177.

[4] Singh M, Rajan M A, Shivraj V L, et al. Secure mqtt for internet of things (iot)[C]//2015 fifth international conference on communication systems and network technologies. IEEE, 2015: 746-751.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/752690.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Sklearn-线性回归驯化】史上最为全面的预测分析的基石-线性回归大全

【Sklearn-驯化】史上最为全面的预测分析的基石-线性回归大全 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! 🎇 免费获取相关内容文档关注&…

Java8新特性stream的原理和使用

这是一种流式惰性计算&#xff0c;整体过程是&#xff1a; stream的使用也异常方便&#xff0c;可以对比如List、Set之类的对象进行流式计算&#xff0c;挑出最终想要的结果&#xff1a; List<Timestamp> laterTimes allRecords.stream().map(Record::getTime).filter…

电脑音频剪辑怎么操作?分享六个简单的音频剪辑技巧【常用】

音频剪辑的需求越来越多&#xff0c;大多数短视频中的音乐都是大家后期制作的&#xff0c;主要目的就就是让视频观看起来更有趣。音频剪辑的方法有很多&#xff0c;比较好用的可以借助第三方音频剪辑软件。操作简单&#xff0c;对没有任何剪辑经验的小白用户来说十分友好。 本文…

java简易计算器(多种方法)

parseDouble() 方法属于 java.lang.Double 类。它接收一个字符串参数&#xff0c;其中包含要转换的数字表示。如果字符串表示一个有效的 double&#xff0c;它将返回一个 double 值。 应用场景 parseDouble() 方法在以下场景中非常有用&#xff1a; 从用户输入中获取数字&a…

VUE大屏的开发过程(纯前端)

写在前面&#xff0c;博主是个在北京打拼的码农&#xff0c;工作多年做过各类项目&#xff0c;最近心血来潮在这儿写点东西&#xff0c;欢迎大家多多指教。 对于文章中出现的任何错误请大家批评指出&#xff0c;一定及时修改。有任何想要讨论和学习的问题可联系我&#xff1a;1…

2.4G无线通信芯片数据手册解读:Ci24R1南京中科微

今天&#xff0c;我非常荣幸地向您介绍这款引领行业潮流的2.4G射频芯片&#xff1a;Ci24R1。这款芯片&#xff0c;不仅是我们技术的结晶&#xff0c;更是未来无线通信的璀璨明星。 首先&#xff0c;让我们来谈谈Ci24R1的“速度”。2.4G射频芯片&#xff0c;凭借其卓越的数据传输…

Python基于逻辑回归分类模型、决策树分类模型、随机森林分类模型和XGBoost分类模型实现乳腺癌分类预测项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 在当今医疗健康领域&#xff0c;乳腺癌作为威胁女性健康的主要恶性肿瘤之一&#xff0c;其早期诊断与精…

OpenHarmony开发实战:HDF驱动开发流程

概述 HDF&#xff08;Hardware Driver Foundation&#xff09;驱动框架&#xff0c;为驱动开发者提供驱动框架能力&#xff0c;包括驱动加载、驱动服务管理、驱动消息机制和配置管理。并以组件化驱动模型作为核心设计思路&#xff0c;让驱动开发和部署更加规范&#xff0c;旨在…

Redis-Bitmap位图及其常用命令详解

1.Redis概述 2.Bitmap Bitmap 是 Redis 中的一种数据结构&#xff0c;用于表示位图&#xff08;bit array&#xff09;。 它通常用于处理大规模数据集中每个元素的状态&#xff0c;比如用户的在线/离线状态&#xff08;每个用户对应一个位&#xff0c;表示在线&#xff08;1&a…

[数据结构】——七种常见排序

文章目录 前言 一.冒泡排序二.选择排序三.插入排序四.希尔排序五.堆排序六.快速排序hoare挖坑法前后指针快排递归实现&#xff1a;快排非递归实现&#xff1a; 七、归并排序归并递归实现&#xff1a;归并非递归实现&#xff1a; 八、各个排序的对比图 前言 排序&#xff1a;所谓…

Mac中的xshell、xftp

ROYAL TSX 插件式支持远程连接linux、支持命令行、支持ftp、支持远程windows桌面。 免费版就足够使用了。&#xff08;支持维护一个Connections文件夹&#xff09; 需要在本地创建一个文件夹&#xff0c;用以保存链接信息 使用方法

Bytebase 2.20.0 - 支持为工单事件配置飞书个人通知

&#x1f680; 新功能 支持 Databricks。支持 SQL Server 的 TLS/SSL 连接。支持为工单事件配置飞书个人通知。支持限制用户注册的邮箱域名。 &#x1f514; 重大变更 将分类分级同步设置从数据库配置移至工作空间的全局配置。 SQL 编辑器只读模式下只允许执行 Redis 的只读…

抖音外卖服务商申请全域外卖系统源码部署,如何保证竞争力?

随着本地生活市场规模的逐渐扩大&#xff0c;多家互联网公司在加大投入力度的同时&#xff0c;也在不断调整其市场竞争策略&#xff0c;作为国内头部社交平台的抖音也不例外。就在近日&#xff0c;抖音发布了关于新增《【到家外卖】内容服务商开放准入公告》的意见征集通知&…

OSI七层模型TCP/IP四层面试高频考点

OSI七层模型&TCP/IP四层&面试高频考点 1 OSI七层模型 1. 物理层&#xff1a;透明地传输比特流 在物理媒介上传输原始比特流&#xff0c;定义了连接主机的硬件设备和传输媒介的规范。它确保比特流能够在网络中准确地传输&#xff0c;例如通过以太网、光纤和无线电波等媒…

SCI二区复现|体育场观众优化算法(SSO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;M Nemati受到体育场观众的行为对比赛中球员行为的影响启发&#xff0c;提出了体育场观众优化算法&#xff08;Stadium Spectators Optimizer, SSO&#xff09;。 2.算法…

2023年第十四届蓝桥杯JavaB组省赛真题及全部解析(下)

承接上文&#xff1a;2023年第十四届蓝桥杯JavaB组省赛真题及全部解析&#xff08;下&#xff09;。 目录 七、试题 G&#xff1a;买二赠一 八、试题 H&#xff1a;合并石子 九、试题 I&#xff1a;最大开支 十、试题 J&#xff1a;魔法阵 题目来自&#xff1a;蓝桥杯官网…

Docker 安装最新版本 Jenkins

目录 1、下载、启动容器、更新到最新版本 2、查看初始密码两种方式&#xff1a; 3、默认安装的部分未汉化&#xff0c;删除默认的汉化插件。重启容器&#xff0c;重新安装汉化插件 4、安装 Publish over SSH、docker-build-step 、Docker Commons 插件 5、配置服务器连接信…

【LLM 论文】Self-Refine:使用 feedback 迭代修正 LLM 的 output

论文&#xff1a;Self-Refine: Iterative Refinement with Self-Feedback ⭐⭐⭐⭐ CMU, NeurIPS 2023, arXiv:2303.17651 Code: https://selfrefine.info/ 论文速读 本文提出了 Self-Refine 的 prompt 策略&#xff0c;可以在无需额外训练的情况下&#xff0c;在下游任务上产…

D13009-ASEMI电源开关三极管D13009

编辑&#xff1a;ll D13009-ASEMI电源开关三极管D13009 型号&#xff1a;D13009 品牌&#xff1a;ASEMI 批号&#xff1a;2024 沟道&#xff1a;NPN 电流&#xff1a;4A 电压&#xff1a;400V 安装方式&#xff1a;直插式封装 特性&#xff1a;NPN晶体管、三极管、12A…

分享10个AI搞钱副业,门槛低,普通人也能学的会!易上手!

前言 本期给大家分享的是利用AI 做副业的一些方法&#xff0c;大家可以挑选适合自己的赛道去搞钱 现在是人工智能时代&#xff0c;利用好AI 工具&#xff0c;可以降低普通人做副业的门槛&#xff0c;同时也能提高工作效率&#xff0c; 因此AI 赚钱的副业还是挺多的&#xff0…