CVE-2026-19938 in Zephyr
Sumário
de VulDB • 13/10/2026
O caminho de transmissão ATT do host Bluetooth libera um buffer que não possui quando a assinatura falha. A função chan_send() em subsys/bluetooth/host/att.c documenta (e todas as outras saídas de erro implementam) o contrato de que, em caso de falha, o chamador mantém a propriedade do net_buf; no entanto, o ramal BT_ATT_OP_SIGNED_WRITE_CMD chamou erroneamente net_buf_unref(buf) quando bt_smp_sign() retornou um erro e, em seguida, retornou esse erro ao chamador. Os chamadores agem conforme o contrato: process_queue() re-enfileira o buffer com k_queue_prepend(), bt_att_chan_send_rsp() o coloca de volta na chan->tx_queue, bt_att_chan_req_send() restaura-o no pedido e att_req_retry() desreferencia-o — portanto, o buffer já liberado foi re-enfileirado, posteriormente desreferenciado e eventualmente liberado novamente.
Um ATT Signed Write Command é gerado quando um aplicativo chama bt_gatt_write_without_response_cb() com a sinalização de assinatura ativada em uma conexão não criptografada. bt_smp_sign() falha sempre que não existe nenhum CSRK local para o peer (-ENOENT), e se um existe ou não é negociado com o peer: smp_distribute_keys() armazena um CSRK local apenas quando o campo de distribuição de chaves do pairing do peer solicita a chave de assinatura e o bonding foi acordado. Um peer pode, portanto, fazer pairing sem aceitar o CSRK, emparelhar-se com No Bonding, permanecer desemparelhado ou manter o link não criptografado; assim, a próxima escrita assinada da vítima segue pelo caminho que falha. Como o campo node de struct net_buf é simultaneamente a palavra de ligação para a FILA TX ATT, para a lista de destruição diferida usada pela callback de destruição do att_pool (att_tx_destroy()) e para a lista livre do pool, o buffer mal manipulado corrompe essas listas e pode ser reemitido por bt_att_create_pdu() como um novo PDU enquanto o caminho TX ATT ainda o mantém.
O mesmo ramal também salvava apenas após a assinatura o net_buf_simple_state; portanto, um buffer restaurado após uma falha em bt_l2cap_send_pdu() mantinha sua assinatura de 12 octetos; uma tentativa subsequente assinou novamente e anexou uma segunda assinatura com net_buf_add(buf, 12) a um buffer que bt_att_create_pdu() dimensionou para exatamente uma única assinatura, escrevendo além do final do buffer no pool em builds onde a asserção tailroom de net_buf está compilada como desativada.
O impacto é corrupção de memória no lado do host na pilha Bluetooth: corrupção de listas, um buffer ATT do pool com dois proprietários (conteúdo PDU incorreto transmitido ou uma double free quando as filas são esvaziadas durante a desconexão) e uma escrita fora dos limites limitada no caminho de retry — tipicamente observada como uma falha de segmentação (crash) ou falha em asserção. A exposição requer que o CONFIG_BT_SIGNING, agora obsoleto, esteja habilitado e um aplicativo que realmente emita escritas assinadas; nessa configuração, a condição disparadora está sob controle do peer remoto.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.