🇰🇷 한글 설명
Linux 커널의 fanotify 기능에서 파일 범위 정보(file range info)를 처리할 때 Use-After-Free 취약점이 발견되었습니다. 트리거링 작업의 스택에 생성된 정보를 참조하는 과정에서, 신호(signal)로 인해 스택 프레임이 해제된 후에도 이벤트 리더가 해당 메모리에 접근하여 잘못된 값을 읽어오는 문제입니다.
💡 쉬운 설명
컴퓨터가 작업 중인 임시 메모리 공간이 사라졌는데도, 다른 프로그램이 그 공간을 계속 사용하려고 시도하면서 발생하는 오류입니다. 이로 인해 시스템이 불안정해지거나 잘못된 데이터가 노출될 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
fanotify: fix use-after-free of file range info
fsnotify_pre_content() builds its file_range on the triggering task's
stack. fanotify_alloc_perm_event() saves a pointer to range.pos in the
heap-allocated permission event so copy_range_info_to_user() can report
the offset later.
The event reader can set the event state to FAN_EVENT_REPORTED and then
sleep while preparing the file descriptor. If a signal interrupts the
triggering task at that point, fanotify_get_response() changes the state
to FAN_EVENT_CANCELED and returns. This unwinds the file_range stack
frame while the reader still owns the event. The reader then dereferences
pevent->ppos and copies the stale stack value to userspace.
KASAN reported:
BUG: KASAN: use-after-free in fanotify_read+0x293e/0x2970
Read of size 8 at addr ffff88811434fc50 by task fanotify_inotif/95
Call Trace:
fanotify_read+0x293e/0x2970
vfs_read+0x177/0xa20
ksys_read+0xf7/0x1c0
do_syscall_64+0xf9/0x540
entry_SYSCALL_64_after_hwframe+0x77/0x7f
Store the range position directly in the permission event and use
FANOTIFY_NO_RANGE when range information is unavailable. The event remains
alive until the reader finishes, so the reported offset no longer depends
on the triggering task's stack.
📍 영향받는 시스템
Linux Kernel (fanotify 기능이 활성화된 모든 버전)
⚔️ 공격 벡터
특정 신호를 사용하여 트리거링 작업의 스택을 해제시킨 후, fanotify 이벤트를 읽어 메모리 오류를 유도하는 방식
🛡️ 대응 방법
파일 범위 정보를 스택이 아닌 힙(heap)에 직접 저장하도록 커널을 업데이트하거나 최신 보안 패치를 적용해야 합니다.
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 해결된 최신 패치 버전인지 확인합니다.