🇰🇷 한글 설명
Linux 커널의 NFC LLCP 구성 요소에서 accept_queue 생명주기 관리 중 레이스 컨디션 취약점이 발견되었습니다. nfc_llcp_socket_release()와 nfc_llcp_accept_dequeue() 간의 동기화 문제로 인해 동일한 자식 소켓이 동시에 해제될 수 있으며, 이는 Use-After-Free 또는 NULL 포인터 역참조를 유발할 수 있습니다.
💡 쉬운 설명
NFC 통신을 처리하는 과정에서 두 가지 작업이 동시에 같은 데이터를 수정하려고 시도할 때 발생하는 오류입니다. 이로 인해 시스템이 갑자기 멈추거나 보안상 위험한 메모리 오류가 발생할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
nfc: llcp: Fix race condition in accept_queue lifecycle
In nfc_llcp_socket_release(), sockets and listener accept queues are
walked under the local sockets rwlock and bh_lock_sock(). However,
bh_lock_sock() does not synchronise against process-context lock_sock()
held by nfc_llcp_accept_dequeue() during accept(). Because
socket_release() does not check sock_owned_by_user(), both paths can
concurrently unlink and release the same child socket, resulting in
use-after-free or a NULL pointer dereference of child->parent in
nfc_llcp_accept_unlink().
Fix this synchronisation race by having nfc_llcp_socket_release() use
process-context lock_sock() instead of bh_lock_sock():
1. Pop sockets from the local sockets list under the write lock using
nfc_llcp_sock_list_pop() so lock_sock() can be acquired without
holding the rwlock.
2. Because lock_sock() can sleep, defer the final release of the
nfc_llcp_local structure to a workqueue (release_work). This avoids
a sleeping-in-atomic bug when the last local reference is dropped
from softirq context. Additionally, hold a single device reference
on local from registration until final destruction.
3. In nfc_llcp_local_get(), use kref_get_unless_zero() to prevent
resurrecting a local object whose teardown has been scheduled.
4. In llcp_sock_accept(), verify that the listener socket state is still
LLCP_LISTEN after waking from schedule_timeout() to prevent hangs if
the listener is closed concurrently.
5. When unlinking unaccepted child sockets during listener release,
unlink them from local->sockets, call sock_orphan(), and drop their
initial sk_alloc creation reference via sock_put().
6. Make nfc_llcp_accept_unlink() idempotent by guarding parent access with
a NULL check.
📍 영향받는 시스템
Linux kernel (NFC LLCP 모듈 사용 시스템)
⚔️ 공격 벡터
로컬 공격자가 특수하게 조작된 NFC 통신 요청을 통해 소켓 해제와 수락 과정을 동시에 유도하여 메모리 오류를 발생시킴
🛡️ 대응 방법
NFC LLCP 관련 동기화 로직이 수정된 최신 Linux 커널 버전으로 업데이트
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 패치된 최신 보안 업데이트 버전인지 확인
💻 영향받는 소프트웨어
IBM Security Verify Access