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
Статический анализДинамический анализ (песочница)Безопасность IoTКриминалистика памятиАнализ уязвимостейЭксплуатацияТестирование на Проникновение
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 может вернуться рано, не освободив клонированную ссылку на сообщение. Повторяющиеся MQTT PUBLISH-сообщения с QoS > 0 могут вызвать непрерывное потребление памяти, что в конечном итоге приведёт к отказу в обслуживании.

Почему эта проблема всё ещё требует рассмотрения

Проблема зависит от нестандартной конфигурации выполнения, но следующие факты показывают, почему она всё ещё требует дальнейшего рассмотрения:

  1. NanoMQ принимает конфигурацию выполнения и продолжает работу, вместо того чтобы сообщить, что поддержка SQLite недоступна в текущей сборке.

  2. Такое несоответствие конфигурации может произойти на практике. Пользователь может собрать NanoMQ обычной командой сборки, а затем скопировать или включить раздел сохранения SQLite из примера конфигурационного файла.

  3. Затронутый путь кода не fully проверяет это неконсистентное состояние. Если конфигурация выполнения считает SQLite включённым, но указатель базы данных равен NULL, nni_qos_db_set() возвращается рано, не освобождая переданный объект сообщения.

  4. После того как эта конфигурация принята, проблема может быть вызвана удалённым MQTT-трафиком. Повторяющиеся PUBLISH-сообщения с QoS > 0 могут попасть на затронутый путь и вызвать накопленные утечки памяти.

  5. Тесты ASAN с 1, 50 и 500 раундами воспроизведения показывают, что количество утёкших байт и выделений увеличивается с числом попыток триггера. Это говорит о том, что проблема зависит от количества входных данных, а не является одноразовой небольшой утечкой.

Смягчение

Пользователям следует ограничить доступ к экземплярам NanoMQ, избегать предоставления MQTT-сервисов ненадёжным клиентам и не включать сохранение SQLite в сборках без поддержки SQLite. Вендору следует добавить проверку конфигурации SQLite при запуске и освобождать ссылку на сообщение в ветви db == NULL функции nni_qos_db_set.

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: Журнал выполнения AddressSanitizer (ASAN), захваченный для NanoMQ v0.24.9, демонстрирующий утечку памяти и связанное аномальное поведение памяти.

Краткое техническое описание анализа

Краткое описание Этот репозиторий содержит Proof of Concept (PoC) и подробный анализ уязвимости утечки памяти, найденной в NanoMQ. Проблема позволяет удалённым злоумышленникам вызвать отказ в обслуживании (DoS) путём истощения системной памяти через определённые MQTT-сообщения QoS.

Я провёл углублённый анализ явления утечки памяти в Nanomq. С помощью динамической инструментации и рецензирования кода я выявил критический путь утечки ресурсов, который возникает, когда конфигурация выполнения включает SQLite (sqlite.enable=true), но бинарный файл скомпилирован без поддержки SQLite (NNG_SUPP_SQLITE не определён).

Чтобы сохранить краткость этой проблемы, я обобщил ключевые выводы ниже. Полный технический разбор (включая подробные трассировки ASAN, диаграммы жизненного цикла и журналы инструментации) см. в приложенном файле Analysis_Report.md.


Процесс анализа

1. Первоначальное обнаружение (анализ ASAN)

Используя AddressSanitizer, я определил источник утечки памяти в nni_msg_alloc внутри tcptran_pipe_recv_cb (nng/src/sp/transport/mqtt/broker_tcp.c). Память выделялась, но никогда полностью не освобождалась.

2. Моделирование жизненного цикла (базовый уровень «3 клона против 3 освобождений»)

Я проанализировал механизм подсчёта ссылок nni_msg. Нормальный жизненный цикл сообщения QoS 1 должен включать:

  • Alloc (+1): Приём из сети.
  • Clone 1 (+1): Диспетчеризация на уровне приложения.
  • Clone 2 (+1): Логика сохранения/повторной передачи.
  • Всего ссылок: 3 -> Необходимо освобождений: 3.

3. Динамическая трассировка и проверка

Поскольку GDB был непрактичен для этого сценария высокой степени параллелизма, я использовал динамическую инструментацию для трассировки жизненного цикла конкретных объектов памяти (например, 0x60e00002ffa0). Результат: Журналы подтвердили несоответствие жизненного цикла:

  • Фактические выделения: 3 (Alloc + Clone 1 + Clone 2)
  • Фактические освобождения: 2 (Free 1 + Free 2)
  • Результат: Счётчик ссылок остался равным 1, что вызвало утечку. Недостающее освобождение соответствует Clone 2, созданному в nmq_pipe_send_start_v4.

4. Определение первопричины

Трассировка потока выполнения показала, почему отсутствовало 3-е освобождение:

  1. Несоответствие: Бинарный файл был скомпилирован без -DNNG_SUPP_SQLITE, из-за чего логика инициализации в nano_sock_setdb была удалена. Однако в nanomq.conf было установлено sqlite.enable = true. Это привело к тому, что указатель db остался NULL.
  2. Дефектная логика («ранний возврат»): Когда сообщение (Ref=3) поступает в nni_qos_db_set для сохранения, функция проверяет нулевой указатель:
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) {
        // КРИТИЧЕСКАЯ ОШИБКА:
        // Ранний возврат происходит, потому что db == NULL.
        // Функция получает владение 'msg' (Ref++), но не освобождает его.
        return; 
    }
    // ...
}

Функция возвращается молча, не вызывая nni_msg_free(msg). В результате указатель msg безвозвратно теряется, фактически оставляя блок памяти осиротевшим.


Заключение и влияние

  • Первопричина: Отсутствие защитного программирования в nni_qos_db_set. Она не обрабатывает владение указателем msg при раннем возврате из-за недопустимого состояния БД.
  • Влияние: Это приводит к «тихому» DoS. Постоянные сообщения с QoS > 0 — как от обычного клиентского трафика, так и от злоумышленника — будут постепенно истощать системную память (OOM), что в конечном итоге приведёт к сбою брокера.

Рекомендации:

  1. «Fail Fast» (проверка при запуске): Добавить логику проверки на этапе запуска системы (nano_sock_setdb или функция main), чтобы убедиться в корректной работе SQLite. Если обнаружено conf->sqlite.enable == true, но макрос NNG_SUPP_SQLITE не определён или SQLite неисправен, система должна либо завершиться с ошибкой, либо принудительно установить enable в false и вывести предупреждение.
  2. Безопасность ресурсов (fail-safe): Добавить логику освобождения ресурсов в ветвь раннего возврата функции nni_qos_db_set. Если db == NULL, необходимо вызвать nni_msg_free(msg), чтобы сбалансировать счётчик ссылок и предотвратить утечку памяти.
Скачать инструмент