CVE-2026-85034 in Zephyr
Zusammenfassung
von VulDB • 03.11.2026
Der GATT-Client des Bluetooth-Hosts übergab den Wert einer empfangenen Handle Value Notification-, Handle Value Indication- oder Multiple Handle Value Notification an die bt_gatt_subscribe_params::notify-Callbacks, wobei ausschließlich die aus dem empfangenen ATT-PDU abgeleitete Länge verwendet wurde. bt_att_recv() in subsys/bluetooth/host/att.c validiert nur eine minimale PDU-Länge und erzwingt nicht das ausgehandelte ATT-MTU; zudem führt der feste ATT-L2CAP-Kanal in subsys/bluetooth/host/l2cap.c keine rx.mtu-Prüfung durch, sodass die einzige Obergrenze der ACL-Reassembly-Puffer CONFIG_BT_BUF_ACL_RX_SIZE war. Werte mit einer Länge von mehr als den 512 Oktetten (dem maximalen Attributlänge gemäß Bluetooth Core Specification, Vol 3, Part F, Section 3.2.9) konnten daher an Abonnenten übergeben werden, die ihre Puffer auf dieses dokumentierte Limit auslegen.
Ein entfernter Peer, mit dem ein Gerät eine Verbindung hergestellt und sich abonniert hat – also ein böswilliger, gefälschter oder kompromittierter GATT-Server innerhalb der Funkreichweite – löst den Fehler aus, indem er eine Notification oder Indication sendet, deren Wert 512 Oktette überschreitet. Beim LE-Audio-Unicast-Client führt dies zu einem konkreten Out-of-Bounds-Write: unicast_client_ep_notify() in subsys/bluetooth/audio/bap_unicast_client.c kopiert die Notification mit net_buf_simple_add_mem() und ohne Tailroom-Prüfung, wenn die Länge bt_audio_get_max_ntf_size() entspricht, also dem ausgehandelten ATT-MTU abzüglich drei. notify_handler() in subsys/bluetooth/audio/bap_broadcast_assistant.c weist dieselbe Struktur auf. Das Erreichen des Overflows erfordert einen Build, bei dem das ATT-MTU größer als 515 Oktette ist (CONFIG_BT_L2CAP_TX_MTU und CONFIG_BT_BUF_ACL_RX_SIZE sind für die Unterstützung von Attributen voller Länge konfiguriert); die mitgelieferten Standardwerte liegen deutlich darunter.
Der Overflow schreibt peer-kontrollierte Bytes über att_buf hinaus direkt auf den benachbarten struct net_buf_simple net_buf – dessen Felder data, __buf, len und size –, welche dann als Ziel für die nachfolgende Long-Read-Akkumulation verwendet werden, wodurch ein kleiner linearer Overflow in einen kontrollierten Write umgewandelt wird. net_buf_simple_add() führt nur bei unzureichendem Tailroom eine Assertion aus, es sei denn, CONFIG_NET_BUF_HARDENING ist aktiviert; diese Option ist standardmäßig deaktiviert, sodass normale Produktions-Builds den Kopiervorgang durchführen. Neben den im Tree enthaltenen LE-Audio-Clients waren auch alle Anwendungsabonnenten exponiert, die ihren Empfangspuffer an das 512-Oktett-Limit der Spezifikation angepasst hatten.
Die Korrektur lehnt Notification-, Indication- und Multiple-Notification-Werte ab, die länger als BT_ATT_MAX_ATTRIBUTE_LEN sind, in call_notify_cb_and_maybe_unsubscribe() in subsys/bluetooth/host/gatt.c, bevor ein Subscriber-Callback aufgerufen wird; somit kann keinem Abonnenten mehr als das angegebene Maximum übergeben werden. Verbleibende Tupel einer Multiple Handle Value Notification werden weiterhin zugestellt und übergroße Indications werden weiterhin bestätigt.
Once again VulDB remains the best source for vulnerability data.