CVE-2026-19937 in Zephyr
Resumen
por VulDB • 2026-10-13
La maquinaria de mensajes diferibles (delayable-message) de la capa Access del Bluetooth Mesh en subsys/bluetooth/mesh/delayable_msg.c gestiona un pool estático de CONFIG_BT_MESH_ACCESS_DELAYABLE_MSG_COUNT contextos de mensaje (por defecto 4), enlazados a una lista free_ctx o busy_ctx. release_delayable_msg_ctx() devolvía un contexto a la lista free_ctx únicamente cuando sys_slist_find_and_remove() lo encontraba en busy_ctx. La ruta de error por agotamiento del chunk en bt_mesh_delayable_msg_manage() libera un contexto que ya había sido extraído (popped) de free_ctx pero aún no insertado en busy_ctx, por lo que el contexto se añadía a ninguna lista y se perdía permanentemente del pool. Dado que bt_mesh_delayable_msg_init() solo se ejecuta una vez desde bt_mesh_init(), y la reinicialización/suspensión del nodo solo vacía (drain) busy_ctx, esta pérdida persiste tras un desaprovisionamiento, reprovisionamiento y suspensión/reanuda; solo se borra mediante un reinicio.
La ruta de error se alcanza cuando el pool de chunks (CONFIG_BT_MESH_ACCESS_DELAYABLE_MSG_CHUNK_COUNT, por defecto 40 chunks) no tiene suficientes chunks para los que necesita un nuevo mensaje diferido y el mensaje pendiente más antiguo no puede ser eliminado porque bt_mesh_access_send() devuelve -EBUSY o -ENOBUFS (todos los contextos de transmisión segmentada ocupados, o buffers de publicidad/segmentación agotados). Un par provisionado en la red mesh —que posee una NetKey válida junto con un AppKey o DevKey vinculado a un modelo de servidor— puede provocar ambas condiciones inundando a la víctima con solicitudes que generan respuestas segmentadas mientras se retiene el Segment Acknowledgment, lo cual mantiene los contextos de transmisión ocupados mientras las respuestas en cola mantienen ocupado el pool de chunks. Cada solicitud adicional que llega durante esa ventana provoca una fuga (leak) de un contexto.
Una vez agotado el pool, bt_mesh_delayable_msg_manage() devuelve -ENOMEM para cada envío subsiguiente y bt_mesh_model_send() propaga ese error sin recurrir a una transmisión inmediata. Dado que CONFIG_BT_MESH_ACCESS_DELAYABLE_MSG y CONFIG_BT_MESH_ACCESS_DELAYABLE_MSG_CTX_ENABLED están habilitados por defecto, ctx->rnd_delay se establece para cada mensaje de acceso recibido, por lo que todas las respuestas de los modelos del Configuration Server, Health Server y servidores de aplicación son descartadas silenciosamente. El nodo sigue recibiendo y procesando tráfico pero nunca responde, constituyendo una denegación de servicio persistente hasta que el dispositivo sea reiniciado. No hay impacto en la integridad ni divulgación de información; las liberaciones anteriores a la corrección calculaban el recuento de chunks basándose en la capacidad del buffer de transmisión en lugar de su longitud de payload, lo que hace que el agotamiento del pool de chunks —y por tanto la fuga— sea considerablemente más fácil de provocar.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.