🇰🇷 한글 설명
Linux 커널의 sched_ext 구성 요소에서 코어 스케줄링 시 dispatch kfunc가 실행되는 CPU와 대상 rq가 일치하지 않을 수 있는 취약점이 발견되었습니다. 이로 인해 scx_dsq_move()에서 잘못된 락 획득 시도로 인한 데드락이 발생하거나, DSQ(Dispatch Queue) 참조 오류가 발생할 수 있습니다. 이를 해결하기 위해 scx_locked_rq()를 사용하여 정확한 rq를 추적하도록 수정되었습니다.
💡 쉬운 설명
컴퓨터의 두뇌 역할을 하는 커널이 작업을 분배할 때, 엉뚱한 위치를 기준으로 작업을 처리하려다 시스템이 멈추거나 오류가 생길 수 있는 문제입니다. 이번 패치를 통해 작업이 실제로 처리되어야 할 정확한 위치를 찾아가도록 수정되었습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
sched_ext: Fix this_rq() assumptions in dispatch kfuncs
Under core scheduling, dispatch runs from within the core-wide pick and can
target a sibling rq, so ops.dispatch() may execute on a CPU different from
the dispatched rq's. Several kfunc paths assumed the two always coincide:
- scx_dsq_move() decided whether an rq lock is held by testing this_rq()'s
rq flags and lock-danced accordingly. A dispatch for a sibling took the
unlocked-context branch and acquired the source rq lock on top of the
already held dispatched rq lock which could deadlock.
- scx_bpf_sub_dispatch() dispatched this_rq() with its stashed
sub_dispatch_prev, which is NULL when dispatching for a sibling.
- finish_dispatch(), scx_bpf_dsq_reenq() and scx_bpf_dsq_nr_queued()
resolved SCX_DSQ_LOCAL to this CPU's local DSQ rather than the dispatched
rq's. The latter two are callable from other rq-locked operations too,
where SCX_DSQ_LOCAL now likewise resolves to the op's rq. This changes
behavior also without core scheduling, e.g. for ops.enqueue() running a
remote wakeup on the waking CPU, and is intended: which CPU happens to
execute an operation is incidental, the op's rq is what it is operating
on, and the resolution now matches the insert side where SCX_DSQ_LOCAL
dispatches land on the task's rq.
Use the rq tracked by scx_locked_rq(), which is set to the dispatched rq
around ops invocations and NULL in unlocked contexts.
📍 영향받는 시스템
sched_ext 기능을 사용하는 Linux 커널 (코어 스케줄링 활성화 시)
⚔️ 공격 벡터
로컬 공격자가 특수하게 조작된 스케줄링 작업을 통해 커널 데드락을 유발할 수 있음
🛡️ 대응 방법
sched_ext 관련 수정 사항이 포함된 최신 Linux 커널 버전으로 업데이트
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 해결된 패치 버전 이상인지 확인