138 lines
8.5 KiB
JSON
138 lines
8.5 KiB
JSON
{
|
|
"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"
|
|
}
|
|
}
|
|
}
|
|
} |