Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
NanoMQ-Memory-Leak-Research — 针对 CVE-2026-36590 的公开通告和技术分析,这是一个 NanoMQ v0.24.9 拒绝服务漏洞。 | Kitploit
工具/GitHubGitHub/moxie25/nanomq-memory-leak-research
静态分析动态分析 (沙盒)物联网安全内存取证漏洞分析漏洞利用渗透测试
GitHubmoxie25/nanomq-memory-leak-research

NanoMQ-Memory-Leak-Research

针对 CVE-2026-36590 的公开通告和技术分析,这是一个 NanoMQ v0.24.9 拒绝服务漏洞。

查看仓库
42个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-36590:EMQ NanoMQ v0.24.9 中的拒绝服务漏洞

本仓库包含 CVE-2026-36590 的公开公告和技术分析,这是一项影响 EMQ NanoMQ v0.24.9 的拒绝服务漏洞。

审核说明

本仓库公开旨在为 CVE 审核提供可访问的技术参考。CVE-2026-36590 的最终分类将由 CVE 团队或相关 CNA 决定。

NanoMQ 团队对该问题提出异议,并认为其与配置相关。本仓库侧重于技术证据,包括复现材料、ASAN 结果、运行时日志和源码分析。

公告信息

  • CVE ID:CVE-2026-36590
  • 厂商/项目:EMQ / NanoMQ
  • 产品:NanoMQ
  • 受影响版本:v0.24.9
  • 漏洞类型:拒绝服务 / 资源耗尽
  • 受影响组件:/nanomq/nng/src/supplemental/mqtt/mqtt_qos_db_api.c / nni_qos_db_set
  • CWE:CWE-772、CWE-400
  • 公开披露日期:2026-06-17

摘要

当 NanoMQ v0.24.9 在没有 SQLite 支持的情况下编译,而 sqlite.enable 被配置为 true 时,QoS 数据库指针可能保持为 NULL。在 MQTT QoS 消息处理过程中,nni_qos_db_set 可能提前返回而不释放克隆的消息引用。重复的 QoS > 0 MQTT PUBLISH 消息可能导致持续的内存消耗,最终导致拒绝服务。

为何该问题仍需审核

该问题依赖于非默认的运行时配置,但以下事实表明为何仍需进一步审核:

  1. NanoMQ 接受该运行时配置并继续运行,而不是报告当前构建中不支持 SQLite。

  2. 这种配置不匹配在实际中是可能发生的。用户可能使用常规构建命令编译 NanoMQ,但之后从示例配置文件中复制或启用了 SQLite 持久化部分。

  3. 受影响的代码路径未完全验证这种不一致的状态。当运行时配置将 SQLite 视为已启用但数据库指针为 NULL 时,nni_qos_db_set() 提前返回而不释放传入的消息对象。

  4. 一旦该配置被接受,此问题即可由远程 MQTT 流量触发。重复的 QoS > 0 PUBLISH 消息可进入受影响的路径并导致累积的内存泄漏。

  5. 使用 1、50 和 500 轮复现的 ASAN 测试表明,泄漏的字节数和分配次数随触发尝试次数增加而增加。这表明该问题与输入数量相关,而非一次性的小泄漏。

缓解措施

用户应限制对 NanoMQ 实例的访问,避免将 MQTT 服务暴露给不受信任的客户端,并避免在不支持 SQLite 的构建中启用 SQLite 持久化。厂商应在 nni_qos_db_set 的 db == NULL 分支中添加 SQLite 配置的启动验证,并释放消息引用。

NanoMQ-Memory-Leak-Research

附件

  1. Analysis_Report.md:分析的完整分解,包括生命周期图和详细的日志跟踪。
  2. 249exploit_leak.py:用于复现该泄漏的 Python PoC 脚本。
  3. nanomq.conf:用于触发配置不匹配的配置文件。
  4. runtime_logs.log:展示引用计数异常的插桩日志。
  5. Docker/:用于在受控条件下可靠触发并验证该漏洞的容器化复现环境。
    详细的构建说明和环境搭建步骤见:
    Docker/Docker_Reproduction_Guide.md
  6. 249asan_log.txt:从 NanoMQ v0.24.9 捕获的 AddressSanitizer (ASAN) 运行时日志,展示了内存泄漏及相关异常内存行为。

技术分析摘要

摘要 本仓库包含针对 NanoMQ 中发现的内存泄漏漏洞的概念验证(PoC)和详细分析。该问题允许远程攻击者通过特定的 QoS MQTT 消息耗尽系统内存,从而造成拒绝服务(DoS)。

我对 NanoMQ 中的内存泄漏现象进行了深入分析。通过动态插桩和代码审查,我确定了一条关键的资源泄漏路径,该路径在**运行时配置启用了 SQLite(sqlite.enable=true)但二进制文件编译时未包含 SQLite 支持(NNG_SUPP_SQLITE 未定义)**时被触发。

为保持本文简洁,我在下方总结了关键发现。如需完整的技术分解(包括详细的 ASAN 跟踪、生命周期图和插桩日志),请参阅附件 Analysis_Report.md。


分析过程

1. 初步检测(ASAN 分析)

使用 AddressSanitizer,我将泄漏内存的来源定位到 tcptran_pipe_recv_cb(nng/src/sp/transport/mqtt/broker_tcp.c)中的 nni_msg_alloc。该内存被分配后从未被完全释放。

2. 生命周期建模(“3 次克隆 vs. 3 次释放”基线)

我分析了 nni_msg 的引用计数机制。正常的 QoS 1 消息生命周期应包括:

  • 分配(+1):网络接收。
  • 克隆 1(+1):应用层分发。
  • 克隆 2(+1):持久化/重传逻辑。
  • 总引用数:3 -> 所需释放次数:3。

3. 动态跟踪与验证

由于 GDB 在这种高并发场景下不实用,我使用动态插桩来跟踪特定内存对象(例如 0x60e00002ffa0)的生命周期。 发现: 日志确认了生命周期不匹配:

  • 实际分配次数:3(分配 + 克隆 1 + 克隆 2)
  • 实际释放次数:2(释放 1 + 释放 2)
  • 结果:引用计数保持为 1,导致泄漏。缺失的释放对应于在 nmq_pipe_send_start_v4 中生成的克隆 2。

4. 根因确定

跟踪执行流程揭示了第 3 次释放缺失的原因:

  1. 配置不匹配:二进制文件编译时未包含 -DNNG_SUPP_SQLITE,导致 nano_sock_setdb 中的初始化逻辑被剔除。然而,nanomq.conf 中设置了 sqlite.enable = true。这导致 db 指针保持为 NULL。
  2. 缺陷逻辑(“提前返回”): 当消息(引用数=3)进入 nni_qos_db_set 进行存储时,该函数会检查 NULL 指针:
root@kitploit:~
// File: /nanomq/nng/src/supplemental/mqtt/mqtt_qos_db_api.c
void nni_qos_db_set(..., void *db, ..., nng_msg *msg) {
    if (db == NULL) {
        // CRITICAL FLAW:
        // Early return triggers because db is NULL.
        // The function holds ownership of 'msg' (Ref++) but fails to release it.
        return; 
    }
    // ...
}

该函数静默返回,未调用 nni_msg_free(msg)。这导致 msg 指针不可挽回地丢失,实际上使内存块成为孤儿内存。


结论与影响

  • 根本原因:nni_qos_db_set 中缺乏防御性编程。当由于无效的数据库状态而执行提前返回时,它没有处理 msg 指针的所有权。
  • 影响:这会导致静默式拒绝服务(Silent DoS)。持续的 QoS > 0 消息——无论来自正常客户端流量还是恶意行为者——都将逐渐耗尽系统内存(OOM),最终导致 broker 崩溃。

建议:

  1. 快速失败(启动检查):在系统启动阶段(nano_sock_setdb 或 main 函数)添加验证逻辑,以确保 SQLite 正常运行。如果检测到 conf->sqlite.enable == true 但 NNG_SUPP_SQLITE 宏未定义或 SQLite 异常,系统应报错退出,或强制将 enable 设置为 false 并打印警告。
  2. 资源安全(故障安全):在 nni_qos_db_set 函数的提前返回分支中添加资源释放逻辑。如果 db == NULL,必须调用 nni_msg_free(msg) 以平衡引用计数并防止内存泄漏。
下载工具