{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2026-99269","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","state":"PUBLISHED","assignerShortName":"Linux","dateReserved":"2026-09-25T10:25:14.404Z","datePublished":"2026-11-03T11:48:18.333Z","dateUpdated":"2026-11-03T19:14:42.052Z"},"containers":{"cna":{"providerMetadata":{"orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","shortName":"Linux","dateUpdated":"2026-11-03T19:14:42.052Z"},"descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nsched_ext: Wait for SCX_OPSS_DISPATCHING before moving tasks off DSQs\n\nA task can be found on a non-local DSQ while the CPU which dispatched it\nis still running ops.dequeue() and hasn't cleared SCX_OPSS_DISPATCHING.\nThe DSQ consume and move paths don't wait for the dispatch to finish and\ncan operate on the task concurrently with the dispatcher.\n\nCall scx_wait_dispatching() in scx_move_local_task_to_local_dsq(),\nunlink_dsq_and_switch_rq_lock() and move_task_between_dsqs() before they\noperate on the task. In scx_move_local_task_to_local_dsq(), wait before\nscx_resolve_local_dsq() as it may update p->scx.flags."}],"metrics":[{"cvssV3_1":{"version":"3.1","vectorString":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","baseScore":7.8,"baseSeverity":"HIGH"},"scenarios":[{"lang":"en","value":"AV:L - The race is in scx_dispatch_enqueue() versus scx_move_local_task_to_local_dsq(), unlink_dsq_and_switch_rq_lock() and move_task_between_dsqs() in kernel/sched/ext/ext.c, reached locally by bpf(BPF_LINK_CREATE)->bpf_scx_reg() then scx_bpf_dsq_insert()/scx_bpf_dsq_move[_to_local](), or by __schedule()->pick_task_scx()->scx_dispatch_sched()->consume_global_dsq(); no remote protocol supplies the triggering state.\nAC:L - A loaded sched_ext program inserts a task onto a non-local DSQ so scx_dispatch_enqueue() drops dsq->lock while ops_state is still SCX_OPSS_DISPATCHING and runs ops.dequeue(), while another CPU consumes or moves that same task via scx_bpf_dsq_move_to_local()/scx_bpf_dsq_move() or consume_global_dsq(); the attacker drives both sides and can retry.\nPR:L - Enabling the scheduler takes bpf() BPF_PROG_LOAD of BPF_PROG_TYPE_STRUCT_OPS, which is_perfmon_prog_type() gates on bpf_token_capable(CAP_BPF) and CAP_PERFMON, then BPF_LINK_CREATE into bpf_scx_reg(); those capabilities are delegable into a user namespace with a BPF token, so this is not init-namespace root.\nUI:N - The attacker attaches their own sched_ext_ops, has scx_bpf_dsq_insert() place a task on a non-local DSQ, and consumes or moves it from another CPU; no victim mount, file open, or other user action is required.\nS:U - The concurrent updates of p->scx.flags, p->scx.ops_state and p->scx.dsq_list stay inside the host kernel sched_ext hot path; this is same-authority kernel memory corruption, not a VM, IOMMU, or guest-to-host escape.\nC:H - scx_move_local_task_to_local_dsq() and move_task_between_dsqs() unlink and re-link p->scx.dsq_list and RMW p->scx.flags (scx_resolve_local_dsq() may clear SCX_TASK_IMMED) while scx_dispatch_enqueue() still holds SCX_OPSS_DISPATCHING; a lost SCX_TASK_QUEUED bit or a second list_add of the live node corrupts kernel list state, a disclosure-capable memory-corruption primitive.\nI:H - The same unsynchronized DSQ unlink/insert and non-atomic p->scx.flags RMW, plus scx_dispatch_enqueue()'s later SCX_ENQ_CLEAR_OPSS store overwriting a new QUEUEING/QUEUED ops_state, can double-link a task or clobber scheduler ownership and yield kernel list corruption and control-flow corruption on the sched_ext path.\nA:H - Consuming or moving a task found on a non-local DSQ while scx_dispatch_enqueue() is still in ops.dequeue() with SCX_OPSS_DISPATCHING set hits WARN_ON_ONCE() in the enqueue/dispatch paths, can strand the task when CLEAR_OPSS overwrites QUEUED so later finish_dispatch() drops it, and can oops on a corrupted dsq_list, causing a kernel hang or panic."}]}],"affected":[{"product":"Linux","vendor":"Linux","defaultStatus":"unaffected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["kernel/sched/ext/ext.c"],"versions":[{"version":"ebf1ccff79c43f860cbd2f9d6cfab9a462d0cb2d","lessThan":"cc2839946328c1618b3870d521b32bb9483d49d0","status":"affected","versionType":"git"},{"version":"ebf1ccff79c43f860cbd2f9d6cfab9a462d0cb2d","lessThan":"2935062be77113c1c4565ca9d0c72180449aafee","status":"affected","versionType":"git"}]},{"product":"Linux","vendor":"Linux","defaultStatus":"affected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["kernel/sched/ext/ext.c"],"versions":[{"version":"7.1","status":"affected"},{"version":"0","lessThan":"7.1","status":"unaffected","versionType":"semver"},{"version":"7.2.14","lessThanOrEqual":"7.2.*","status":"unaffected","versionType":"semver"},{"version":"7.3","lessThanOrEqual":"*","status":"unaffected","versionType":"original_commit_for_fix"}]}],"cpeApplicability":[{"nodes":[{"operator":"OR","negate":false,"cpeMatch":[{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"7.1","versionEndExcluding":"7.2.14"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"7.1","versionEndExcluding":"7.3"}]}]}],"references":[{"url":"https://git.kernel.org/stable/c/cc2839946328c1618b3870d521b32bb9483d49d0"},{"url":"https://git.kernel.org/stable/c/2935062be77113c1c4565ca9d0c72180449aafee"}],"title":"sched_ext: Wait for SCX_OPSS_DISPATCHING before moving tasks off DSQs","x_generator":{"engine":"bippy-1.2.0"}}}}