Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
NanoMQ-Memory-Leak-Research — Advisory pubblico e analisi tecnica per CVE-2026-36590, una vulnerabilità denial-of-service in NanoMQ v0.24.9. | Kitploit
Strumenti/GitHubGitHub/moxie25/nanomq-memory-leak-research
Analisi StaticaAnalisi Dinamica (Sandboxing)Sicurezza IoTMemory ForensicsAnalisi delle VulnerabilitàExploitPenetration Testing
GitHubmoxie25/nanomq-memory-leak-research

NanoMQ-Memory-Leak-Research

Advisory pubblico e analisi tecnica per CVE-2026-36590, una vulnerabilità denial-of-service in NanoMQ v0.24.9.

Vedi Repository
42 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-36590: Negazione del servizio in EMQ NanoMQ v0.24.9

Questo repository contiene l'advisory pubblico e l'analisi tecnica per CVE-2026-36590, una vulnerabilità di negazione del servizio che colpisce EMQ NanoMQ v0.24.9.

Nota di revisione

Questo repository è pubblico per fornire un riferimento tecnico accessibile per la revisione della CVE. La classificazione finale di CVE-2026-36590 sarà determinata dal CVE Team o dal CNA competente.

Il team di NanoMQ ha contestato questo problema e lo considera legato alla configurazione. Questo repository si concentra sulle evidenze tecniche, inclusi materiali di riproduzione, risultati ASAN, log di runtime e analisi del codice sorgente.

Informazioni sull'advisory

  • CVE ID: CVE-2026-36590
  • Fornitore/Progetto: EMQ / NanoMQ
  • Prodotto: NanoMQ
  • Versione interessata: v0.24.9
  • Tipo di vulnerabilità: Negazione del servizio / Esaurimento delle risorse
  • Componente interessato: /nanomq/nng/src/supplemental/mqtt/mqtt_qos_db_api.c/ nni_qos_db_set
  • CWE: CWE-772, CWE-400
  • Data di divulgazione pubblica: 2026-06-17

Riepilogo

Quando NanoMQ v0.24.9 viene compilato senza supporto SQLite mentre sqlite.enable è configurato su true, il puntatore al database QoS può rimanere NULL. Durante la gestione dei messaggi MQTT con QoS, nni_qos_db_set può uscire prematuramente senza rilasciare un riferimento a un messaggio clonato. Messaggi MQTT PUBLISH ripetuti con QoS > 0 possono causare un consumo continuo di memoria, portando infine alla negazione del servizio.

Perché questo problema richiede ancora una revisione

Il problema dipende da una configurazione runtime non predefinita, ma i seguenti fatti mostrano perché richiede ancora un'ulteriore revisione:

  1. NanoMQ accetta la configurazione runtime e continua a funzionare, invece di segnalare che il supporto SQLite non è disponibile nella build corrente.

  2. Questa discrepanza di configurazione può verificarsi nella pratica. Un utente può compilare NanoMQ con il normale comando di build, ma successivamente copiare o abilitare la sezione di persistenza SQLite da un file di configurazione di esempio.

  3. Il percorso di codice interessato non convalida completamente questo stato incoerente. Quando la configurazione runtime considera SQLite abilitato ma il puntatore al database è NULL, nni_qos_db_set() esce prematuramente senza rilasciare l'oggetto messaggio passato.

  4. Dopo che questa configurazione viene accettata, il problema può essere innescato dal traffico MQTT remoto. Messaggi PUBLISH ripetuti con QoS > 0 possono entrare nel percorso interessato e causare perdite di memoria accumulate.

  5. I test ASAN con 1, 50 e 500 cicli di riproduzione mostrano che i byte e le allocazioni persi aumentano con il numero di tentativi di attivazione. Ciò suggerisce che il problema dipende dal numero di input, piuttosto che essere una piccola perdita una tantum.

Mitigazione

Gli utenti dovrebbero limitare l'accesso alle istanze di NanoMQ, evitare di esporre i servizi MQTT a client non affidabili ed evitare di abilitare la persistenza SQLite in build senza supporto SQLite. Il fornitore dovrebbe aggiungere una convalida all'avvio per la configurazione SQLite e rilasciare il riferimento al messaggio nel ramo db == NULL di nni_qos_db_set.

NanoMQ-Memory-Leak-Research

Allegati

  1. Analysis_Report.md: La ripartizione completa dell'analisi, inclusi diagrammi del ciclo di vita e tracce di log dettagliate.
  2. 249exploit_leak.py: Script Python PoC per riprodurre la perdita di memoria.
  3. nanomq.conf: Il file di configurazione utilizzato per innescare la discrepanza.
  4. runtime_logs.log: Log di strumentazione che dimostrano l'anomalia del conteggio dei riferimenti.
  5. Docker/: Ambiente di riproduzione containerizzato utilizzato per innescare e validare in modo affidabile la vulnerabilità in condizioni controllate.
    Istruzioni di build dettagliate e passaggi di configurazione dell'ambiente sono forniti in:
    Docker/Docker_Reproduction_Guide.md
  6. 249asan_log.txt: Log runtime di AddressSanitizer (ASAN) catturato da NanoMQ v0.24.9, che dimostra la perdita di memoria e il relativo comportamento anomalo della memoria.

Riepilogo dell'analisi tecnica

Riepilogo

Questo repository contiene la Proof of Concept (PoC) e l'analisi dettagliata di una vulnerabilità di perdita di memoria trovata in NanoMQ. Il problema consente ad attaccanti remoti di causare una negazione del servizio (DoS) esaurendo la memoria di sistema tramite specifici messaggi MQTT con QoS.

Ho condotto un'analisi approfondita di un fenomeno di perdita di memoria in Nanomq. Attraverso strumentazione dinamica e revisione del codice, ho identificato un percorso critico di perdita di risorse attivato quando la configurazione runtime abilita SQLite (sqlite.enable=true) ma il binario è compilato senza supporto SQLite (NNG_SUPP_SQLITE non definito).

Per mantenere questo problema conciso, ho riassunto i risultati chiave di seguito. Per la ripartizione tecnica completa (incluse tracce ASAN dettagliate, diagrammi del ciclo di vita e log di strumentazione), fare riferimento all'allegato Analysis_Report.md.


Il processo di analisi

1. Rilevamento iniziale (analisi ASAN)

Utilizzando AddressSanitizer, ho individuato la fonte della memoria persa in nni_msg_alloc all'interno di tcptran_pipe_recv_cb (nng/src/sp/transport/mqtt/broker_tcp.c). La memoria veniva allocata ma mai completamente rilasciata.

2. Modellazione del ciclo di vita (la baseline "3 Clones vs. 3 Frees")

Ho analizzato il meccanismo di conteggio dei riferimenti di nni_msg. Un normale ciclo di vita di un messaggio QoS 1 dovrebbe coinvolgere:

  • Alloc (+1): Ricezione di rete.
  • Clone 1 (+1): Dispatch del livello applicativo.
  • Clone 2 (+1): Logica di persistenza/ritrasmissione.
  • Riferimenti totali: 3 -> Free richiesti: 3.

3. Tracciamento dinamico e verifica

Poiché GDB era impraticabile per questo scenario ad alta concorrenza, ho utilizzato la strumentazione dinamica per tracciare il ciclo di vita di specifici oggetti di memoria (ad esempio, 0x60e00002ffa0).

Il risultato: I log hanno confermato una discrepanza nel ciclo di vita:

  • Allocazioni effettive: 3 (Alloc + Clone 1 + Clone 2)
  • Free effettivi: 2 (Free 1 + Free 2)
  • Risultato: Il conteggio dei riferimenti è rimasto a 1, causando la perdita. Il free mancante corrisponde al Clone 2 generato in nmq_pipe_send_start_v4.

4. Identificazione della causa principale

Il tracciamento del flusso di esecuzione ha rivelato il motivo per cui il 3° Free mancava:

  1. La discrepanza: Il binario è stato compilato senza -DNNG_SUPP_SQLITE, causando la rimozione della logica di inizializzazione in nano_sock_setdb. Tuttavia, nanomq.conf aveva sqlite.enable = true. Questo ha fatto sì che il puntatore db rimanesse NULL.

  2. La logica difettosa (l'"Early Return"): Quando il messaggio (Ref=3) entra in nni_qos_db_set per l'archiviazione, la funzione verifica il puntatore 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; 
    }
    // ...
}

La funzione termina silenziosamente senza chiamare nni_msg_free(msg). Ciò comporta la perdita irreversibile del puntatore msg, rendendo di fatto orfano il blocco di memoria.


Conclusione e impatto

  • Causa principale: Mancanza di programmazione difensiva in nni_qos_db_set. Non gestisce la proprietà del puntatore msg quando esegue un early return a causa di uno stato DB non valido.
  • Impatto: Ciò porta a un DoS silenzioso. Messaggi continui con QoS > 0 — provenienti sia dal normale traffico client che da un attore malintenzionato — esauriranno gradualmente la memoria di sistema (OOM), causando infine il crash del broker.

Raccomandazioni:

  1. Fail Fast (controllo all'avvio): Aggiungere la logica di convalida durante la fase di avvio del sistema (funzione nano_sock_setdb o main) per garantire che SQLite funzioni correttamente. Se viene rilevato conf->sqlite.enable == true ma la macro NNG_SUPP_SQLITE non è definita o SQLite è anomalo, il sistema dovrebbe terminare con un errore o impostare forzatamente enable su false e stampare un avviso.

  2. Sicurezza delle risorse (Fail-Safe): Aggiungere la logica di rilascio delle risorse nel ramo Early Return della funzione nni_qos_db_set. Se db == NULL, deve essere chiamato nni_msg_free(msg) per bilanciare il conteggio dei riferimenti e prevenire perdite di memoria.

Scarica lo strumento