🔍 CVE-2026-82389

6.5
CVSS Score
MEDIUM
2026-10-26
2026-10-26 18:34
✅ 완료

🇰🇷 한글 설명

Bluetooth Classic HFP Audio Gateway 역할에서 hfp_ag_create()가 SDP 검색을 시작한 뒤 bt_rfcomm_dlc_connect()가 실패하면, 아직 SDP 클라이언트 요청 리스트에 연결된 AG 객체를 memset()으로 초기화하여 댕글링 노드와 NULL 포인터가 발생합니다. 원격 기기가 범위를 벗어난 RFCOMM 채널을 광고하면 이 경로가 쉽게 유발되어 Bluetooth 스택의 크래시 또는 무한 루프가 발생할 수 있습니다.

💡 쉬운 설명

블루투스 핸즈프리 기능을 쓰는 기기에서 주변의 악의적인 블루투스 기기가 잘못된 설정값을 보내면 블루투스 기능이 멈추거나 꺼질 수 있습니다. 공격자가 데이터를 조작하거나 빼내는 것은 아니지만 서비스 중단을 일으킬 수 있습니다.

🇺🇸 원문 (English)

In the Bluetooth Classic Hands-Free Profile Audio Gateway role, hfp_ag_create() in subsys/bluetooth/host/classic/hfp_ag.c starts an SDP discovery toward the peer, which links the embedded ag->sdp_param._node into the SDP client's pending request list in subsys/bluetooth/host/classic/sdp.c. If the subsequent bt_rfcomm_dlc_connect() call fails, bt_hfp_ag_connect() cleaned up by memset()-ing the entire AG object while that node was still linked, and while ag->slc_work could still be queued on the system work queue. An in-flight SDP discovery cannot be cancelled — bt_sdp_discover_cancel() is declared in the public header but has no implementation — so the request stays in the list with its func, pool and uuid pointers zeroed. The RFCOMM channel passed to bt_hfp_ag_connect() is taken from the peer's own SDP Hands-Free service record in the normal AG flow (bt_sdp_get_proto_param() performs no range validation, and samples/bluetooth/classic/handsfree_ag feeds the value straight through), so a remote BR/EDR device in radio range that advertises an RFCOMM channel outside the valid range 0x01..0x1e deterministically forces bt_rfcomm_dlc_connect() to fail and reach the wipe. Reading the peer's SDP record requires no pairing, and the peer can also trigger the failure by dropping the ACL or racing an RFCOMM DLC on the same DLCI at the right moment. When the SDP client next advances its request list, sdp_client_discover() dereferences the zeroed parameters — net_buf_alloc(param->pool, …) with a NULL pool and param->uuid->type — and the result-notification paths call through the NULL params->func. Zeroing a linked node also truncates the request list behind a stale tail pointer, and re-arming the freed AG slot re-appends the same node and can produce a self-looping list that hangs the Bluetooth RX thread. The impact is a crash or hang of the Bluetooth stack; the written value is a constant zero at a fixed static address, so no attacker-controlled write is available. Only builds with CONFIG_BT_CLASSIC and CONFIG_BT_HFP_AG that use the Audio Gateway role are affected.

📍 영향받는 시스템

CONFIG_BT_CLASSIC 및 CONFIG_BT_HFP_AG가 활성화된 Zephyr RTOS 빌드 (Audio Gateway 역할 사용 시)

⚔️ 공격 벡터

전파 범위 내의 원격 BR/EDR 기기가 범위를 벗어난 RFCOMM 채널을 광고하거나 ACL 연결을 끊어 오류 경로를 유발

🛡️ 대응 방법

Zephyr RTOS를 패치된 버전으로 업데이트하고, 해당 패치 전까지 CONFIG_BT_HFP_AG를 비활성화하거나 Audio Gateway 역할을 사용하지 않도록 설정

🔧 검증 코드

패치가 적용되었다면 bt_hfp_ag_connect()의 실패 경로에서 전체 AG 객체를 memset()으로 지우는 코드가 제거되었거나 SDP 요청 취소 처리가 추가되었는지 확인하고, 변경이 없으면 취약한 상태입니다.

Shell / Script
grep -rn "memset" zephyr/subsys/bluetooth/host/classic/hfp_ag.c 2>/dev/null | head -5

📊 CVSS Vector String

CVSS Vector
CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H

💻 영향받는 소프트웨어

Windows Bluetooth Service