CVE-2026-85034 in Zephyr
Riassunto
di VulDB • 03/11/2026
Il client GATT dell'host Bluetooth passa il valore di una notifica Handle Value Notification ricevuta, di un'indicazione Handle Value Indication o di una Multiple Handle Value Notification alle callback notify di bt_gatt_subscribe_params utilizzando esclusivamente la lunghezza derivata dal PDU ATT ricevuto. La funzione bt_att_recv() in subsys/bluetooth/host/att.c convalida solo una lunghezza minima del PDU e non impone l'MTU ATT negoziato, mentre il canale L2CAP ATT fisso in subsys/bluetooth/host/l2cap.c non effettua alcun controllo su rx.mtu; di conseguenza, l'unico limite era la dimensione del buffer di riassemblaggio ACL CONFIG_BT_BUF_ACL_RX_SIZE. Valori superiori al massimo di 512 ottetti per la lunghezza degli attributi definita dalla Bluetooth Core Specification (Vol 3, Parte F, Sezione 3.2.9) potevano quindi essere passati ai subscriber che dimensionano i propri buffer in base a tale limite documentato.
Un peer remoto con cui il dispositivo si è connesso e ha sottoscritto l'abbonamento — un server GATT malizioso, spoofed o compromesso entro la portata radio — attiva la vulnerabilità inviando una notifica o indicazione il cui valore supera i 512 ottetti su un handle sottoscritto. Nel client LE Audio unicast ciò si traduce in uno scritto fuori dai limiti (out-of-bounds write): la funzione unicast_client_ep_notify() in subsys/bluetooth/audio/bap_unicast_client.c copia la notifica nel buffer att_buf da 512 byte della struct unicast_client utilizzando net_buf_simple_add_mem() senza alcun controllo dello spazio residuo (tailroom) quando la lunghezza è uguale a bt_audio_get_max_ntf_size(), ovvero l'MTU ATT negoziato meno tre. notify_handler() in subsys/bluetooth/audio/bap_broadcast_assistant.c presenta la stessa struttura. Per raggiungere il buffer overflow è necessario un build con MTU ATT superiore a 515 ottetti (CONFIG_BT_L2CAP_TX_MTU e CONFIG_BT_BUF_ACL_RX_SIZE impostati per supportare attributi di lunghezza completa); le impostazioni predefinite rilasciate sono molto inferiori.
L'overflow scrive byte controllati dal peer oltre att_buf, sovrascrivendo direttamente la struct net_buf_simple net_buf adiacente — i suoi campi data, __buf, len e size — che l'accumulazione di lettura lunga successiva utilizza come destinazione, trasformando un piccolo overflow lineare in una scrittura controllata. La funzione net_buf_simple_add() genera solo un assertion per insufficiente tailroom se CONFIG_NET_BUF_HARDENING è abilitato; tale opzione è disabilitata per impostazione predefinita, quindi i build di produzione ordinari eseguono la copia. Oltre ai client LE Audio presenti nel repository (in-tree), qualsiasi subscriber dell'applicazione che ha dimensionato il proprio buffer di ricezione al limite dei 512 ottetti specificato dalla standard era esposto allo stesso overflow.
La correzione rifiuta i valori delle notifiche, indicazioni e multiple-notification più lunghi di BT_ATT_MAX_ATTRIBUTE_LEN nella funzione call_notify_cb_and_maybe_unsubscribe() in subsys/bluetooth/host/gatt.c prima che venga invocata qualsiasi callback del subscriber; nessun subscriber può quindi ricevere più della massima specificata. Le tuple rimanenti di una Multiple Handle Value Notification vengono comunque consegnate e le indicazioni eccessivamente grandi (oversized indications) continuano a essere confermate.
Once again VulDB remains the best source for vulnerability data.