🇰🇷 한글 설명
Linux 커널의 unicode 서브시스템에서 utf8 맵 해제 시점이 RCU 유예 기간을 고려하지 않아, 경로 탐색 중 이미 해제된 맵을 참조하는 use-after-free 취약점이 해결되었습니다. 영향 대상은 ext4, f2fs, tmpfs의 casefold 기능을 사용하는 환경입니다.
💡 쉬운 설명
파일 경로를 찾는 도중에 그 파일 시스템이 언마운트되면, 이미 지워진 메모리를 읽게 되어 시스템이 불안정해지거나 충돌할 수 있었습니다. 이번 패치는 메모리 해제를 안전한 시점까지 미뤄 이 문제를 막습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
unicode: free the map after a grace period
generic_ci_d_hash() and generic_ci_d_compare() read sb->s_encoding and
dereference the unicode map while a pathwalk in rcu mode holds nothing
but rcu_read_lock(). The filesystems that use them, ext4, f2fs and
tmpfs, drop the map with utf8_unload() from ->put_super(), which runs
when the last reference to the mount goes away. A lookup that is still
inside such a filesystem at that point reads a freed map.
With a pathwalk held up in utf8_casefold_hash() while the last reference
to a casefolded tmpfs goes away:
BUG: KASAN: slab-use-after-free in utf8nlookup+0x74c/0x950
Read of size 8 at addr ff110001030fe658 by task walker/98
Call Trace:
<TASK>
utf8nlookup+0x74c/0x950
utf8byte+0x160/0x1560
utf8_casefold_hash+0x167/0x230
generic_ci_d_hash+0xdd/0x1c0
link_path_walk+0x11ad/0x1d30
path_lookupat+0x63/0xb00
filename_lookup+0x1f1/0x5b0
vfs_statx+0xd7/0x3b0
[...]
Allocated by task 94:
__kmalloc_cache_noprof+0x249/0x560
utf8_load+0x4e/0x570
shmem_parse_opt_casefold.isra.0+0x92/0x270
[...]
Freed by task 97:
kfree+0x1db/0x5b0
shmem_put_super+0x72/0x170
generic_shutdown_super+0x14c/0x530
kill_anon_super+0x3a/0x60
deactivate_locked_super+0x9c/0xf0
cleanup_mnt+0x9f/0x130
So far that has been hard to hit. umount(2) waits for a grace period
in namespace_unlock() before it drops the mount, so only a mount whose
last reference goes away elsewhere, like the close of a file or a chdir
out of a lazily unmounted directory, can race a walker. So it is
reachable.
Delay the free until a grace period has passed. The map and the data
table it holds a reference to then outlive any pathwalk that found the
superblock before the mount went away. The reference on the data table
module is dropped from the rcu callback as well. utf8-core is built in
whenever CONFIG_UNICODE is set, so there is no module exit that would
have to wait for the callbacks.
Overlayfs points the s_encoding of an overlay at the map of its first
layer without taking a reference of its own. That stays correct. The
layer is held by the overlay, so its map is dropped only after the
overlay is gone.
📍 영향받는 시스템
casefold 기능을 사용하는 ext4, f2fs, tmpfs가 포함된 Linux 커널 (패치 적용 전 버전)
⚔️ 공격 벡터
로컬 사용자가 casefold 마운트의 마지막 참조가 해제되는 시점에 경로 탐색을 동시에 수행하여 커널 메모리 손상 또는 충돌을 유발
🛡️ 대응 방법
배포판에서 제공하는 해당 보안 업데이트 커널로 업그레이드 후 재부팅
🔧 검증 코드
출력된 커널 버전을 배포판 보안 공지의 패치된 버전과 비교하고, 같거나 높으면 패치가 적용된 것으로 판단