Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
NanoMQ-Memory-Leak-Research — Avis public et analyse technique pour CVE-2026-36590, une vulnérabilité de déni de service dans NanoMQ v0.24.9. | Kitploit
Outils/GitHubGitHub/moxie25/nanomq-memory-leak-research
Analyse StatiqueAnalyse Dynamique (Sandboxing)Sécurité IoTCriminalistique MémoireAnalyse des VulnérabilitésExploitationTests d'Intrusion
GitHubmoxie25/nanomq-memory-leak-research

NanoMQ-Memory-Leak-Research

Avis public et analyse technique pour CVE-2026-36590, une vulnérabilité de déni de service dans NanoMQ v0.24.9.

Voir le dépôt
4il y a 2 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2026-36590 : Déni de service dans EMQ NanoMQ v0.24.9

Ce dépôt contient l'avis public et l'analyse technique pour CVE-2026-36590, une vulnérabilité de déni de service affectant EMQ NanoMQ v0.24.9.

Note de révision

Ce dépôt est public pour fournir une référence technique accessible pour la révision du CVE. La classification finale de CVE-2026-36590 sera déterminée par l'équipe CVE ou le CNA concerné.

L'équipe NanoMQ a contesté ce problème et le considère comme lié à la configuration. Ce dépôt se concentre sur les preuves techniques, y compris les éléments de reproduction, les résultats ASAN, les journaux d'exécution et l'analyse du code source.

Informations sur l'avis

  • Identifiant CVE : CVE-2026-36590
  • Fournisseur/Projet : EMQ / NanoMQ
  • Produit : NanoMQ
  • Version concernée : v0.24.9
  • Type de vulnérabilité : Déni de service / Épuisement des ressources
  • Composant concerné : /nanomq/nng/src/supplemental/mqtt/mqtt_qos_db_api.c / nni_qos_db_set
  • CWE : CWE-772, CWE-400
  • Date de divulgation publique : 2026-06-17

Résumé

Lorsque NanoMQ v0.24.9 est compilé sans le support SQLite alors que est configuré sur , le pointeur de la base de données QoS peut rester . Lors du traitement des messages QoS MQTT, peut revenir prématurément sans libérer une référence de message clonée. Des messages PUBLISH MQTT avec QoS > 0 répétés peuvent entraîner une consommation continue de mémoire, menant finalement à un déni de service.

sqlite.enable
true
NULL
nni_qos_db_set

Pourquoi ce problème nécessite encore une révision

Le problème dépend d'une configuration d'exécution non standard, mais les faits suivants montrent pourquoi il nécessite encore une révision approfondie :

  1. NanoMQ accepte la configuration d'exécution et continue de fonctionner, au lieu de signaler que le support SQLite n'est pas disponible dans la version actuelle.

  2. Cette incohérence de configuration peut se produire en pratique. Un utilisateur peut compiler NanoMQ avec la commande de construction normale, puis copier ou activer ultérieurement la section de persistance SQLite à partir d'un fichier de configuration d'exemple.

  3. Le chemin de code affecté ne valide pas complètement cet état incohérent. Lorsque la configuration d'exécution considère SQLite comme activé mais que le pointeur de la base de données est NULL, nni_qos_db_set() revient prématurément sans libérer l'objet message passé.

  4. Une fois cette configuration acceptée, le problème peut être déclenché par du trafic MQTT distant. Des messages PUBLISH avec QoS > 0 répétés peuvent entrer dans le chemin affecté et provoquer des fuites de mémoire accumulées.

  5. Les tests ASAN avec 1, 50 et 500 cycles de reproduction montrent que les octets et les allocations fuités augmentent avec le nombre de tentatives de déclenchement. Cela suggère que le problème dépend du nombre d'entrées, plutôt que d'une petite fuite ponctuelle.

Atténuation

Les utilisateurs doivent restreindre l'accès aux instances NanoMQ, éviter d'exposer les services MQTT à des clients non fiables, et éviter d'activer la persistance SQLite dans les versions sans support SQLite. Le fournisseur doit ajouter une validation au démarrage pour la configuration SQLite et libérer la référence du message dans la branche db == NULL de nni_qos_db_set.

NanoMQ-Memory-Leak-Research

Pièces jointes

  1. Analysis_Report.md : La ventilation complète de l'analyse, y compris les diagrammes de cycle de vie et les traces de journaux détaillées.
  2. 249exploit_leak.py : Script PoC Python pour reproduire la fuite.
  3. nanomq.conf : Le fichier de configuration utilisé pour déclencher l'incohérence.
  4. runtime_logs.log : Journaux d'instrumentation démontrant l'anomalie du compteur de références.
  5. Docker/ : Environnement de reproduction conteneurisé utilisé pour déclencher et valider de manière fiable la vulnérabilité dans des conditions contrôlées.
    Des instructions de construction détaillées et les étapes de configuration de l'environnement sont fournies dans :
    Docker/Docker_Reproduction_Guide.md
  6. 249asan_log.txt : Journal d'exécution AddressSanitizer (ASAN) capturé à partir de NanoMQ v0.24.9, démontrant la fuite de mémoire et le comportement mémoire anormal associé.

Résumé de l'analyse technique

Résumé Ce dépôt contient la preuve de concept (PoC) et l'analyse détaillée d'une vulnérabilité de fuite de mémoire trouvée dans NanoMQ. Le problème permet à des attaquants distants de provoquer un déni de service (DoS) en épuisant la mémoire système via des messages MQTT QoS spécifiques.

J'ai mené une analyse approfondie d'un phénomène de fuite de mémoire dans NanoMQ. Grâce à une instrumentation dynamique et à une revue de code, j'ai identifié un chemin critique de fuite de ressources déclenché lorsque la configuration d'exécution active SQLite (sqlite.enable=true) mais que le binaire est compilé sans le support SQLite (NNG_SUPP_SQLITE non défini).

Pour rester concis, j'ai résumé les principales conclusions ci-dessous. Pour l'analyse technique complète (y compris les traces ASAN détaillées, les diagrammes de cycle de vie et les journaux d'instrumentation), veuillez vous référer au fichier Analysis_Report.md ci-joint.


Le processus d'analyse

1. Détection initiale (analyse ASAN)

À l'aide d'AddressSanitizer, j'ai localisé la source de la mémoire fuitée dans nni_msg_alloc au sein de tcptran_pipe_recv_cb (nng/src/sp/transport/mqtt/broker_tcp.c). La mémoire était allouée mais jamais complètement libérée.

2. Modélisation du cycle de vie (la référence "3 clones vs. 3 libérations")

J'ai analysé le mécanisme de comptage de références de nni_msg. Un cycle de vie normal d'un message QoS 1 devrait impliquer :

  • Alloc (+1) : Réception réseau.
  • Clone 1 (+1) : Répartition au niveau de l'application.
  • Clone 2 (+1) : Logique de persistance/retransmission.
  • Réfs totales : 3 -> Libérations requises : 3.

3. Traçage dynamique et vérification

GDB étant peu pratique pour ce scénario de haute concurrence, j'ai utilisé une instrumentation dynamique pour tracer le cycle de vie d'objets mémoire spécifiques (par exemple, 0x60e00002ffa0). La découverte : Les journaux ont confirmé une inadéquation du cycle de vie :

  • Allocations réelles : 3 (Alloc + Clone 1 + Clone 2)
  • Libérations réelles : 2 (Libération 1 + Libération 2)
  • Résultat : Le compteur de références est resté à 1, provoquant la fuite. La libération manquante correspond au Clone 2 généré dans nmq_pipe_send_start_v4.

4. Identification de la cause racine

Le traçage du flux d'exécution a révélé pourquoi la 3e libération manquait :

  1. L'incohérence : Le binaire a été compilé sans -DNNG_SUPP_SQLITE, ce qui a entraîné le retrait de la logique d'initialisation dans nano_sock_setdb. Cependant, nanomq.conf avait sqlite.enable = true. Cela a fait que le pointeur db est resté NULL.
  2. La logique défectueuse (le "Retour prématuré") : Lorsque le message (Ref=3) entre dans nni_qos_db_set pour stockage, la fonction vérifie le pointeur NULL :
root@kitploit:~
// Fichier : /nanomq/nng/src/supplemental/mqtt/mqtt_qos_db_api.c
void nni_qos_db_set(..., void *db, ..., nng_msg *msg) {
    if (db == NULL) {
        // DÉFAUT CRITIQUE :
        // Le retour prématuré se déclenche car db est NULL.
        // La fonction détient la propriété de 'msg' (Ref++) mais ne la libère pas.
        return; 
    }
    // ...
}

La fonction revient silencieusement sans appeler nni_msg_free(msg). Cela entraîne la perte irrémédiable du pointeur msg, abandonnant effectivement le bloc mémoire.


Conclusion et impact

  • Cause racine : Un manque de programmation défensive dans nni_qos_db_set. Elle ne gère pas la propriété du pointeur msg lors d'un retour prématuré dû à un état de base de données invalide.
  • Impact : Cela conduit à un DoS silencieux. Des messages continus avec QoS > 0—provenant soit du trafic client normal, soit d'un acteur malveillant—épuiseront progressivement la mémoire système (OOM), faisant finalement planter le courtier.

Recommandations :

  1. Échec rapide (vérification au démarrage) : Ajouter une logique de validation pendant la phase de démarrage du système (nano_sock_setdb ou fonction main) pour s'assurer que SQLite fonctionne correctement. Si conf->sqlite.enable == true est détecté mais que la macro NNG_SUPP_SQLITE n'est pas définie ou que SQLite est anormal, le système doit soit quitter avec une erreur, soit forcer la désactivation de enable à false et afficher un avertissement.
  2. Sécurité des ressources (sécurisation) : Ajouter une logique de libération des ressources dans la branche de retour prématuré de la fonction nni_qos_db_set. Si db == NULL, nni_msg_free(msg) doit être appelé pour équilibrer le compteur de références et éviter les fuites de mémoire.
Télécharger l’outil