🇰🇷 한글 설명
Linux 커널의 tracing 기능에서 sub-buffer의 크기 변경 시 발생하는 Use-After-Free 취약점입니다. trace_pipe를 읽는 과정에서 버퍼의 순서가 변경되면, 이미 해제된 메모리 주소를 참조하게 되어 시스템 불안정이나 권한 상승을 초래할 수 있습니다.
💡 쉬운 설명
데이터를 읽고 있는 도중에 데이터가 담긴 바구니를 갑자기 바꿔버려서, 컴퓨터가 이미 버려진 바구니를 찾으려다 오류가 발생하는 문제입니다. 이로 인해 시스템이 멈추거나 해킹의 위험이 생길 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
tracing: Fix use-after-free in trace_pipe read on sub-buffer order change
Writing to buffer_subbuf_size_kb calls ring_buffer_subbuf_order_set(),
which frees every sub-buffer of the ring buffer, including the reader
page, and replaces them with newly allocated ones.
Readers of trace_pipe hold pointers into those pages. ring_buffer_peek()
looks up an event under cpu_buffer->reader_lock but returns the event
pointer after dropping the lock, and peek_next_entry() then calls
ring_buffer_event_length() and ring_buffer_event_data() on it. If the
sub-buffer order is changed in that window, the reader dereferences
freed memory:
BUG: KASAN: use-after-free in ring_buffer_peek+0x3e0/0x430
Read of size 1 at addr ffff88802a4cf010 by task syz-executor989/6002
Freed by:
free_buffer_page kernel/trace/ring_buffer.c:398 [inline]
ring_buffer_subbuf_order_set+0x1325/0x18e0 kernel/trace/ring_buffer.c:7444
buffer_subbuf_size_write+0x182/0x280 kernel/trace/trace.c:8221
Take trace_access_lock(RING_BUFFER_ALL_CPUS) around the order change.
This is the lock trace_pipe readers already hold across their entire
peek-and-print loop, so the swap can no longer race with a reader that
is dereferencing a peeked event.
📍 영향받는 시스템
Linux Kernel (tracing 기능이 활성화된 버전)
⚔️ 공격 벡터
로컬 사용자가 trace_pipe를 읽는 동시에 버퍼 크기를 변경하는 조작을 통해 메모리 오류 유도
🛡️ 대응 방법
커널 패치를 적용하여 버퍼 크기 변경 시 trace_access_lock을 사용하도록 업데이트
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 해결된 최신 패치 버전인지 확인