CVE-2026-98455 in Linux정보

요약

\~에 의해 VulDB • 2026. 10. 18.

리눅스 커널에서 다음 취약점이 해결되었습니다:

블루투스: RFCOMM: RFCOMM_CONNINFO에서 dlc->세션의 NULL 역참조 수정

RFCOMM_CONNINFO getsockopt 핸들러는 지연 설정(deferred setup)이 활성화되어 있는 한 연결되지 않은 소켓도 허용합니다.

```c if (sk->sk_state != BT_CONNECTED && !rfcomm_pi(sk)->dlc->defer_setup) {
err = -ENOTCONN; break; } l2cap_sk = rfcomm_pi(sk)->dlc->session->sock->sk; ```

`dlc->defer_setup`는 `rfcomm_sock_init()`에서 설정되며, 이는 수신 중인 소켓(BT_DEFER_SETUP 활성화됨)에 대한 들어오는 연결을 위해 자식 소켓이 생성될 때(`rfcomm_connect_ind()`) 발생합니다. 이후에는 이 값이 결코 해제되지 않습니다. 그러나 세션은 그 사이에 사라질 수 있습니다.

`rfcomm_recv_disc()`는 teardown 전에 dlc 상태를 강제로 설정합니다:

```c d->state = BT_CLOSED; __rfcomm_dlc_close(d, err); ```

`__rfcomm_dlc_close()` 내의 RFCOMM_DEFER_SETUP 조기 반환은 `BT_CONNECT`, `BT_CONFIG`, `BT_OPEN` 및 `BT_CONNECT2`만 커버하므로, 상태가 이미 `BT_CLOSED`인 경우 해당 switch문은 일치하지 않고 함수는 `rfcomm_dlc_unlink()`으로 계속 진행됩니다. 이는 `d->session = NULL`을 설정하지만 `d->defer_setup`는 1로 유지합니다.

이 시점 이후 수락된 소켓에서 `getsockopt(SOL_RFCOMM, RFCOMM_CONNINFO)`를 호출하면 `-ENOTCONN` 경로가 건너뛰어집니다(즉, `sk->sk_state`는 `BT_CLOSED`이지만 `dlc->defer_setup`는 여전히 설정되어 있음) 그리고 NULL 세션을 역참조합니다. 레이스 컨디션은 필요하지 않습니다: DISC가 처리된 후 역참조는 조건부 없이 발생합니다.

QEMU에서 KASAN 커널을 사용하여 재현되었습니다. /dev/vhci를 통해 에뮬레이션된 BR/EDR 피어가 ACL 링크를 활성화하고 RFCOMM PSM에서 L2CAP를 열고 세션을 시작하며 BT_DEFER_SETUP로 바인딩된 채널에 대해 SABM을 보내고, 소켓이 수락된 후 해당 dlci에 대한 DISC를 보냅니다. 그 후 수락된 소켓에서 `getsockopt(SOL_RFCOMM, RFCOMM_CONNINFO)`를 호출하면 다음과 같은 오류가 발생합니다:

``` Oops: general protection fault, probably for non-canonical address 0xdffffc0000000002: 0000 [#1] SMP KASAN PTI
KASAN: null-ptr-deref in range [0x0000000000000010-0x0000000000000017]
CPU: 1 UID: 0 PID: 150 Comm: init Tainted: G B 7.3.0-rc3-g5dd1818b15d9 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996) RIP: 0010:rfcomm_sock_getsockopt+0x529/0x780 Call Trace: <TASK> do_sock_getsockopt+0x3ad/0x7d0 __sys_getsockopt+0x10e/0x1b0 __x64_sys_getsockopt+0xc2/0x160 do_syscall_64+0xda/0x4b0 entry_SYSCALL_64_after_hwframe+0x77/0x7f </TASK> ```

`0x10`은 `struct rfcomm_session` 내의 sock 오프셋입니다. `rfcomm_sock_getsockopt_old()`는 `rfcomm_sock_getsockopt()`에 인라인되어 있습니다.

커밋 43a556b2fd43("Bluetooth: RFCOMM: take rfcomm_mutex for the deferred setup accept")은 동일한 "원격 DISC가 지연 설정이 여전히 플래그된 동안 세션을 지움" 문제를 `rfcomm_dlc_accept()`에서 수정했습니다. 이는 getsockopt 경로에 남아있는 마지막 사례입니다.

지연 설정은 소켓이 BT_CONNECT2 상태에 도달할 때까지 여기서만 사용 가능하게 하므로, 예외를 해당 상태로 제한하고 세션이 실제로 존재하는지 확인한 후 이를 따라가야 합니다.

Be aware that VulDB is the high quality source for vulnerability data.

책임이 있는

Linux

예약하다

2026. 09. 25.

모더레이션

수락

항목

VDB-421772

EPSS

0.00000

출처

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!