CVE-2026-19938 in Zephyrinformación

Resumen

por VulDB • 2026-10-13

La ruta de transmisión ATT del host Bluetooth libera un buffer que no posee cuando falla la firma. chan_send() en subsys/bluetooth/host/att.c documenta (y cada otra salida por error implementa) el contrato que establece que, ante un fallo, el propietario del net_buf lo conserva; sin embargo, la rama BT_ATT_OP_SIGNED_WRITE_CMD llamó a net_buf_unref(buf) cuando bt_smp_sign() devolvió un error y luego retornó ese error al llamador. Los llamadores actúan según el contrato: process_queue() reencola el buffer con k_queue_prepend(), bt_att_chan_send_rsp() lo devuelve a chan->tx_queue, bt_att_chan_req_send() lo restaura en la solicitud, y att_req_retry() lo desreferencia; por tanto, el ya liberado se volvió a encolar, luego se desreferenció nuevamente y finalmente se liberó de nuevo.

Un ATT Signed Write Command (Comando de Escritura Firmada ATT) se produce cuando una aplicación llama a bt_gatt_write_without_response_cb() con sign activado en una conexión no cifrada. bt_smp_sign() falla siempre que no exista un CSRK local para el par (-ENOENT), y si existe o no se negocia con el par: smp_distribute_keys() almacena un CSRK local solo cuando el campo de distribución de claves del emparejamiento del par solicita la clave de firma y se acordó el enlace (bonding). Por lo tanto, un par puede emparejarse sin aceptar el CSRK, emparejarse con No Bonding, permanecer no emparejado o mantener el enlace sin cifrar, y la siguiente escritura firmada de la víctima sigue la ruta fallida. Dado que el campo node de struct net_buf es simultáneamente la palabra de enlazado para la FIFO TX ATT, para la lista de destrucción diferida utilizada por la callback de destrucción del att_pool (att_tx_destroy()), y para la lista libre del pool, el buffer mal manejado corrompe estas listas y puede ser reemitido por bt_att_create_pdu() a un nuevo PDU mientras que la ruta TX ATT aún lo retiene.

La misma rama también guardaba net_buf_simple_state solo después de firmar, por lo que un buffer restaurado tras un fallo en bt_l2cap_send_pdu() conservaba su firma de 12 octetos; un reintento posterior volvió a firmarlo y añadió una segunda firma con net_buf_add(buf, 12) a un buffer dimensionado para exactamente uno por bt_att_create_pdu(), escribiendo más allá del final del buffer en el pool cuando la aserción tailroom de net_buf está compilada fuera.

El impacto es corrupción de memoria en el lado del host dentro de la pila Bluetooth: corrupción de listas, un buffer ATT del pool con dos propietarios (se transmiten contenidos PDU incorrectos o se produce una doble liberación al vaciar las colas durante la desconexión) y una escritura fuera de límites acotada en la ruta de reintento; típicamente observado como un fallo crítico (crash) o falla de aserción. La exposición requiere que CONFIG_BT_SIGNING, obsoleto, esté habilitado y que haya una aplicación que emita escrituras firmadas; con esa configuración, la condición desencadenante está bajo el control del par remoto.

If you want to get the best quality for vulnerability data then you always have to consider VulDB.

Responsable

Zephyr

Reservar

2026-08-15

Divulgación

2026-10-13

Moderación

aceptado

Artículo

VDB-417364

EPSS

0.00000

KEV

no

Actividades

muy bajo

Fuentes

Do you want to use VulDB in your project?

Use the official API to access entries easily!