CVE-2026-31733 in Linux
요약
\~에 의해 VulDB • 2026. 05. 16.
리눅스 커널에서 다음 취약점이 해결되었습니다:
sched_ext: ddsp_dsq_id에서 오래된 직접 디스패치 상태 수정
@p->scx.ddsp_dsq_id가 설정된 상태(비-SCX_DSQ_INVALID)로 남아있을 수 있으며, 이는 다음 각성 시 ops.select_cpu()가 scx_bpf_dsq_insert()를 호출하는 경우 mark_direct_dispatch()에서 잘못된 경고(spurious warning)를 유발합니다. 예:
WARNING: kernel/sched/ext.c:1273 at scx_dsq_insert_commit+0xcd/0x140
근본 원인은 ddsp_dsq_id가 직접 디스패치 심판을 소비하거나 취소하는 모든 경로에서 도달되지 않는 dispatch_enqueue()에서만 초기화되었기 때문입니다.
올바른 위치에서 이를 초기화하여 수정합니다:
- direct_dispatch(): 직접 디스패치 상태를 로컬 변수에 캐시하고, 동기화 경로에서 dispatch_enqueue() 전에 이를 초기화합니다. 지연 경로(dffered path)의 경우, process_ddsp_deferred_locals()가 이를 소비할 때까지 직접 디스패치 상태가 설정된 상태로 유지되어야 합니다.
- process_ddsp_deferred_locals(): 디스패치 상태를 로컬 변수에 캐시하고, 작업을 다른 rq로 마이그레이션할 수 있는 dispatch_to_local_dsq() 호출 전에 이를 초기화합니다.
- do_enqueue_task(): 직접 디스패치 심판이 무시되는 엔큐 경로(로컬/글로벌/bypass 폴백)에서 디스패치 상태를 초기화합니다.
- dequeue_task_scx(): 지연 디스패치 취소와 holding_cpu 레이스 상황을 모두 처리하기 위해 dispatch_dequeue() 후에 디스패치 상태를 초기화하여, 보류 중인 직접 디스패치가 취소되는 모든 경우를 커버합니다.
- scx_disable_task(): 작업을 현재 스케줄러에서 전환할 때 직접 디스패치 상태를 초기화합니다. 각성된 작업은 나가는 스케줄러의 ops.select_cpu()에 의해 직접 디스패치 상태가 설정된 후 SCX_OPS_ALLOW_QUEUED_WAKEUP이 설정된 경우 ttwu_queue_wakelist()를 통해 wake_list에 큐에 추가되었을 수 있습니다. 이러한 작업은 런큐(runqueue)에 없으며 scx_bypass()에 의해 반복되지 않으므로, 그들의 직접 디스패치 상태는 초기화되지 않습니다. 이 초기화 없이 이후 SCX 스케줄러가 작업을 직접 디스패치하려고 시도하면 mark_direct_dispatch()에서 WARN_ON_ONCE()가 트리거됩니다.
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.