🔍 CVE-2026-10685

7.6
CVSS Score
HIGH
2026-07-31
2026-11-04 05:18
✅ 완료

🇰🇷 한글 설명

Zephyr Bluetooth GATT 클라이언트의 CCC-write 응답 처리 과정에서 구독 해제 알림(notify)이 호출된 후, 이미 해제되었을 수 있는 구독 콜백(subscribe)을 다시 호출하는 Use-After-Free 취약점이 발견되었습니다. 공격자가 GATT 서버를 통해 오류 응답을 보냄으로써 이 취약점을 유발할 수 있으며, 이는 메모리 손상이나 서비스 거부(DoS)를 초래할 수 있습니다.

💡 쉬운 설명

블루투스 연결을 관리하는 프로그램이 이미 삭제된 메모리 정보를 다시 사용하려고 시도하면서 발생하는 오류입니다. 해커가 특수한 신호를 보내면 기기가 멈추거나 제어권을 뺏길 위험이 있습니다.

🇺🇸 원문 (English)

The Zephyr Bluetooth GATT client CCC-write response handler gatt_write_ccc_rsp() in subsys/bluetooth/host/gatt.c invoked the application's params->subscribe() callback after it had already called params->notify(conn, params, NULL, 0). Per the public GATT API, a notify callback with NULL data is the documented signal that the subscription has terminated and the bt_gatt_subscribe_params struct may be freed or reused by the application; calling subscribe() on the struct afterwards is a use-after-free, including an indirect call through the freed params->subscribe function pointer. The error branch is remotely (adjacent) reachable: a Zephyr device acting as a GATT client that calls bt_gatt_subscribe() can be driven into this ordering when a connected GATT server peer answers the CCC write with an ATT Error Response (the peer-supplied error code flows through att_error_rsp -> att_handle_rsp into gatt_write_ccc_rsp). For applications that free or recycle subscription parameters in their notification-termination handler, this results in memory corruption, a crash (denial of service), or potentially attacker-influenced control flow. The fix reorders the handler so the subscribe() callback runs before the terminating notify(NULL) in both the error and unsubscribe paths.

📍 영향받는 시스템

Zephyr RTOS (Bluetooth GATT client 기능을 사용하는 시스템)

⚔️ 공격 벡터

연결된 GATT 서버가 CCC write에 대해 ATT Error Response를 전송하여 취약한 코드 경로를 실행 유도

🛡️ 대응 방법

구독 해제 알림(notify)이 호출되기 전에 subscribe 콜백이 먼저 실행되도록 핸들러의 실행 순서를 수정하여 패치 적용

🔧 검증 코드

사용 중인 Zephyr RTOS의 버전을 확인하고 해당 취약점이 수정된 최신 패치가 적용되었는지 확인하십시오.

Shell / Script
zephyr-sdk-version-check-command-placeholder

📊 CVSS Vector String

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