CVE-2026-98581 in Linux정보

요약

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

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

nfc: llcp: nfc_llcp_recv_dm()에서의 리스트 손상 및 refcount 비동기화 수정

nfc_llcp_recv_dm()는 아직 local->connecting_sockets에 연결되어 있는 소켓에 대해 DM(NOBOUND)/DM(REJ)를 처리합니다. 이 함수는 nfc_llcp_connecting_sock_get()로 소켓을 조회하고, sk->sk_state = LLCP_CLOSED로 설정한 후 반환하지만, 소켓 잠금(lock)을 획득하지 않으며 connecting_sockets 리스트에서 소켓을 제거(unlink)하지 않습니다.

llcp_sock_release()는 sk_state에 따라 제거할 리스트를 선택합니다: LLCP_CONNECTING 상태의 소켓은 connecting_sockets에서 제거되고, 그 외의 경우 sockets 리스트에서 제거됩니다. recv_dm 함수가 소켓을 물리적으로 connecting_sockets에 그대로 둔 채 LLCP_CLOSED 상태로 만들었기 때문에, release()는 else 분기를 실행하여 nfc_llcp_sock_unlink(&local->sockets, sk)를 호출합니다. 이는 sockets.lock을 획득한 상태에서 sk_del_node_init()를 실행하므로, 잘못된 잠금 하에서 connecting_sockets hlist로부터 소켓을 제거하게 됩니다. 동시에 다른 연결(connect())이 connecting_sockets.lock 하에 다른 소켓을 connecting_sockets에 링크하면 동일한 hlist가 비동기적으로 수정되어 리스트가 손상되고 sk_add_node()/sk_del_node_init()와 sock_hold()/__sock_put()의 페어링(refcount 동기화)이 깨집니다. LLCP 소켓을 보유한 권한 없는 로컬 프로세스는 확립된 LLCP 연결을 통해 원격 피어로부터 제공되는 DM을 이용해 이를 유발할 수 있으며, 이는 무제한적인 커널 소켓 누수(잘못된 디크리먼트가 비삭제(non-freeing) __sock_put() 경로를 통과하므로 객체가 결코 해제되지 않음)를 초래하여 메모리 고갈/DoS로 이어집니다.

이것은 커밋 b493ea2765cc("nfc: llcp: Fix use-after-free race in nfc_llcp_recv_cc()")에서 형제 핸들러인 nfc_llcp_recv_cc()가 수정한 것과 동일한 유형의 버그입니다; recv_dm에는 해당 수정이 적용되지 않았습니다.

동일한 방식으로 수정합니다: lock_sock()을 획득하고, 소켓이 여전히 해시되어 있는지(release()가 레이스를 이겼을 수 있음) 재확인하며, NOBOUND/REJ 경우 LLCP_CLOSED로 이동하기 전에 connecting_sockets에서 이를 제거(unlink)합니다. unlink는 sk_del_node_init()를 통해 connecting_sockets 멤버십 참조를 해제하여 소켓을 해시되지 않은 상태로 만듭니다. 따라서 llcp_sock_release() 내의 이후 nfc_llcp_sock_unlink() 호출은 무효(no-op)가 되며 이중 put(double put)이 발생하지 않습니다.

Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.

책임이 있는

Linux

예약하다

2026. 09. 25.

모더레이션

수락

항목

VDB-422089

EPSS

0.00000

활동

낮음

출처

Do you need the next level of professionalism?

Upgrade your account now!