Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
NanoMQ-Memory-Leak-Research — Aviso público y análisis técnico para CVE-2026-36590, una vulnerabilidad de denegación de servicio en NanoMQ v0.24.9. | Kitploit
Herramientas/GitHubGitHub/moxie25/nanomq-memory-leak-research
Análisis EstáticoAnálisis Dinámico (Sandboxing)Seguridad IoTForensia de MemoriaAnálisis de VulnerabilidadesExplotaciónPruebas de Penetración
GitHubmoxie25/nanomq-memory-leak-research

NanoMQ-Memory-Leak-Research

Aviso público y análisis técnico para CVE-2026-36590, una vulnerabilidad de denegación de servicio en NanoMQ v0.24.9.

Ver Repositorio
4hace 2 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-36590: Denegación de Servicio en EMQ NanoMQ v0.24.9

Este repositorio contiene el aviso público y el análisis técnico del CVE-2026-36590, una vulnerabilidad de denegación de servicio que afecta a EMQ NanoMQ v0.24.9.

Nota de revisión

Este repositorio es público para proporcionar una referencia técnica accesible para la revisión del CVE. La clasificación final del CVE-2026-36590 será determinada por el Equipo CVE o la CNA correspondiente.

El equipo de NanoMQ ha cuestionado este problema y lo considera relacionado con la configuración. Este repositorio se centra en la evidencia técnica, incluidos los materiales de reproducción, los resultados de ASAN, los registros de ejecución y el análisis del código fuente.

Información del aviso

  • CVE ID: CVE-2026-36590
  • Proveedor/Proyecto: EMQ / NanoMQ
  • Producto: NanoMQ
  • Versión afectada: v0.24.9
  • Tipo de vulnerabilidad: Denegación de Servicio / Agotamiento de Recursos
  • Componente afectado: /nanomq/nng/src/supplemental/mqtt/mqtt_qos_db_api.c/ nni_qos_db_set
  • CWE: CWE-772, CWE-400
  • Fecha de divulgación pública: 2026-06-17

Resumen

Cuando NanoMQ v0.24.9 se compila sin soporte de SQLite mientras sqlite.enable está configurado como true, el puntero de la base de datos QoS puede permanecer NULL. Durante el manejo de mensajes MQTT QoS, nni_qos_db_set puede retornar de forma anticipada sin liberar una referencia de mensaje clonado. Los mensajes MQTT PUBLISH repetidos con QoS > 0 pueden causar un consumo continuo de memoria, lo que eventualmente conduce a una denegación de servicio.

Por qué este problema aún requiere revisión

El problema depende de una configuración de ejecución no predeterminada, pero los siguientes hechos muestran por qué aún requiere una revisión adicional:

  1. NanoMQ acepta la configuración de ejecución y continúa funcionando, en lugar de informar que el soporte de SQLite no está disponible en la compilación actual.

  2. Este desajuste de configuración puede ocurrir en la práctica. Un usuario puede compilar NanoMQ con el comando de compilación normal, pero luego copiar o habilitar la sección de persistencia de SQLite de un archivo de configuración de ejemplo.

  3. La ruta de código afectada no valida completamente este estado inconsistente. Cuando la configuración de ejecución considera SQLite como habilitado pero el puntero de la base de datos es NULL, nni_qos_db_set() retorna de forma anticipada sin liberar el objeto de mensaje recibido.

  4. Después de que se acepta esta configuración, el problema puede ser activado por tráfico MQTT remoto. Los mensajes PUBLISH repetidos con QoS > 0 pueden entrar en la ruta afectada y causar fugas de memoria acumuladas.

  5. Las pruebas ASAN con 1, 50 y 500 rondas de reproducción muestran que los bytes y asignaciones filtrados aumentan con el número de intentos de activación. Esto sugiere que el problema depende de la cantidad de entradas, en lugar de ser una fuga pequeña única.

Mitigación

Los usuarios deben restringir el acceso a las instancias de NanoMQ, evitar exponer los servicios MQTT a clientes no confiables y evitar habilitar la persistencia de SQLite en compilaciones sin soporte de SQLite. El proveedor debe agregar una validación de inicio para la configuración de SQLite y liberar la referencia del mensaje en la rama db == NULL de nni_qos_db_set.

NanoMQ-Memory-Leak-Research

Adjuntos

  1. Analysis_Report.md: El desglose completo del análisis, incluidos diagramas de ciclo de vida y trazas de registro detalladas.
  2. 249exploit_leak.py: Script PoC en Python para reproducir la fuga.
  3. nanomq.conf: El archivo de configuración utilizado para activar el desajuste.
  4. runtime_logs.log: Registros de instrumentación que demuestran la anomalía en el conteo de referencias.
  5. Docker/: Entorno de reproducción contenerizado utilizado para activar y validar de manera confiable la vulnerabilidad en condiciones controladas.
    Las instrucciones detalladas de compilación y los pasos de configuración del entorno se proporcionan en:
    Docker/Docker_Reproduction_Guide.md
  6. 249asan_log.txt: Registro de ejecución de AddressSanitizer (ASAN) capturado de NanoMQ v0.24.9, que demuestra la fuga de memoria y el comportamiento anómalo de memoria relacionado.

Resumen del Análisis Técnico

Resumen Este repositorio contiene la Prueba de Concepto (PoC) y el análisis detallado de una vulnerabilidad de fuga de memoria encontrada en NanoMQ. El problema permite a atacantes remotos causar una Denegación de Servicio (DoS) al agotar la memoria del sistema mediante mensajes MQTT QoS específicos.

He llevado a cabo un análisis en profundidad de un fenómeno de fuga de memoria en Nanomq. Mediante instrumentación dinámica y revisión de código, identifiqué una ruta crítica de fuga de recursos que se activa cuando la configuración de ejecución habilita SQLite (sqlite.enable=true) pero el binario se compila sin soporte de SQLite (NNG_SUPP_SQLITE no definido).

Para mantener este problema conciso, he resumido los hallazgos clave a continuación. Para el desglose técnico completo (incluidas trazas ASAN detalladas, diagramas de ciclo de vida y registros de instrumentación), consulte el Analysis_Report.md adjunto.


El Proceso de Análisis

1. Detección Inicial (Análisis ASAN)

Usando AddressSanitizer, identifiqué el origen de la memoria filtrada en nni_msg_alloc dentro de tcptran_pipe_recv_cb (nng/src/sp/transport/mqtt/broker_tcp.c). La memoria se asignó pero nunca se liberó por completo.

2. Modelado del Ciclo de Vida (La Línea Base de "3 Clones vs. 3 Liberaciones")

Analicé el mecanismo de conteo de referencias de nni_msg. Un ciclo de vida normal de un mensaje QoS 1 debería incluir:

  • Alloc (+1): Recepción de red.
  • Clone 1 (+1): Despacho de la capa de aplicación.
  • Clone 2 (+1): Lógica de persistencia/retransmisión.
  • Refs totales: 3 -> Liberaciones requeridas: 3.

3. Trazado Dinámico y Verificación

Dado que GDB no era práctico para este escenario de alta concurrencia, utilicé instrumentación dinámica para rastrear el ciclo de vida de objetos de memoria específicos (p. ej., 0x60e00002ffa0). El Hallazgo: Los registros confirmaron un desajuste en el ciclo de vida:

  • Asignaciones reales: 3 (Alloc + Clone 1 + Clone 2)
  • Liberaciones reales: 2 (Free 1 + Free 2)
  • Resultado: El conteo de referencias permaneció en 1, lo que causó la fuga. La liberación faltante corresponde a Clone 2 generado en nmq_pipe_send_start_v4.

4. Identificación de la Causa Raíz

El rastreo del flujo de ejecución reveló por qué faltaba la tercera liberación:

  1. El Desajuste: El binario se compiló sin -DNNG_SUPP_SQLITE, lo que provocó que la lógica de inicialización en nano_sock_setdb se omitiera. Sin embargo, nanomq.conf tenía sqlite.enable = true. Esto provocó que el puntero db permaneciera NULL.
  2. La Lógica Defectuosa (El "Retorno Anticipado"): Cuando el mensaje (Ref=3) entra en nni_qos_db_set para su almacenamiento, la función verifica el puntero 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 función retorna silenciosamente sin llamar a nni_msg_free(msg). Esto hace que el puntero msg se pierda irremediablemente, dejando efectivamente huérfano el bloque de memoria.


Conclusión e Impacto

  • Causa raíz: Falta de programación defensiva en nni_qos_db_set. No gestiona la propiedad del puntero msg al ejecutar un retorno anticipado debido a un estado de base de datos no válido.
  • Impacto: Esto conduce a un DoS silencioso. Los mensajes continuos con QoS > 0, ya sea de tráfico normal de clientes o de un actor malicioso, agotarán gradualmente la memoria del sistema (OOM), eventualmente provocando el bloqueo del broker.

Recomendaciones:

  1. Fallo Rápido (Verificación de Inicio): Agregue lógica de validación durante la fase de inicio del sistema (función nano_sock_setdb o main) para asegurar que SQLite se esté ejecutando correctamente. Si se detecta conf->sqlite.enable == true pero la macro NNG_SUPP_SQLITE no está definida o SQLite es anómalo, el sistema debe salir con un error o forzar el establecimiento de enable en false y mostrar una advertencia.
  2. Seguridad de Recursos (A Prueba de Fallos): Agregue lógica de liberación de recursos en la rama de Retorno Anticipado de la función nni_qos_db_set. Si db == NULL, se debe llamar a nni_msg_free(msg) para equilibrar el conteo de referencias y evitar fugas de memoria.
Descargar herramienta