🇰🇷 한글 설명
Linux 커널의 SMB 클라이언트에서 cifs_oplock_break() 함수 호출 중 레이스 컨디션으로 인해 Use-After-Free(UAF) 취약점이 발생합니다. 파일 시스템 언마운트 과정에서 슈퍼블록의 참조 카운트가 해제된 후 cinode 구조체에 접근하게 되어 메모리 오류가 발생할 수 있습니다.
💡 쉬운 설명
파일 공유 기능을 해제하는 과정에서 컴퓨터가 이미 삭제한 메모리 영역을 다시 사용하려고 시도하여 발생하는 오류입니다. 이로 인해 시스템이 멈추거나 보안 공격에 악용될 위험이 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
smb: client: fix use-after-free in cifs_oplock_break
A race condition can occur in cifs_oplock_break() leading to a
use-after-free of the cinode structure when unmounting:
cifs_oplock_break()
_cifsFileInfo_put(cfile)
cifsFileInfo_put_final()
cifs_sb_deactive()
[last ref, start releasing sb]
kill_sb()
kill_anon_super()
generic_shutdown_super()
evict_inodes()
dispose_list()
evict()
destroy_inode()
call_rcu(&inode->i_rcu, i_callback)
spin_lock(&cinode->open_file_lock) <- OK
[later] i_callback()
cifs_free_inode()
kmem_cache_free(cinode)
spin_unlock(&cinode->open_file_lock) <- UAF
cifs_done_oplock_break(cinode) <- UAF
The issue occurs when umount has already released its reference to the
superblock. When _cifsFileInfo_put() calls cifs_sb_deactive(), this
releases the last reference, triggering the immediate cleanup of all
inodes under RCU. However, cifs_oplock_break() continues to access the
cinode after this point, resulting in use-after-free.
Fix this by holding an extra reference to the superblock during the
entire oplock break operation. This ensures that the superblock and
its inodes remain valid until the oplock break completes.
📍 영향받는 시스템
Linux Kernel (SMB/CIFS client module 포함 버전)
⚔️ 공격 벡터
특정 조건에서 SMB 파일 시스템을 언마운트하는 과정 중 레이스 컨디션을 유도하여 발생
🛡️ 대응 방법
Oplock break 작업이 완료될 때까지 슈퍼블록의 참조 카운트를 유지하도록 커널 패치 적용
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 최신 보안 패치 버전인지 확인