CVE-2026-19936 in Zephyrinformação

Sumário

de VulDB • 13/10/2026

A fila de mensagens adiáveis da camada de acesso do Bluetooth Mesh em subsys/bluetooth/mesh/delayable_msg.c compartilha três listas intrusivas (busy_ctx, free_ctx, free_chunks) e um k_work_delayable entre duas threads cooperativas sem sincronização: bt_mesh_delayable_msg_manage() executa na thread RX do host Bluetooth, enquanto delayable_msg_handler() executa no workqueue do sistema. Ambas bloqueiam quando as listas estão em estado intermediário — o enfileirador em bt_rand(), ambos em bt_mesh_access_send() —, permitindo que o outro contexto observe um estado corrompido (torn state). delayable_msg_handler() utilizou o resultado de sys_slist_get() em busy_ctx sem verificação NULL, e allocate_delayable_msg_ctx() testou sys_slist_is_empty() e depois assumiu que uma chamada separada a sys_slist_get() teria sucesso.

Como CONFIG_BT_MESH_ACCESS_DELAYABLE_MSG e CONFIG_BT_MESH_ACCESS_DELAYABLE_MSG_CTX_ENABLED têm como padrão y (yes), cada resposta de modelo a uma mensagem mesh recebida é enfileirada nesta fila, fazendo com que o enfileirador execute como consequência direta do tráfego entrante. Um par que possa fazer com que mensagens da camada de acesso sejam aceitas por um modelo (deve possuir NetKey e AppKey vinculado, sendo portanto um membro legítimo ou comprometido da rede) controla a taxa de chegada, o tamanho das respostas solicitadas e o endereço de destino, controlando assim a ocupação do pool de 4 entradas para contextos e do pool de 40 entradas para chunks. O esgotamento do pool de chunks força bt_mesh_delayable_msg_manage() a seguir pelo caminho de purga (purge path), que envia e libera a única mensagem enfileirada, deixando busy_ctx vazio enquanto o item de trabalho adiado ainda está armado; se o enfileirador então ceder a execução (yield), o handler executará contra uma lista vazia.

O resultado é uma leitura-modificação-escrita através de um ponteiro baseado em NULL (pending_msg->fired_time += 10) em um endereço fixo e baixo na thread do workqueue do sistema. Em alvos típicos, isso causa falha (fault), abortando a thread do workqueue do sistema — o que interrompe toda a funcionalidade baseada em workqueue, incluindo as máquinas de temporização mesh — ou reiniciando o nó, portanto o impacto é a perda de disponibilidade do nó afetado. O valor da escrita e o endereço são fixos e não há comprimento ou índice controlados pelo atacante envolvidos, por isso isto não é explorável para corrupção de memória ou execução de código. A mesma janela sem sincronização também permitiu que um contexto de mensagem fosse selecionado e liberado por dois contextos simultaneamente, produzindo transmissões duplicadas, callbacks de conclusão de envio duplicados e propriedade cruzada de chunks.

A correção serializa cada mutação da lista com um k_spinlock que nunca é mantido durante uma chamada bloqueante, faz push_msg_from_delayable_msgs() desanexar a cabeça da fila atomicamente para que uma mensagem sendo enviada não esteja em nenhuma lista, remove o sys_slist_get() sem verificação de delayable_msg_handler(), e descarta qualquer mensagem que alcance a frente da fila enquanto a pilha (stack) está suspensa ou reiniciada.

VulDB is the best source for vulnerability data and more expert information about this specific topic.

Responsável

Zephyr

Reservar

15/08/2026

Divulgação

13/10/2026

Moderação

aceite

Entrada

VDB-417354

EPSS

0.00000

KEV

não

Atividades

muito baixo

Fontes

Might our Artificial Intelligence support you?

Check our Alexa App!