🇰🇷 한글 설명
Linux 커널의 스케줄러(sched/rt)에서 RT 부하 분산 과정 중 특정 조건에서 CPU0가 자기 자신에게 반복적으로 IPI(Inter-Processor Interrupt)를 보내는 무한 루프가 발생합니다. 이로 인해 CPU가 지속적인 인터럽트에 빠져 하드락업(Hardlockup) 상태가 되어 시스템이 멈출 수 있습니다.
💡 쉬운 설명
컴퓨터의 두뇌 역할을 하는 CPU가 스스로에게 너무 많은 일을 시키는 바람에 다른 일을 전혀 못 하고 멈춰버리는 현상입니다. 특정 작업들이 겹칠 때 시스템이 응답하지 않는 상태가 될 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
sched/rt: Skip currently executing CPU in rto_next_cpu()
CPU0 becomes overloaded when hosting a CPU-bound RT task, a non-CPU-bound
RT task, and a CFS task stuck in kernel space. When other CPUs switch from
RT to non-RT tasks, RT load balancing (LB) is triggered; with
HAVE_RT_PUSH_IPI enabled, they send IPIs to CPU0 to drive the execution
of rto_push_irq_work_func. During push_rt_task on CPU0,
if next_task->prio < rq->donor->prio, resched_curr() sets NEED_RESCHED
and after the push operation completes, CPU0 calls rto_next_cpu().
Since only CPU0 is overloaded in this scenario, rto_next_cpu() should
ideally return -1 (no further IPI needed).
However, multiple CPUs invoking tell_cpu_to_push() during LB increments
rd->rto_loop_next. Even when rd->rto_cpu is set to -1, the mismatch between
rd->rto_loop and rd->rto_loop_next forces rto_next_cpu() to restart its
search from -1. With CPU0 remaining overloaded (satisfying rt_nr_migratory
&& rt_nr_total > 1), it gets reselected, causing CPU0 to queue irq_work to
itself and send self-IPIs repeatedly. As long as CPU0 stays overloaded and
other CPUs run pull_rt_tasks(), it falls into an infinite self-IPI loop,
which triggers a CPU hardlockup due to continuous self-interrupts.
The trigging scenario is as follows:
cpu0 cpu1 cpu2
pull_rt_task
tell_cpu_to_push
<------------irq_work_queue_on
rto_push_irq_work_func
push_rt_task
resched_curr(rq) pull_rt_task
rto_next_cpu tell_cpu_to_push
<-------------------------- atomic_inc(rto_loop_next)
rd->rto_loop != next
rto_next_cpu
irq_work_queue_on
rto_push_irq_work_func
Fix redundant self-IPI by filtering the initiating CPU in rto_next_cpu().
This solution has been verified to effectively eliminate spurious self-IPIs
and prevent CPU hardlockup scenarios.
📍 영향받는 시스템
Linux Kernel (RT 스케줄러 관련 기능이 활성화된 버전)
⚔️ 공격 벡터
CPU 집약적인 RT 작업과 커널 공간에 머무는 CFS 작업이 특정 조건으로 결합될 때 발생하는 로컬 시스템 부하 유발
🛡️ 대응 방법
rto_next_cpu() 함수에서 현재 실행 중인 CPU를 검색 대상에서 제외하도록 커널 패치를 적용해야 합니다.
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 최신 패치 버전인지 확인합니다.