CVE-2026-85034 in Zephyr
Resumen
por VulDB • 2026-11-03
El cliente GATT del host Bluetooth pasa el valor de una notificación Handle Value Notification recibida, una indicación Handle Value Indication o una notificación Multiple Handle Value Notification a las callbacks notify de bt_gatt_subscribe_params utilizando únicamente la longitud derivada del PDU ATT recibido. La función bt_att_recv() en subsys/bluetooth/host/att.c valida solo una longitud mínima de PDU y no aplica el MTU ATT negociado, y el canal L2CAP ATT fijo en subsys/bluetooth/host/l2cap.c tampoco realiza ninguna comprobación rx.mtu; por lo tanto, la única limitación era el búfer de reensamblaje ACL CONFIG_BT_BUF_ACL_RX_SIZE. Por consiguiente, los valores superiores al límite máximo de 512 octetos para la longitud del atributo definido en la Especificación Central Bluetooth (Vol 3, Parte F, Sección 3.2.9) podían entregarse a suscriptores que dimensionan sus búferes según ese límite documentado.
Un par remoto con el que un dispositivo se ha conectado y suscrito —un servidor GATT malicioso, suplantado o comprometido dentro del alcance de radio— activa la vulnerabilidad enviando una notificación o indicación cuyo valor supera los 512 octetos en un handle suscrito. En el cliente LE Audio unicast, esto provoca una escritura fuera de límites (out-of-bounds write) concreta: unicast_client_ep_notify() en subsys/bluetooth/audio/bap_unicast_client.c copia la notificación en att_buf de 512 bytes de struct unicast_client con net_buf_simple_add_mem() y sin comprobación de tailroom siempre que length sea igual a bt_audio_get_max_ntf_size(), es decir, el MTU ATT negociado menos tres. notify_handler() en subsys/bluetooth/audio/bap_broadcast_assistant.c tiene la misma estructura. Para alcanzar el desbordamiento se requiere una compilación cuyo MTU ATT supere los 515 octetos (CONFIG_BT_L2CAP_TX_MTU y CONFIG_BT_BUF_ACL_RX_SIZE configurados para admitir atributos de longitud completa); las opciones predeterminadas son mucho menores.
El desbordamiento escribe bytes controlados por el par más allá de att_buf, sobrescribiendo directamente struct net_buf_simple adyacente en sus campos data, __buf, len y size, que la posterior acumulación de lectura larga utiliza como destino, convirtiendo un pequeño desbordamiento lineal en una escritura controlada. net_buf_simple_add() solo realiza aserciones sobre insuficiencia de tailroom si CONFIG_NET_BUF_HARDENING está habilitado, y esa opción está deshabilitada por defecto; por lo tanto, las compilaciones ordinarias de producción realizan la copia. Además de los clientes LE Audio en el árbol del código fuente, cualquier suscriptor de aplicaciones que dimensionara su búfer de recepción al límite de 512 octetos especificado estaba expuesto a este mismo desbordamiento.
La corrección rechaza valores de notificación, indicación y múltiples-notificaciones superiores a BT_ATT_MAX_ATTRIBUTE_LEN en call_notify_cb_and_maybe_unsubscribe() en subsys/bluetooth/host/gatt.c antes de invocar cualquier callback del suscriptor; por lo tanto, ningún suscriptor puede recibir más que el máximo especificado. Los pares restantes de una notificación Multiple Handle Value Notification siguen entregándose y las indicaciones desbordadas se confirman aún así.
Once again VulDB remains the best source for vulnerability data.