🔍 CVE-2026-19940

6.5
CVSS Score
MEDIUM
2026-10-13
2026-10-14 20:17
✅ 완료

🇰🇷 한글 설명

Bluetooth Classic HFP AG 구현에서 연결 해제 시 특정 작업 항목(ongoing_call_work)이 제대로 정리되지 않아 발생하는 취약점입니다. 공격자가 연결을 빠르게 재설정하여 동일한 메모리 슬롯을 재사용하게 만들면, 커널의 타임아웃 리스트가 손상되어 시스템 전체가 중단되거나 멈추는 서비스 거부(DoS) 상태가 발생할 수 있습니다.

💡 쉬운 설명

블루투스 연결을 의도적으로 빠르게 끊었다가 다시 연결하는 방식으로 기기를 고장 낼 수 있는 문제입니다. 이 공격을 받으면 기기가 응답하지 않거나 완전히 멈춰버릴 수 있습니다.

🇺🇸 원문 (English)

The Bluetooth Classic Hands-Free Profile Audio Gateway implementation in subsys/bluetooth/host/classic/hfp_ag.c keeps its struct bt_hfp_ag objects in a static pool indexed by ACL connection index. On link teardown, hfp_ag_disconnected() cancels ag->tx_work and the per-call work items and then clears ag->acl_conn, which marks the pool slot as free — but it leaves ag->ongoing_call_work (and ag->slc_work) untouched. The next connection that lands on the same slot enters hfp_ag_create(), whose only occupancy test is ag->acl_conn, and immediately executes memset(ag, 0, sizeof(struct bt_hfp_ag)) followed by k_work_init_delayable(). Zeroing and re-initialising a k_work_delayable whose struct _timeout node is still linked into the kernel timeout list leaves the kernel holding a reference to a node with NULL prev/next links. ag->ongoing_call_work is armed by the remote peer: when a Hands-Free unit sends AT+CIND? during Service Level Connection establishment and the application provides the asynchronous get_ongoing_call callback, the AG schedules the work for CONFIG_BT_HFP_AG_GET_ONGOING_CALL_TIMEOUT milliseconds (default 10000). The timer is cancelled only if the application answers in time via bt_hfp_ag_ongoing_calls(). A peer that sends AT+CIND?, then disconnects the HFP RFCOMM DLC, then immediately re-opens it on the same ACL link, reuses the same pool slot deterministically while the timeout is still pending — the AG's RFCOMM server accept path (hfp_ag_accept()) calls hfp_ag_create() directly, so the remote side drives both teardown and re-creation. The result is corruption of the kernel's timeout list: sys_dlist_remove() on the zeroed node performs writes through NULL pointers from the clock-announce path, and rescheduling the re-initialised work re-inserts a node the list already references, creating a cycle that the announce loop walks with interrupts locked. The observable impact is a fault or hang of the whole system, i.e. a denial of service reachable from Bluetooth radio range; no attacker-controlled data is written, so this does not by itself yield code execution. Exposure is limited to builds with CONFIG_BT_HFP_AG (marked experimental and disabled by default) whose application implements the asynchronous get_ongoing_call callback.

📍 영향받는 시스템

CONFIG_BT_HFP_AG 옵션이 활성화되어 있고 get_ongoing_call 콜백을 구현한 블루투스 스택 시스템

⚔️ 공격 벡터

블루투스 무선 범위 내에서 HFP RFCOMM 연결을 의도적으로 빠르게 해제하고 재연결하는 방식

🛡️ 대응 방법

커널 패치를 통해 연결 해제 시 모든 k_work_delayable 항목을 명시적으로 취소하고 정리하도록 업데이트해야 합니다.

🔧 검증 코드

명령어 결과에 CONFIG_BT_HFP_AG=y가 포함되어 있다면 해당 취약점에 노출될 가능성이 있는 설정입니다.

Shell / Script
zcat /proc/config.gz | grep -E 'CONFIG_BT_HFP_AG=y'

📊 CVSS Vector String

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

💻 영향받는 소프트웨어

IBM WebSphere Application Server