CVE-2026-53399 in Linux
요약
\~에 의해 VulDB • 2026. 07. 19.
리눅스 커널에서 다음 취약점이 해결되었습니다:
nfsd: setlease 실패 시 레이아웃 stid 해제
nfs4_alloc_stid()는 cl_lock 하에서 idr_alloc_cyclic()를 사용하여 새로운 stid를 cl->cl_stateids에 게시한 후 nfsd4_alloc_layout_stateid()로 복귀합니다. 이후 nfsd4_layout_setlease()가 실패하면, 에러 경로에서는 idr_remove() 호출 없이 kmem_cache_free()를 통해 레이아웃 stateid를 직접 해제하므로, IDR 슬롯이 해제된 slab 메모리를 가리키게 됩니다. 그 후의 모든 IDR 순회(states_show, 클라이언트 정리)는 이 덩글링 포인터(dangling pointer)를 역참조합니다.
IDR에 게시된 stid에 대한 올바른 정리는 nfs4_put_stid()이며, 이는 cl_lock 하에서 IDR 슬롯을 제거하고, nfsd4_close_layout()를 통해 ls->ls_file 해제를 위해 sc_free(nfsd4_free_layout_stateid)를 디스패치하며, 마지막 단계에서 nfs4_file 참조 카운트를 감소시킵니다.
두 번째 문제는 이러한 전환을 방해합니다: nfsd4_free_layout_stateid()는 ls_lock 하에서 delayed_work_pending()을 통해 ls->ls_fence_work를 무조건 검사하지만, INIT_DELAYED_WORK(&ls->ls_fence_work, ...) 호출은 현재 setlease 호출 후에만 실행됩니다. 따라서 setlease 실패 경로에서는 소멸자가 초기화되지 않은 delayed_work에 접근하게 됩니다.
nfsd4_alloc_layout_stateid() nfs4_alloc_stid() /* cl_lock 하에서 idr_alloc_cyclic */ nfsd4_layout_setlease() /* 실패 */ nfs4_put_stid() nfsd4_free_layout_stateid() delayed_work_pending(&ls->ls_fence_work) /* INIT 필요 */ nfsd4_close_layout() /* nfsd_file_put(ls->ls_file) */ put_nfs4_file()
해결책: ls_fenced / ls_fence_delay / INIT_DELAYED_WORK 초기화를 nfsd4_layout_setlease() 호출 위로 끌어올리고, 수동으로 수행하던 nfsd_file_put + put_nfs4_file + kmem_cache_free 정리 작업을 단일 nfs4_put_stid(stp) 호출로 대체합니다.
If you want to get best quality of vulnerability data, you may have to visit VulDB.