MQTT Protocol Fuzzing Method for Multi-Party Interaction Scenarios

  • Xie Huabao , * ,
  • Zhou Yanrong ,
  • Guan Zhitao
Expand
  • School of Control and Computer Engineering, North China Electric Power University, Beijing 102206, China

Received date: 2026-04-23

  Online published: 2026-08-07

Copyright

Copyright ©2026 Journal of Aeronautical Materials. All rights reserved.

Abstract

MQTT, a lightweight publish/subscribe protocol widely used in Internet of Things scenarios, was studied for fuzzing of MQTT brokers under multi-party interaction scenarios, where input mutation lacked semantic awareness, state representation was coarse grained, and asynchronous interactions among multiple clients were insufficiently covered. A fuzzing method for MQTT under multi-party interaction scenarios was proposed. An initial seed corpus was built through global temporal interaction scenario modeling, and grammar-aware mutation, multi-client coordinated execution, and fine-grained state extraction with guided scheduling were combined to direct exploration of deep protocol logic in MQTT brokers. Based on this method, a prototype system named MQTTFuzzer was designed and implemented. Comparative experiments and ablation analyses on several open-source MQTT brokers showed that the method outperformed baseline tools in code coverage and state-space exploration and discovered both known and previously unknown security flaws. The results show that the method provides effective support for security testing of publish/subscribe protocol implementations.

Cite this article

Xie Huabao , Zhou Yanrong , Guan Zhitao . MQTT Protocol Fuzzing Method for Multi-Party Interaction Scenarios[J]. Journal of Cybersecurity, 2026 . DOI: 10.20172/j.issn.2097-3136.260701

0 引言

随着物联网应用规模不断扩大,设备接入数量和部署场景持续增加,底层通信协议在实时性、资源开销和可扩展性等方面面临更高要求[1-3]。MQTT协议因轻量、低开销以及发布/订阅解耦等特点,已成为物联网场景中的重要通信协议之一[4-5]。在物联网系统中,MQTT通信过程表现为多个发布端、订阅端与代理围绕主题形成的异步多方交互过程。MQTT代理处于通信链路中心位置,不仅承担连接管理、会话维护和消息路由等关键功能,还需要维护订阅关系、消息队列、QoS重传和跨客户端路由等复杂上下文。一旦代理实现中存在状态处理错误或跨客户端交互逻辑缺陷,可能导致消息丢失、服务阻塞、资源耗尽甚至拒绝服务等安全风险,进而影响物联网系统的稳定运行[6-8]
与传统请求—响应型协议相比,MQTT发布/订阅机制中的安全缺陷往往具有更强的状态依赖性和交互隐蔽性。部分缺陷并不会在单个客户端发送异常报文时立即暴露,而是需要在订阅关系已建立、会话状态保持、QoS消息重传或多个客户端交替触发的条件下才会出现。例如,消息路由错误、订阅状态异常、队列资源释放不当等问题通常依赖发布端、订阅端和代理之间的组合交互才能触发。若测试方法不能准确复现多客户端异步交互过程,就可能遗漏真实部署环境中的深层协议逻辑缺陷。因此,面向多方交互场景开展MQTT代理自动化漏洞挖掘研究具有现实价值。
模糊测试通过持续生成并执行测试输入发现程序异常,已成为自动化漏洞挖掘的重要方法之一[9-10]。但现有方法在面向MQTT代理软件时仍存在一些不足。在变异层面,传统测试方法缺乏对协议字段语义的细粒度刻画。由于MQTT报文中的数据载荷通常占据较大比重,而服务端在处理时往往将其视为不可分割的整体,对该部分进行无差别变异通常难以触发新的业务分支,反而容易产生大量探索价值有限的冗余用例,降低深层业务代码的测试效率。在状态引导层面,现有网络协议模糊测试工具普遍采用粗粒度的状态抽象。以AFLNet为代表的方法主要依据网络响应码构造状态反馈机制[11],但对于MQTT中会话保持、服务质量等级以及发布/订阅关系等语义较强的协议上下文,此类表示方式容易造成状态混淆,限制对复杂协议状态的持续探索。在交互模型层面,现有工具大多基于单客户端线性通信方式,而MQTT采用以服务端为中心的发布/订阅通信模式。测试模型与真实多方通信场景之间的偏差,使其难以覆盖由跨客户端异步交互触发的处理路径及相关缺陷。
针对上述问题,本文提出一种面向多方交互场景的MQTT协议模糊测试方法。本文将多方交互场景作为基本测试单元,分别从输入有效性、状态可分辨性和多方交互可达性三个方面展开设计。具体而言,针对MQTT控制报文设计语法感知变异机制,通过结构化解析来进行语法感知变异,提高测试输入的可执行性;构建细粒度状态提取与引导调度机制,利用协议上下文信息增强状态表示能力,并据此优化测试资源分配;设计多客户端协同执行机制,用于重放发布者、订阅者等多方参与的交互场景,从而提高对复杂异步通信路径的覆盖能力。
本文的主要贡献如下。
(1)提出了一种面向 MQTT 发布/订阅模式的全局时序交互场景建模方法,将多客户端交互过程抽象为全局交互事件流,并作为种子构建、变异调度和协同执行的统一测试单元,以保留跨客户端异步交互中的时序依赖关系。
(2)设计了面向 MQTT 协议语义的细粒度状态提取与语法感知变异机制,从控制报文类型、会话状态、订阅关系、QoS 处理和主题匹配等上下文中提取状态特征,并对关键协议字段进行结构化变异,以减少状态混淆并提高测试输入进入深层处理逻辑的能力。
(3)设计并实现原型系统 MQTTFuzzer,在多款主流 MQTT 代理软件上开展对比实验和消融分析。实验结果表明,本文方法在代码覆盖、状态空间探索和真实缺陷触发方面均优于对比方法,验证了所提方法的有效性。

1 相关工作

1.1 网络协议模糊测试研究进展

网络协议实现的模糊测试研究经历了从基于模板的黑盒测试、到状态感知的灰盒测试、再到结合结构信息、序列建模与大语言模型辅助分析的发展过程[12]
早期研究主要依赖人工描述协议格式与交互流程,通过模板、脚本或数据块定义生成异常报文,代表性工具包括Sulley[13]、Boofuzz[14]等。这类方法实现相对简单,适用范围较广,但对协议知识和测试脚本依赖较强,自动化程度有限。为降低人工建模成本,AutoFuzz、PULSAR等工作开始尝试从通信流量中自动学习消息格式与协议状态模型,在一定程度上提高了协议测试的自动化水平,但其效果仍明显受限于流量样本质量和模型推断精度[15-16]。针对语法规则获取困难的问题,Jero等进一步提出从RFC等文本规范中自动抽取协议规则,以支持语法驱动的协议模糊测试,推动协议测试由人工建模向规范知识辅助建模发展[17]
随着代码覆盖引导的灰盒模糊测试的发展,研究重点逐步转向面向网络协议实现的状态反馈建模。AFLNet利用记录的消息序列作为初始种子,以服务端响应码作为状态反馈,引导测试向更有价值的协议状态推进,推动网络协议模糊测试向状态引导发展[11]。针对响应码表征粒度较粗的问题,StateAFL通过长生命周期内存快照和模糊哈希推断服务端内部状态,提升了状态表示能力[18]。NSFuzz则从程序变量和事件循环角度改进状态表示与交互同步机制,在测试吞吐率和状态刻画精度方面进一步提升了网络协议模糊测试效果[19]。Li等提出SNPSFuzzer,通过进程快照复用协议前缀状态,减少重复前缀执行带来的开销,在保持状态引导能力的同时提高了测试效率[20]。这一阶段的研究表明,协议模糊测试的重点已由单纯的报文生成,逐步转向对服务端内部状态空间的有效感知、调度与复用。
在状态建模之外,研究者进一步关注高质量输入生成、消息序列优化和测试过程加速。Luo等在工业控制协议场景下提出基于覆盖引导的数据包解析与生成方法,通过对协议报文进行结构化拆解与重组,提高了有效测试样例比例和深层路径覆盖能力[21]。SATFuzz从状态优先级、测试序列筛选和无效交互过滤三个方面优化有状态协议测试流程,强调减少无效辅助消息、提高深层状态探索效率的重要性[22]。BLEEM由单报文变异转向面向数据包序列的测试,并通过分析系统输出序列提升协议状态空间探索能力[23]。Wu等进一步提出Logos,通过统一建模并利用协议实现运行过程中产生的日志信息作为反馈信号,引导测试过程中的种子选择与交互探索,从而提高对深层协议逻辑缺陷的触达能力[24]。这类研究表明,网络协议模糊测试已不再局限于状态建模,而是逐步转向围绕报文结构、执行反馈和交互序列开展更细粒度的优化。
近期研究进一步强调协议语义与规范知识的联合利用。ChatAFL尝试利用大语言模型从RFC等自然语言规范中抽取消息类型、语法结构和状态信息,以支持结构化变异、种子扩充和状态转移[25]。MSFuzz则利用大语言模型分析协议实现源代码,提取更细粒度的消息语法信息,并据此构造消息语法树、扩展种子集合和执行语法感知变异,从而提高测试输入的有效性[26]。张东等提出LRPT方法,利用DeepSeek模型从少量网络流量中推断协议结构和字段语义,并结合响应反馈生成测试样例,提升了协议逆向与安全测试的自动化能力[27]。Sun等提出SemFuzz,利用大语言模型从RFC文档中提取协议语义规则,并生成语义违例测试样例,为发现网络协议实现中的深层语义漏洞提供了新的语义感知测试思路[28]

1.2 MQTT协议模糊测试研究进展

作为典型的发布/订阅型协议,MQTT的模糊测试研究主要围绕多参与方交互建模、协议结构感知输入生成以及规范约束驱动测试等方向展开。
早期研究中,MultiFuzz注意到传统覆盖引导的模糊测试通常隐含双端通信假设,难以刻画MQTT中发布者、订阅者与代理共同参与的消息传播过程。为此,该工作提出面向发布/订阅协议的多方模糊测试框架,在单个输入中嵌入多连接信息,并通过面向消息序列的变异机制驱动协议状态迁移,从而将测试对象由单连接线性交互扩展到多参与方协同场景[29]。FUME针对MQTT代理的协议处理特点,提出结合生成式与变异式思想的专门化模糊测试方法,利用MQTT控制报文结构组织输入空间,并综合网络响应与运行输出作为反馈信号,以提高测试输入生成和交互探索的针对性[30]。SGANFuzz从数据驱动角度提升输入质量,引入生成对抗网络学习MQTT报文分布,生成更接近真实协议交互特征的测试消息,以缓解随机变异容易破坏报文结构并导致浅层校验失败的问题[31]。MQueez强调协议规范对测试生成过程的显式约束,通过构建细粒度的MQTT交互约束模型,刻画不同控制报文之间的依赖关系和状态前提,并结合响应感知的启发式能量分配策略,提高有效测试序列的生成能力和测试资源分配效率[32]。MBFuzzer则面向代理中的多方通信逻辑,提出多方黑盒模糊测试框架,通过双发送端协同、消息依赖规则和调度机制,覆盖消息路由、转发与分发等依赖多客户端配合的执行路径,并将差分测试引入MQTT代理测试过程,以支持对规范一致性问题的检测[33]
总体来看,现有针对MQTT的模糊测试研究已在多方交互支持、结构感知输入生成、数据驱动测试和规范约束建模等方面取得了一定进展。然而,现有方法仍存在以下不足:第一,多方交互建模多停留在多连接支持或消息序列组织层面,缺少能够统一描述跨客户端时序依赖和因果关系的测试表示方法,因此难以稳定覆盖由发布端、订阅端与代理协同触发的深层协议路径;第二,现有状态反馈多依赖响应码、运行输出或规范约束,难以进一步区分MQTT会话保持、订阅关系、QoS流转和主题匹配等语义相关的细粒度状态差异,容易造成状态混淆;第三,现有变异方法虽然考虑了报文结构或规范约束,但对字段语义及其上下文关系的联合利用仍不充分,生成的测试样例容易停留在浅层解析和校验阶段。
与已有工作相比,本文的改进主要体现在以下三个方面:第一,将MQTT多客户端交互过程抽象为全局交互事件流,并将其作为种子构建、变异调度和协同执行的统一测试单元,以保留发布/订阅场景中的跨客户端时序依赖关系;第二,面向MQTT协议语义构建细粒度状态特征,从控制报文类型、会话状态、订阅关系、QoS处理和主题匹配等上下文中提取状态反馈,以减少粗粒度响应信息导致的状态混淆;第三,结合语法感知变异和多客户端协同执行机制,对关键字段及其上下文约束进行定向扰动,从而提高对MQTT代理深层协议逻辑和复杂异步交互路径的探索能力。

2 方法设计

针对MQTT协议中多客户端异步交互明显、状态依赖性较强的特点,本文将多方交互场景作为基本测试单元,从测试场景表示、状态反馈建模和输入变异策略3个方面构建面向MQTT代理的状态引导模糊测试方法。
MQTT代理的协议处理过程具有明显的历史状态依赖和跨客户端上下文关联特征。服务端对当前报文的处理结果不仅由报文本身决定,还受到历史会话、订阅关系、QoS阶段以及跨客户端消息路由关系的共同影响。在测试模型方面,单客户端线性输入难以保持发布/订阅场景中的多方交互关系;在状态反馈方面,仅依据响应码构造状态表示容易将不同协议上下文下的处理过程合并为同一状态;在输入变异方面,随机字节变异容易破坏MQTT报文结构及字段约束,导致测试输入停留在浅层解析和校验阶段。针对上述特点,本文通过全局交互事件流保持多客户端交互中的时序依赖关系,通过细粒度语义状态特征增强状态可分辨性,并结合语法感知变异提高测试输入的结构有效性,从而提升对MQTT代理深层协议逻辑和复杂异步路径的探索能力。

2.1 方法框架工作流程

该框架由初始种子构建、状态引导调度、语法感知变异、多客户端协同执行和异常监测5个模块组成,如图1所示。测试开始前,在真实网络环境中采集多方交互数据,并据此提取多方交互场景,构建基于全局交互事件流的初始种子库。在测试过程中,调度器根据当前状态覆盖信息选择种子;变异引擎对种子中的报文序列进行语法感知变异,生成待执行的测试样例;协同执行器依据测试样例中的客户端标识,按顺序调度多个并发连接,并将其发送至目标MQTT代理;监测模块结合代码覆盖信息和协议状态反馈,判断当前测试样例是否具有保留价值;若产生新的覆盖或状态转移,则将其对应的事件流写回种子库,并同步更新状态机模型。上述过程持续迭代,直至满足终止条件。
图 1 面向多方交互场景的模糊测试方法框架

Fig.1 Framework of the fuzzing method for multi-party interaction scenarios

在测试执行过程中,全局交互事件流保留客户端标识、报文内容和全局先后关系,可维持订阅、发布和消息转发之间的时序依赖;细粒度语义状态特征引入会话状态、订阅关系、QoS 处理和主题匹配等上下文信息,可减少粗粒度响应码导致的状态混淆;语法感知变异在保持报文结构可解析的基础上对关键字段进行扰动,提高测试输入进入深层协议处理逻辑的可能性。

2.2 基于全局时序的初始种子库构建

现有网络协议模糊测试大多建立在“单客户端—服务端”双向交互假设之上,通常将测试输入绑定到单一TCP流。这种建模方式难以刻画MQTT发布/订阅模式下多客户端异步协同形成的因果关系。为此,本文提出一种基于全局时序多方交互场景的种子构建方法,以多方交互场景为基本测试输入单元,并通过协议功能划分、全局事件流提取和时序约束持久化,保留多方通信过程中的时序依赖和交互关系。
在本文中,多客户端围绕代理形成的一次完整异步交互过程称为场景;场景按统一格式持久化并存入种子库后形成种子;种子经调度与变异后生成并实际送入目标程序执行的输入实例称为测试样例。

2.2.1 协议功能分析

依据MQTT协议规范,本文首先将协议行为划分为连接管理、发布订阅路由、QoS控制和保活机制等功能模块,并以此作为场景采集的边界。

2.2.2 全局交互事件流提取

在真实通信环境中,部署多个客户端实例与目标MQTT代理进行交互,并采集通信流量。不同于按TCP流独立切分数据的方式,本文按照数据包的绝对时间戳对所有参与方的网络流进行全局合并与排序。一次多方交互通信场景可表示为全局交互事件流S,该事件流构成场景种子的核心表示形式。S表示为:
$ S=({e}_{1},{e}_{2},\cdots ,{e}_{n}) $
其中,ei表示按全局时间顺序排列的第i个事件。进一步地,将事件定义为二元组:
$ {e}_{i}=({C}_{\text{k}},{P}_{i}) $
其中,Ck表示客户端实例标识符,k代表第k个客户端,一个客户端可对应多个PiPi表示该事件对应的MQTT报文。发布者、订阅者等角色由场景上下文确定,Ck仅用于区分具体连接实例。

2.2.3 时序约束下的序列持久化

最后,将全局事件流按统一格式写入种子库,形成场景种子。该表示方式能够直接保留原始通信中的时序依赖关系。例如,只有客户端A的SUBSCRIBE先于客户端B的PUBLISH到达代理,代理才可能触发后续的消息转发。本文将场景种子作为后续调度、变异与重放的最小测试单元,其内部表示为全局交互事件流。单个场景通常以相关连接的建立为起点,以所有参与方断开连接或达到超时阈值为终点。

2.3 语法感知的变异策略

MQTT控制报文结构紧凑,字段之间存在较强的语义约束和上下文依赖。传统随机变异方法难以区分不同字段的功能差异,因此难以实施有效扰动。尤其对于报文中占比较大的数据载荷,服务端通常将其作为整体数据进行处理。若对其进行无差别变异,往往难以触发新的业务分支,反而会产生大量探索价值较低的冗余用例,进而影响深层业务代码的测试效率。针对这一问题,本文设计了一种面向MQTT协议的语法感知变异策略,在尽可能保持报文结构可解析的前提下,对关键语义位置进行定向扰动。该策略包括结构化解析与对象建模、语义变异算子设计以及生命周期感知调度三个部分。

2.3.1 格式化解析与对象建模

依据MQTT协议规范,变异引擎首先将原始字节流反序列化为结构化对象,再在对象层面对报文实施变异。任意控制报文可表示为三元组P
$ P=({H}_{fixed},{H}_{var},PL) $
其中,Hfixed表示固定报头,包含控制报文类型及标志位;Hvar表示可变报头,包含协议版本、连接控制参数和属性字段;PL表示数据载荷,包含客户端标识符、主题、订阅项以及遗嘱数据等变长内容。

2.3.2 语义引导的变异策略

在结构化对象表示基础上,本文构建了一组与报文类型及字段上下文相关的语义变异算子,主要包括协议字段约束破坏、状态与载荷逻辑错位、属性依赖关系扰动,以及变长字段的边界扩展等操作。与直接作用于原始字节流的盲变异不同,本文方法将协议语义敏感位置作为主要扰动对象,在尽量保持报文整体可解析性的同时,有针对性地进行变异操作,从而提高测试输入进入深层协议处理路径的可能性。上述算子定义了变异内容及其作用方式,具体的使用顺序和组合方式由调度机制确定。

2.3.3 生命周期感知调度机制

为兼顾测试效率与探索深度,本文结合种子的历史覆盖收益、状态偏好和调度次数分配变异能量,并在不同生命周期阶段采用差异化调度策略。一次调度的输出并非单个测试样例,而是由不同阶段生成并汇总形成的变异样例集合。在执行阶段,调度器按照样例生成顺序依次取出并执行测试,以保持变异生成过程与执行反馈之间的对应关系。
当种子首次被调度时,调度器优先执行单步纯净变异。具体而言,调度器依次独立调用该报文类型对应的各个语义变异算子,每次仅施加一种结构化扰动,并将所得轻度变异结果依次加入当前变异样例集合。该阶段的目的在于以较低成本快速探测协议实现的基础处理边界,并为后续调度提供初始反馈。
当种子再次被调度且尚未执行确定性扩展时,调度器触发延迟确定性变异。该阶段主要执行字典注入、边界枚举等确定性操作,并一次性生成确定性变异样例子集,随后将其加入当前变异样例集合。完成后,调度器对该种子设置完成标记,以避免后续重复执行高开销操作。该设计将确定性搜索延后至种子重访阶段,有利于在测试早期优先利用低成本扰动扩大探索范围。
除上述阶段性操作外,调度器在每次调度过程中都会执行随机堆叠变异。调度器根据种子能量值进行多轮变异,每轮随机选择并组合多个语义变异算子,对结构化对象实施复合扰动;在对象重新序列化后,再以一定概率引入底层字节级扰动。各轮生成结果按产生顺序附加到当前变异样例集合末尾,从而在结构化变异的基础上保留适度的随机探索能力。由此,该方法在以结构化变异为主的同时,也兼顾了随机探索带来的多样性。
综上,本文将语义变异算子的定向设计与种子生命周期上的差异化调度相结合。前者提高了变异输入的结构有效性和语义针对性,后者控制了不同类型变异的触发时机与组合强度,从而提升了对MQTT协议状态空间及异常执行路径的探索能力。

2.4 多客户端协同执行

为在动态测试阶段重现场景种子所记录的多方交互过程,本文基于全局事件流设计了多客户端协同执行器。与传统单连接执行模式不同,该执行器能够根据事件流中的客户端标识及其顺序关系调度多个并发连接,从而实现多方交互场景的定向重放。如图2所示,对于任一场景种子对应的全局事件流S,执行过程分为3个阶段。
图 2 多客户端协同执行架构及工作流程

Fig.2 Multi-client collaborative execution architecture and workflow

2.4.1 连接按需创建与映射维护

执行器首先解析全局事件流S中的客户端标识信息,并在重放该场景种子时维护‘客户端实例标识符—Socket句柄’映射。对于事件ei对应的客户端Ck,若其连接尚未建立,则执行器通过Socket与目标MQTT代理建立底层TCP连接,并将其加入映射表;若连接已存在,则直接复用。

2.4.2 事件时序的数据重放

在连接建立后,执行器按照事件流索引顺序依次遍历。对于当前事件ei,根据Ck查找对应的Socket,并发送数据报文Pi。由于重放过程保持了全局交互事件的先后关系,代理内部与会话管理、主题匹配、消息路由及缓存队列相关的处理逻辑能够在接近真实场景的条件下得到触发。同时,执行器收集所有活跃连接上的服务端响应,用于后续的状态更新与路径评估。

2.4.3 生命周期自适应释放

事件流中记录的DISCONNECT报文作为普通事件参与调度,可触发代理执行相应的会话回收逻辑。事件流重放结束后,执行器统一释放仍处于存活状态的TCP套接字,以减少不同测试轮次之间的状态残留。

2.5 状态机模型构建与资源调度

2.5.1 状态机构建过程

MQTT协议处理具有较强的状态依赖性。代理的响应不仅取决于当前输入,还与历史交互序列有关。基于此,本文引入语义感知的状态机学习机制,在测试过程中动态抽象代理的协议行为,并利用状态覆盖信息指导测试资源分配。在执行过程中,监测模块实时捕获代理返回的响应报文,并将其映射为状态向量Sserver
$ {S}_{server}=({T}_{type},\Phi ({H}_{var},PL)) $
其中,Ttype表示控制报文类型,Hvar表示可变报头,PL表示数据载荷,$ \Phi $表示语义特征提取函数。该函数保留能够表征协议行为差异的关键信息,同时剔除包标识符、随机载荷等波动较大的字段,以减少状态表示冗余。
具体而言,本文提取的状态特征包括控制报文类型、返回码或原因码、QoS等级、会话保持标志、订阅结果、主题匹配关系以及触发响应的客户端上下文等。其中,控制报文类型用于区分连接确认、订阅确认、发布确认等协议处理阶段;返回码、原因码和QoS等级用于刻画服务端处理结果;会话保持标志、订阅结果和主题匹配关系用于描述会话维护与发布/订阅上下文;客户端上下文用于区分多客户端异步交互中由不同连接触发的状态差异。提取后的语义特征被规范化为状态向量,并映射为状态节点标识。当新的执行反馈产生未出现过的状态向量或状态转移关系时,系统更新状态机模型及其访问频率,从而形成基于执行反馈的在线状态表示过程。
以SUBACK为例,不再将其统一归为“订阅确认”状态,而是进一步区分全部成功、部分成功和失败等不同语义结果。对于客户端侧输入动作,本文同样进行抽象,将细粒度的字节差异归约为核心控制语义,以避免产生冗余的状态转移边。

2.5.2 基于状态反馈的调度策略

基于上述状态表示,状态机构建与资源调度分为引导和制导两个阶段。
在引导阶段,调度器利用初始种子库执行无变异重放,解析服务端响应,注册初始状态节点及状态转移边,建立目标代理的基础状态机模型。同时,调度器记录触发各状态的种子标识、事件位置及相关场景上下文。
在制导阶段,调度器根据状态节点访问频率和状态转移边覆盖情况,动态分配不同种子的调度权重,优先选择能够到达低频状态节点的种子作为测试对象,使测试资源向尚未充分探索的样例集中。
通过上述机制,状态机模型不仅用于描述目标MQTT代理的协议行为,还承担测试反馈汇聚与调度引导的作用。

2.6 异常监测与反馈调整

为保证测试过程稳定运行,并支持测试样例持续演化,本文设计了监测—反馈闭环机制,包括异常监测和反馈调整两个环节。

2.6.1 服务端情况监测

监测模块开展目标可用性监测和执行反馈监测。一方面,通过心跳检测和进程守护实时监控目标MQTT代理的运行状态;当代理出现崩溃或挂起时,立即保存触发异常的测试样例及其相关上下文,用于后续复现与分析。另一方面,监测模块持续采集程序执行轨迹,记录代码分支覆盖变化,以及协议状态节点和状态转移边的访问情况。

2.6.2 测试反馈调整

测试引擎根据监测结果动态更新种子库和调度优先级。当某个变异输入触发新的代码分支覆盖、新的状态节点或新的状态转移路径时,调度器将其判定为高价值测试样例,并纳入种子库。通过持续保留具有新增覆盖收益的测试样例,测试过程能够逐步增强对深层协议逻辑和复杂异步交互行为的探索能力。

3 实验设计

为评估本文所提方法及其原型系统 MQTTFuzzer 的有效性,本文在主流物联网MQTT代理软件上开展实验。实验从代码分支覆盖数、状态空间探索能力、核心模块消融以及真实漏洞挖掘效果4个方面进行分析。

3.1 实验设置与对比基线

为保证测试过程稳定并提高实验结果的可复现性,测试环境统一配置为64位Ubuntu 20.04.6 LTS操作系统。硬件平台采用Intel Core i9-14900HX处理器和24GB物理内存。所有模糊测试工具均在相同计算资源条件下独立运行。
实验选取3款在物联网场景中广泛部署的主流开源MQTT代理软件作为测试目标,其基本信息见表1。对比基线选取两类具有代表性的协议模糊测试工具:一类为基于粗粒度状态指纹和单方通信模型的AFLNet;另一类为融合大语言模型、具备报文语义理解与生成能力的ChatAFL。
表 1 测试目标软件基本信息

Table 1 Basic information of target software under test

软件名称开发语言测试版本开源社区星标数
MosquittoC2.0.710.7k
NanoMQC0.24.62.4k
FlashMQC++1.24.0236

3.2 代码分支覆盖数对比分析

代码分支覆盖数反映了模糊测试对目标程序执行路径的探索程度,是评价测试充分性的重要指标。为评估本文方法的路径探索能力,本文统计了各工具在24 h测试周期内针对不同目标软件的累计代码分支覆盖数。
图3给出了24 h内代码分支覆盖数随时间变化的增长过程。横坐标为测试时间,纵坐标为累计代码分支覆盖数。可以看出,MQTTFuzzer在测试初期即表现出较快的覆盖增长速度,说明其能够较早突破协议前置处理路径并进入更深层的业务逻辑。随着测试推进,各工具代码分支覆盖数增速均逐渐放缓,但MQTTFuzzer在整个测试周期内始终保持领先。
图 3 24 h内代码分支覆盖数增长曲线对比

Fig.3 Comparison of code branch coverage growth curves within 24 hours

图4进一步给出了24 h测试结束时的最终结果。对于3个测试目标,MQTTFuzzer均取得最高代码分支覆盖数。其中,在Mosquitto、FlashMQ和NanoMQ上分别达到245641753583。与AFLNet相比,覆盖数分别增加392、334和125;与ChatAFL相比,分别增加398、353和172。
图 4 24 h最终代码分支覆盖数对比

Fig.4 Comparison of final code branch coverage after 24 hours

综合图3图4可知,本文方法在不同目标上均表现出更强的路径探索能力。一方面,覆盖数曲线在测试早期增长更快,表明多方交互场景驱动机制有助于提升有效路径到达效率;另一方面,24 h终值持续领先,说明语法感知变异与细粒度状态反馈在长期测试过程中能够保持对深层路径的有效探索。整体上,本文方法在覆盖广度和覆盖深度两个层面均优于对比基线。

3.3 状态空间探索能力分析

对于具有较强状态依赖性的MQTT代理软件,模糊测试工具对状态空间的刻画能力直接影响其对深层业务逻辑的探索范围。为分析本文方法在状态建模层面的优势,本文统计了各工具在测试结束后内部维护的状态机模型规模,并以状态节点数和状态转移边数作为比较指标,结果见表2
表 2 状态机模型规模对比

Table 2 Comparison of state transition graph size

测试工具FlashMQMosquittoNanoMQ
AFLNet10/5710/6110/70
ChatAFL11/7611/8311/93
本文方法24/25825/28714/206

注:X/X 表示状态节点数/状态转移边数。

表2可见,本文方法构建的状态机模型在状态节点数和状态转移边数上均高于对比工具。本文将状态节点数和状态转移边数作为状态表示粒度的量化指标,将最终代码分支覆盖数作为覆盖效率的量化指标。与AFLNet相比,本文方法在Mosquitto、FlashMQ和NanoMQ上的状态转移边数分别由61、57和70增加到287、258和206;对应的最终代码分支覆盖数分别由206438413458提升到245641753583,覆盖提升率分别为19.0%、8.7%和3.6%。结果表明,细粒度状态表示能够提供更丰富的状态反馈,并与更高的路径覆盖效果相对应。
需要说明的是,状态表示粒度并非越细越好。本文采用语义字段保留与波动字段过滤相结合的状态抽象方式,仅保留能够影响MQTT协议行为分支的会话状态、订阅关系、QoS处理和跨客户端路由等关键语义上下文,过滤包标识符、随机载荷等易造成冗余的字段。因此,本文方法增加的状态节点和状态转移边主要来源于有效语义状态,而非无关字段造成的状态膨胀,从而为调度器识别低频状态和深层转移路径提供了更有效的反馈。
为进一步说明细粒度语义状态特征的作用,图5以服务质量等级校验场景为例,对不同工具的状态刻画方式进行对比。在该场景下,服务端处理发布报文时同时受到会话阶段、报文标志位和订阅匹配关系等因素的影响。AFLNet仅依据网络层响应码提取状态特征,忽略了上下文信息,因此可能将底层执行路径不同但外部响应相同的处理过程归并为同一状态,造成状态混淆。本文方法则在状态提取过程中进一步考虑控制报文类型、会话保留标识和订阅树匹配结果等语义特征,从而将网络层表象相近但底层逻辑不同的处理过程划分为不同状态节点。该机制有助于减少状态混淆,提高测试过程对深层协议交互路径的识别能力。
图 5 微观状态表示机制对比

Fig.5 Comparison of micro-state representation mechanisms

3.4 核心模块消融实验

为分析各模块对整体测试性能的贡献,本文在3个目标服务端上设计了3组消融变体:其一,去除多客户端协同执行机制,并退化为单客户端发送,记为无协同变体;其二,去除状态引导调度机制,并采用随机调度,记为无状态变体;其三,关闭结构化解析,仅保留字节级盲变异,记为无语法变体。其中,完整方法指保留语法感知变异、多客户端协同执行和状态引导调度3个核心模块的原始方法配置。各变体的代码分支覆盖数结果见表3
表 3 核心模块消融实验代码分支覆盖数对比

Table 3 Comparison of code branch coverage in ablation experiments on core modules

变体名称 缺失核心模块 FlashMQ 差值 Mosquitto 差值 NanoMQ 差值
完整方法 4175 2456 3583
无语法变体 语法感知变异 3985 −190 2298 −158 3441 −142
无协同变体 多客户端协同执行 4034 −141 2427 −29 3424 −159
无状态变体 状态引导调度 4128 −47 2333 −123 3472 −111
表3可见,完整方法在3个测试目标上均取得最高代码分支覆盖数。去除任一核心模块后,代码分支覆盖数均出现不同程度下降。
从不同变体的表现看,无语法变体在FlashMQ和Mosquitto上的覆盖下降最为明显,分别较完整方法减少190和158。这表明,若缺少语法感知变异和结构化报文重构能力,测试输入更易退化为随机扰动,导致大量无效变异集中于对协议语义影响有限的区域,从而削弱对关键控制字段和深层处理逻辑的探索能力。
无协同变体在NanoMQ上的性能下降尤为明显,覆盖数较完整方法减少159。该结果说明,对于采用发布/订阅解耦机制的MQTT代理,仅依赖单客户端串行交互,难以充分触达由多方异步通信触发的处理路径。多客户端协同执行机制能够在更接近真实场景的条件下构造跨客户端交互上下文,因此对相关深层路径的覆盖具有直接作用。
无状态变体在所有目标上也均表现出明显退化,尤其在Mosquitto和NanoMQ上更为突出。这说明,若缺少细粒度状态提取和基于状态反馈的调度机制,测试过程将退化为无上下文的随机探索,难以持续聚焦于低频状态及其关联路径。由此可见,状态模型不仅用于行为抽象,还对测试资源的有效分配具有重要作用。
综上,语法感知变异、多客户端协同执行和状态引导调度分别从输入有效性、交互可达性和资源分配效率3个方面共同支撑了本文方法的整体性能。
为进一步分析多客户端协同执行机制带来的性能开销,本文采用固定测试样例集开展重放实验。考虑到多客户端协同执行机制主要引入多客户端连接维护、事件调度和多Socket响应收集等时间开销,而额外内存开销主要来自少量Socket句柄、客户端映射表和响应缓存,整体变化较小,因此本文主要从样例重放耗时角度进行评估。具体而言,从测试过程中选取相同数量的测试样例,分别采用单客户端串行执行方式和多客户端协同执行方式进行重放,并统计单个测试样例的平均执行时间。由于两种方式使用相同测试样例集,因此执行时间差异主要反映多客户端协同执行机制带来的额外开销。
表4可见,与单客户端串行执行相比,多客户端协同执行的平均样例执行时间有所增加。在Mosquitto、FlashMQ和NanoMQ上,单客户端平均耗时分别为59.010 ms、32.878 ms和48.033 ms,多客户端协同执行平均耗时分别为91.288 ms、83.164 ms和84.124 ms。该开销主要来源于协同执行器需要根据全局交互事件流维护多个客户端连接,并在不同连接之间进行事件调度和响应收集。尽管多客户端协同执行引入了一定时间开销,但其单样例平均执行时间仍处于百毫秒以内,整体影响相对可控。结合表3的消融实验结果可知,去除该机制后,代码分支覆盖数在3个测试目标上均出现下降,说明该机制能够提升对MQTT发布/订阅异步交互路径的覆盖能力。因此,多客户端协同执行机制带来的时间开销处于可接受范围,并在执行开销与复杂多方交互路径探索能力之间取得了一定权衡。
表 4 多客户端协同执行机制平均重放耗时对比

Table 4 Comparison of average replay time of multi-client collaborative execution mechanism

测试目标 样例数量 单客户端平均
耗时/ms
多客户端平均
耗时/ms
Mosquitto 1000 59.010 91.288
FlashMQ 1000 32.878 83.164
NanoMQ 1000 48.033 84.124

3.5 漏洞挖掘案例剖析

为评估本文方法在真实工业场景中的安全检测能力,本文采用完整方法对3款物联网MQTT代理软件进行了测试。在24 h测试周期内,工具共触发并定位3个具有安全影响的缺陷,其中包括2个已知漏洞和1个在NanoMQ中发现的此前未公开披露的缺陷。该缺陷已按负责任披露原则提交给项目维护者,截至本文撰写时,尚未收到正式反馈。相关结果见表5
表 5 目标代理软件漏洞挖掘结果汇总

Table 5 Summary of vulnerability discovery results for target broker software

测试目标漏洞编号与状态漏洞类型
MosquittoCVE-2021-34432拒绝服务
FlashMQCVE-2024-42645拒绝服务
NanoMQ已报告内存泄漏
表5表明,本文方法不仅能够提升代码分支覆盖数和状态空间探索范围,而且能够在真实目标上触发具有实际安全意义的异常行为。下面以NanoMQ0.24.6版本中一个内存泄漏缺陷为例,分析其触发机理。
该缺陷的触发依赖特定运行配置和多方异步交互条件。当目标服务端启用轻量级数据库持久化配置后,若订阅端保持长连接挂起状态,同时发布端持续向同一主题发送服务质量等级大于0的发布报文,服务端会在消息转发过程中反复克隆待分发的消息对象,导致其引用计数持续增加。在此过程中,由于持久化重传模块中的异常返回路径绕过了正常的引用计数回收逻辑,部分消息对象无法被正确释放,最终形成内存泄漏。随着发布流量持续累积,泄漏对象不断滞留并占用内存资源,最终导致服务端内存耗尽并触发拒绝服务。

4 结束语

针对传统模糊测试方法在MQTT协议多方交互和复杂状态流转场景下的不足,本文提出了一种面向多方交互场景的MQTT协议模糊测试方法,并基于该方法实现了原型系统 MQTTFuzzer。该方法通过全局时序场景建模、语法感知变异、多客户端协同执行以及细粒度状态提取与引导调度,提升了对MQTT代理深层业务逻辑的探索能力。实验结果表明,本文方法在Mosquitto、FlashMQ和NanoMQ三款主流MQTT代理软件上均取得了更高的代码分支覆盖数和更大的状态空间探索规模,并成功触发多个真实安全缺陷,验证了方法的有效性。
本文工作仍存在一定局限。当前状态提取机制仍依赖人工设计的协议语义特征,在面对实现差异和私有扩展时,可能出现状态抽象偏差;多客户端协同执行虽然增强了深层路径触发能力,但也引入了额外的执行与调度开销。
后续工作将围绕以下几个方面展开:结合程序动态信息与大语言模型辅助分析,提高状态建模和报文生成的自动化程度;引入快照复用等技术,进一步提升测试效率;结合差分测试与规范一致性分析,增强对逻辑偏差类漏洞的发现能力。
1
Gubbi J, Buyya R, Marusic S, et al. Internet of Things (IoT): A vision, architectural elements, and future directions[J]. Future Generation Computer Systems, 2013, 29 (7): 1645- 1660.

DOI

2
Choudhary A. Internet of Things: A comprehensive overview, architectures, applications, simulation tools, challenges and future directions[J]. Discover Internet of Things, 2024, 4 (1): 31.

DOI

3
Dauda A, Flauzac O, Nolot F. A survey on IoT application architectures[J]. Sensors, 2024, 24 (16): 5320.

DOI

4
OASIS. MQTT Version 5.0[EB/OL]. [2019-03-07][2026-04-18]. https://docs.oasis-open.org/mqtt/mqtt/v5.0/mqtt-v5.0.html.

5
BORSATTI D, CERRONI W, TONINI F, et al. From IoT to cloud: Applications and performance of the MQTT protocol[C]//2020 22nd International Conference on Transparent Optical Networks (ICTON). IEEE, 2020: 1-4.

6
Laghari A A, Li H, Khan A A, et al. Internet of Things (IoT) applications security trends and challenges[J]. Discover Internet of Things, 2024, 4 (1): 36.

DOI

7
张玉清, 周威, 彭安妮. 物联网安全综述[J]. 计算机研究与发展, 2017, 54 (10): 2130- 2143.

DOI

Zhang Y Q, Zhou W, Peng A N. Survey of Internet of Things security[J]. Journal of Computer Research and Development, 2017, 54 (10): 2130- 2143.

DOI

8
YUAN B, SONG Z, JIA Y, et al. MQTTactic: Security analysis and verification for logic flaws in MQTT implementations[C]//2024 IEEE Symposium on Security and Privacy (SP). IEEE, 2024: 2385-2403.

9
Manes V J M, Han H S, Han C, et al. The art, science, and engineering of fuzzing: A survey[J]. IEEE Transactions on Software Engineering, 2019, 47 (11): 2312- 2331.

10
任泽众, 郑晗, 张嘉元, 等. 模糊测试技术综述[J]. 计算机研究与发展, 2021, 58 (5): 944- 963.

DOI

Ren Z Z, Zheng H, Zhang J Y, et al. A review of fuzzing techniques[J]. Journal of Computer Research and Development, 2021, 58 (5): 944- 963.

DOI

11
PHAM V T, BOHME M, ROYCHOUDHURY A. AflNet: A greybox fuzzer for network protocols[C]//2020 IEEE 13th International Conference on Software Testing, Validation and Verification (ICST). IEEE, 2020: 460-465.

12
徐威, 李鹏, 张文镔, 等. 网络协议模糊测试综述[J]. 计算机应用研究, 2023, 40 (8): 2241- 2249.

Xu W, Li P, Zhang W B, et al. Survey of network protocol fuzzing[J]. Application Research of Computers, 2023, 40 (8): 2241- 2249.

13
AMINI P. Sulley[EB/OL]. [2026-04-19]. https://github.com/OpenRCE/sulley.

14
PEREYDA J. Boofuzz: A network protocol fuzzing framework[EB/OL]. (2017-05-16)[2026-04-19]. https://github.com/jtpereyda/boofuzz.

15
Gorbunov S, Rosenbloom A. Autofuzz: Automated network protocol fuzzing framework[J]. IJCSNS, 2010, 10 (8): 239.

16
GASCON H, WRESSNEGGER C, YAMAGUCHI F, et al. Pulsar: Stateful black-box fuzzing of proprietary network protocols[C]//International Conference on Security and Privacy in Communication Systems. Cham: Springer International Publishing, 2015: 330-347.

17
JERO S, PACHECO M L, GOLDWASSER D, et al. Leveraging textual specifications for grammar-based fuzzing of network protocols[C]//Proceedings of the AAAI Conference on Artificial Intelligence, 2019, 33(1): 9478-9483.

18
Natella R. StateAFL: Greybox fuzzing for stateful network servers[J]. Empirical Software Engineering, 2022, 27 (7): 191.

DOI

19
Qin S, Hu F, Ma Z, et al. NSFuzz: Towards efficient and state-aware network service fuzzing[J]. ACM Transactions on Software Engineering and Methodology, 2023, 32 (6): 1- 26.

DOI

20
Li J, Li S, Sun G, et al. SNPSFuzzer: A fast greybox fuzzer for stateful network protocols using snapshots[J]. IEEE Transactions on Information Forensics and Security, 2022, 17, 2673- 2687.

DOI

21
LUO Z, ZUO F, SHEN Y, et al. ICS protocol fuzzing: Coverage guided packet crack and generation[C]//2020 57th ACM/IEEE Design Automation Conference (DAC). IEEE, 2020: 1-6.

22
Pan Z, Zhang L, Hu Z, et al. SATFuzz: A stateful network protocol fuzzing framework from a novel perspective[J]. Applied Sciences, 2022, 12 (15): 7459.

DOI

23
LUO Z, YU J, ZUO F, et al. BLEEM: Packet sequence oriented fuzzing for protocol implementations[C]//32nd USENIX Security Symposium (USENIX Security 23). 2023: 4481-4498.

24
WU F, LUO Z, ZHAO Y, et al. Logos: Log guided fuzzing for protocol implementations[C]//Proceedings of the 33rd ACM SIGSOFT International Symposium on Software Testing and Analysis. 2024: 1720-1732.

25
MENG R, MIRCHEV M, BOHME M, et al. Large language model guided protocol fuzzing[C]//Proceedings of the 31st Annual Network and Distributed System Security Symposium. Reston: Internet Society, 2024.

26
Cheng M, Zhu K, Chen Y, et al. MSFuzz: Augmenting protocol fuzzing with message syntax comprehension via large language models[J]. Electronics, 2024, 13 (13): 2632.

DOI

27
张东, 詹一宸, 白家驹, 等. 大语言模型驱动的网络协议逆向与安全测试方法[J]. 网络空间安全科学学报, 2026, 4 (1): 1- 12.

DOI

Zhang Dong, Zhan Yichen, Bai Jiaju, et al. Large language model-driven network protocol reverse engineering and security testing methods[J]. Journal of Cybersecurity, 2026, 4 (1): 1- 12.

DOI

28
SUN Y, LUO Q, WANG Y, CHEN Q, LIU B, CHEN R, HUANG Q, LI X, WANG J. SemFuzz: A semantics-aware fuzzing framework for network protocol implementations[C]//Proceedings of the ACM Web Conference 2026. 2026: 3251-3262.

29
Zeng Y, Lin M, Guo S, et al. MultiFuzz: A coverage-based multiparty-protocol fuzzer for IoT publish/subscribe protocols[J]. Sensors, 2020, 20 (18): 5194.

DOI

30
PEARSON B, ZHANG Y, ZOU C, et al. FUME: Fuzzing Message Queuing Telemetry Transport brokers[C]//IEEE INFOCOM 2022-IEEE Conference on Computer Communications. IEEE, 2022: 1699-1708.

31
Wei Z, Wei X, Zhao X, et al. SGANFuzz: A deep learning-based MQTT fuzzing method using generative adversarial networks[J]. IEEE Access, 2024, 12, 27210- 27224.

DOI

32
LIU X, WANG Q, LIU P, et al. MQueez: Specification-driven fuzzing for MQTT broker (Registered Report) [C]//Proceedings of the 34th ACM SIGSOFT International Symposium on Software Testing and Analysis. 2025: 133-142.

33
SONG X, WU J, ZENG Y, et al. MBFuzzer: A multi-part protocol fuzzer for MQTT brokers[C]//34th USENIX Security Symposium (USENIX Security 25). 2025: 6179-6197.

Outlines

/