🇰🇷 한글 설명
Linux 커널의 sched/psi 구성 요소에서 발생하는 레이스 컨디션 취약점입니다. psi_cgroup_free() 과정에서 rtpoll_timer가 적절히 종료되지 않아, 이미 해제된 메모리 영역에서 poll_timer_fn()이 실행될 수 있는 Use-After-Free 위험이 존재합니다.
💡 쉬운 설명
컴퓨터의 핵심 운영체제인 리눅스에서 특정 작업이 끝나기도 전에 메모리를 먼저 지워버려 발생하는 오류입니다. 이로 인해 시스템이 예기치 않게 멈추거나 보안 문제가 생길 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
sched/psi: Shut down rtpoll_timer in psi_cgroup_free()
psi_schedule_rtpoll_work() is called locklessly from the scheduler hotpath
and can race psi_trigger_destroy() taking down the last rtpoll trigger under
rtpoll_trigger_lock:
psi_schedule_rtpoll_work() psi_trigger_destroy()
rcu_read_lock();
task = rcu_dereference(rtpoll_task);
rcu_assign_pointer(rtpoll_task, NULL);
timer_delete(&rtpoll_timer);
mod_timer(&rtpoll_timer, ...);
rcu_read_unlock();
synchronize_rcu();
kthread_stop(task_to_destroy);
The group can then be freed with the re-armed timer still pending, and
poll_timer_fn() runs on freed memory.
461daba06bdc ("psi: eliminate kthread_worker from psi trigger scheduling
mechanism") deleted the timer synchronously after the synchronize_rcu(),
which prevented this but raced trigger creation instead: the deletion could
cancel the timer that a new trigger set armed during the grace period and,
as creation also reinitialized the timer at the time, corrupt it.
8f91efd870ea ("psi: Fix race between psi_trigger_create/destroy") moved the
initialization into group_init() and the deletion into the locked section,
trading the creation races for the window above.
Neither placement in the destruction path works. A pending timer firing
while the group is alive is harmless though. poll_timer_fn() just wakes the
rtpoll waitqueue and doesn't re-arm itself. Bind the timer to the group's
lifetime instead and shut it down in psi_cgroup_free(). Nothing can arm it
by then. timer_shutdown_sync() because the timer is never armed again.
📍 영향받는 시스템
Linux Kernel (psi_cgroup 관련 모듈 사용 버전)
⚔️ 공격 벡터
스케줄러 핫패스에서의 레이스 컨디션을 유도하여 해제된 메모리에 접근하는 방식
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트하여 psi_cgroup_free() 내 timer_shutdown_sync()가 적용된 버전을 사용하십시오.
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 해결된 패치 버전 이후인지 확인하십시오.