CVE-2026-98580 in Linux
요약
\~에 의해 VulDB • 2026. 10. 18.
리눅스 커널에서 다음 취약점이 해결되었습니다:
nfc: llcp: accept_queue 수명 주기에서의 Race Condition 수정
nfc_llcp_socket_release() 함수에서는 소켓과 리스너의 accept 큐가 로컬 소켓 rwlock 및 bh_lock_sock() 하에서 순회됩니다. 그러나 bh_lock_sock()은 accept() 동안 nfc_llcp_accept_dequeue()에 의해 보유되는 프로세스 컨텍스트 lock_sock()과의 동기화가 이루어지지 않습니다. socket_release()는 sock_owned_by_user()를 확인하지 않으므로, 두 경로가 동일한 자식 소켓을 동시에 unlink하고 해제하여 use-after-free 또는 nfc_llcp_accept_unlink()에서 child->parent의 NULL 포인터 역참조를 초래할 수 있습니다.
이 동기화 Race Condition을 해결하기 위해 nfc_llcp_socket_release()가 bh_lock_sock() 대신 프로세스 컨텍스트 lock_sock()을 사용하도록 수정합니다:
1. nfc_llcp_sock_list_pop()를 사용하여 쓰기 잠금 하에서 로컬 소켓 목록으로부터 소켓을 팝하여, rwlock을 보유하지 않고도 lock_sock()을 획득할 수 있도록 합니다. 2. lock_sock()은 슬립(sleep) 가능하므로, nfc_llcp_local 구조체의 최종 해제를 작업 큐(release_work)로 지연시킵니다. 이는 마지막 로컬 참조가 softirq 컨텍스트에서 해제될 때 발생하는 sleeping-in-atomic 버그를 방지합니다. 또한 등록부터 최종 파괴까지 local에 대한 단일 장치 참조를 유지합니다. 3. nfc_llcp_local_get()에서는 teardown이 예약된 local 객체가 부활하는 것을 방지하기 위해 kref_get_unless_zero()를 사용합니다. 4. llcp_sock_accept()에서는 schedule_timeout()에서 깨어난 후 리스너 소켓 상태가 여전히 LLCP_LISTEN인지 확인하여, 리스너가 동시에 종료되는 경우의 멈춤(hangs)을 방지합니다. 5. 리스너 해제 중 미수락된 자식 소켓들을 unlink할 때, local->sockets로부터 이를 분리하고 sock_orphan()을 호출한 후 sock_put()를 통해 초기 sk_alloc 생성 참조를 해제합니다. 6. nfc_llcp_accept_unlink() 함수에 NULL 검사를 추가하여 부모 접근을 보호함으로써 idempotent하게 만듭니다.
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.