🇰🇷 한글 설명
Linux 커널의 NFS/localio 구성 요소에서 nfs_uuid_add_file 실패 시 참조 카운트 누수가 발생하는 취약점입니다. 이 오류로 인해 nfsd_file 및 nfsd_net 참조가 해제되지 않아 시스템 자원이 고갈되고 네트워크 네임스페이스 해제를 방해할 수 있습니다.
💡 쉬운 설명
프로그램이 작업을 수행하다 실패했을 때 사용하던 메모리나 자원을 제대로 돌려주지 않고 버리는 현상입니다. 이 문제가 반복되면 컴퓨터의 중요한 자원이 계속 쌓여 결국 시스템이 느려지거나 정상적으로 종료되지 않을 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
NFS/localio: fix ref leak on nfs_uuid_add_file failure
When nfs_uuid_add_file() races with nfs_uuid_put() tearing down
uuid->net, it returns -ENXIO without publishing nfl->nfs_uuid via
rcu_assign_pointer(). nfs_open_local_fh() then enters its error
branch and only releases the slot's file ref and its paired net
ref plus its own entry-time net ref, while the close path is a
no-op:
nfs_close_local_fh()
nfs_uuid = rcu_dereference(nfl->nfs_uuid);
if (!nfs_uuid) { rcu_read_unlock(); return; } /* always */
nfsd_open_local_fh() returns localio holding a caller-owned +1
nfsd_file reference (from nfsd_file_get() after
nfsd_file_acquire_local()) and an entry-time nfsd_net reference
(from its first nfsd_net_try_get()) embedded as nf->nf_net. Both
are leaked on the failure path, pinning one nfsd_file (and the
underlying struct file, dentry, inode) and one nfsd_net_ref per
occurrence, which blocks nfsd_net and netns teardown.
Fix by releasing the caller-owned file ref and its net ref through
the existing helper, using a stack-local RCU pointer so the helper
can xchg it out, then returning -ENXIO so callers do not
dereference a localio whose slot has been cleared:
struct nfsd_file __rcu *tmp = RCU_INITIALIZER(localio);
nfs_to_nfsd_file_put_local(pnf);
nfs_to_nfsd_file_put_local(&tmp);
localio = ERR_PTR(-ENXIO);
The trailing nfs_to_nfsd_net_put(net) continues to release the
outer net ref, so all three nfsd_net_try_get() increments are
balanced on the error branch.
📍 영향받는 시스템
Linux Kernel (NFS/localio 관련 모듈 사용 버전)
⚔️ 공격 벡터
특정 조건에서 NFS localio 관련 함수 호출을 유도하여 참조 누수를 반복적으로 발생시킴
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 해결된 패치 버전 이후인지 확인