CVE-2026-64142 in Linux
요약
\~에 의해 VulDB • 2026. 07. 19.
리눅스 커널에서 다음 취약점이 해결되었습니다:
ksmbd: m_fp_list 조회와의 내구성 스캐빈저(Race Condition) 수정
ksmbd_durable_scavenger()는 f_ci->m_fp_list를 순회하는 모든 워커(ksmbd_lookup_fd_inode()(ksmbd_vfs_rename에서 사용됨 포함) 및 fs/smb/server/smb_common.c의 공유 모드 검사 등)와 관련하여 두 가지 관련 Race Condition을 가지고 있습니다.
(1) fp->node 리스트 헤드 재사용 문제: 내구성이 보존된 핸들은 세션 종료 후에도 f_ci->m_fp_list에 연결된 상태로 남아있어, 핸들이 다시 연결 가능한 동안 공유 모드 검사가 이를 여전히 인식합니다. 스캐빈저는 전역 durable idr에서 제거한 후 fp->node를 로컬 scavenger_list에 추가하여 만료된 핸들을 수집했습니다. fp->node가 m_fp_list와 동일한 list_head이므로, list_add(&fp->node, &scavenger_list) 호출은 m_fp 링크를 덮어쓰고 두 리스트 모두를 손상시킵니다. CONFIG_DEBUG_LIST는 공유 모드 순회 경로에서 이를 보고할 수 있습니다.
(2) m_fp_list 워커와의 참조 카운트 Race Condition: 스캐빈저는 전역_ft.lock 하에서 atomic_read(&fp->refcount) > 1 및 fp->conn 조건을 만족하는 만료된 내구성 핸들을 식별한 후, global_ft에서 fp를 제거합니다. 그런 다음 m_fp_list에서 fp를 분리하고 해제하기 전에 global_ft.lock을 해제합니다. 그 간격 동안 fp는 f_state == FP_INITED 상태로 여전히 m_fp_list에 연결되어 있습니다. m_lock 하의 ksmbd_lookup_fd_inode() 호출은 ksmbd_fp_get()(참조 카운트가 아직 1인 경우 atomic_inc_not_zero)을 수행하고 활성 참조를 획득합니다; 스캐빈저는 그 후 fp를 분리하고 해제하지만, 소유자는 여전히 참조를 보유하고 있으므로 이후 holder의 ksmbd_fd_put() 및 m_fp_list를 순회하면서 ksmbd_fp_get() 없이 필드 읽기를 수행하는 동시 공유 모드 워커(smb_check_perm_dleases와 유사한 경로)에서 모두 UAF(Use-After-Free)가 발생합니다.
다음과 같이 두 가지를 수정합니다:
* fp->node를 스캐빈저 전용 리스트 노드로 재사용하지 않도록 합니다. global_ft.lock 하에서 전역_ft에서 만료된 핸들 하나를 제거하고, 명시적인 일시적 참조(transient reference)를 획득한 후, 잠금을 해제합니다. 그런 다음 f_ci->m_lock 하에서 fp->node를 m_fp_list에서 분리한 후, atomic_sub_and_test(2, &fp->refcount)로 내구성 수명 및 일시적 참조 둘 다를 해제합니다. 스캐빈저가 마지막 putter인 경우 해당 위치에서 close가 실행됩니다; 그렇지 않으면 이미 m_fp_list 조회 Race Condition을 겪은 인플라이트(in-flight) 홀더가 ksmbd_fd_put() 경로를 통해 최종 close를 소유하게 됩니다. 한 번에 하나씩 처리하는 방식은 동일한 패스에서 여러 핸들이 만료될 때 내구성 idr을 다시 스캔할 수 있지만, 내구성 스캐빈징은 백그라운드 만료 경로이며 마지막 전체 스캔은 다음 대기 전에 min_timeout를 재계산합니다.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.