CVE-2026-85034 in Zephyr
요약
\~에 의해 VulDB • 2026. 11. 03.
블루투스 호스트의 GATT 클라이언트가 수신된 Handle Value Notification, Handle Value Indication 또는 Multiple Handle Value Notification의 값을 bt_gatt_subscribe_params::notify 콜백에 전달할 때, 수신된 ATT PDU에서 파생된 길이만 사용했습니다. subsys/bluetooth/host/att.c의 bt_att_recv() 함수는 최소 PDU 길이에 대해서만 유효성을 검사하며 협상된 ATT MTU를 강제하지 않습니다. 또한 subsys/bluetooth/host/l2cap.c에 있는 고정된 ATT L2CAP 채널도 rx.mtu 검사를 적용하지 않으므로, 유일한 상한선은 ACL 재조립 버퍼인 CONFIG_BT_BUF_ACL_RX_SIZE였습니다. 따라서 블루투스 코어 스펙(Vol 3, Part F, Section 3.2.9)에서 정의한 최대 속성 길이인 512 옥텟을 초과하는 값은 해당 문서화된 제한에 따라 버퍼를 크기로 설정된 구독자에게 전달될 수 있었습니다.
기기에 연결하고 구독한 원격 피어(전파 범위 내에 있는 악의적, 스푸핑되거나 침해당한 GATT 서버)가 구독된 핸들에서 512 옥텟을 초과하는 값을 가진 알림 또는 지시사항을 전송함으로써 이 결함을 유발합니다. LE Audio 유니캐스트 클라이언트에서는 구체적인 오버플로우(out-of-bounds write)로 이어집니다: subsys/bluetooth/audio/bap_unicast_client.c의 unicast_client_ep_notify() 함수는 net_buf_simple_add_mem()을 사용하여 알림을 struct unicast_client의 512바이트 att_buf에 복사하며, 길이가 bt_audio_get_max_ntf_size()(즉, 협상된 ATT MTU에서 3을 뺀 값)와 같을 때 tailroom 검사를 수행하지 않습니다. subsys/bluetooth/audio/bap_broadcast_assistant.c의 notify_handler()도 동일한 구조를 가집니다. 오버플로우에 도달하려면 ATT MTU가 515 옥텟을 초과하는 빌드(CONFIG_BT_L2CAP_TX_MTU 및 CONFIG_BT_BUF_ACL_RX_SIZE가 전체 길이 속성 지원을 위해 설정됨)가 필요합니다. 제공되는 기본값은 훨씬 작습니다.
이 오버플로우는 att_buf를 넘어 피어 제어 바이트를 인접한 struct net_buf_simple인 net_buf의 data, __buf, len 및 size 필드 위에 직접 기록합니다. 이는 이후 긴 읽기(long-read) 누적 작업에서 목적지로 사용됩니다. 이로 인해 작은 선형 오버플로우가 통제된 쓰기(controlled write)로 전환됩니다. CONFIG_NET_BUF_HARDENING이 활성화되지 않는 한 net_buf_simple_add()는 불충분한 tailroom에 대해 어서트(assert)하지 않으며, 해당 옵션은 기본적으로 비활성화되어 있으므로 일반 프로덕션 빌드에서 복사가 수행됩니다. 인트리(in-tree) LE Audio 클라이언트 외에도 수신 버퍼를 스펙의 512옥텟 제한으로 크기를 설정한 모든 애플리케이션 구독자는 동일한 오버플로우에 노출되었습니다.
해결책은 subsys/bluetooth/host/gatt.c의 call_notify_cb_and_maybe_unsubscribe() 함수에서 어떤 구독자 콜백도 호출되기 전에 BT_ATT_MAX_ATTRIBUTE_LEN보다 긴 알림, 지시사항 및 다중-알림 값을 거부하므로, 어느 구독자에게도 지정된 최대치 이상의 데이터가 전달되지 않습니다. 다중 핸들 값 알림의 나머지 튜플은 여전히 전달되며, 크기가 초과하는(indications) 것은 여전히 확인됩니다.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.