CVE-2024-26976 json
KVM: Always flush async #PF workqueue when vCPU is being destroyed
published 2024-05-01 2 y ago modified 2026-08-05 3 mo ago also EUVD-2024-24238
- cvss
- 7.8
- version 3.1, CNA
- cisa kev
- Not listed
- not in CISA's catalog
- epss
- 0.3%
- EPSS 0.3% chance of exploitation in 30 days, percentile 18%
- public exploits
- 0
- none known
Summary
In the Linux kernel, the following vulnerability has been resolved:
KVM: Always flush async #PF workqueue when vCPU is being destroyed
Always flush the per-vCPU async #PF workqueue when a vCPU is clearing its completion queue, e.g. when a VM and all its vCPUs is being destroyed. KVM must ensure that none of its workqueue callbacks is running when the last reference to the KVM _module_ is put. Gifting a reference to the associated VM prevents the workqueue callback from dereferencing freed vCPU/VM memory, but does not prevent the KVM module from being unloaded before the callback completes.
Drop the misguided VM refcount gifting, as calling kvm_put_kvm() from async_pf_execute() if kvm_put_kvm() flushes the async #PF workqueue will result in deadlock. async_pf_execute() can't return until kvm_put_kvm() finishes, and kvm_put_kvm() can't return until async_pf_execute() finishes:
WARNING: CPU: 8 PID: 251 at virt/kvm/kvm_main.c:1435 kvm_put_kvm+0x2d/0x320 [kvm] Modules linked in: vhost_net vhost vhost_iotlb tap kvm_intel kvm irqbypass CPU: 8 PID: 251 Comm: kworker/8:1 Tainted: G W 6.6.0-rc1-e7af8d17224a-x86/gmem-vm #119 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 0.0.0 02/06/2015 Workqueue: events async_pf_execute [kvm] RIP: 0010:kvm_put_kvm+0x2d/0x320 [kvm] Call Trace: <TASK> async_pf_execute+0x198/0x260 [kvm] process_one_work+0x145/0x2d0 worker_thread+0x27e/0x3a0 kthread+0xba/0xe0 ret_from_fork+0x2d/0x50 ret_from_fork_asm+0x11/0x20 </TASK> ---[ end trace 0000000000000000 ]--- INFO: task kworker/8:1:251 blocked for more than 120 seconds. Tainted: G W 6.6.0-rc1-e7af8d17224a-x86/gmem-vm #119 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. task:kworker/8:1 state:D stack:0 pid:251 ppid:2 flags:0x00004000 Workqueue: events async_pf_execute [kvm] Call Trace: <TASK> __schedule+0x33f/0xa40 schedule+0x53/0xc0 schedule_timeout+0x12a/0x140 __wait_for_common+0x8d/0x1d0 __flush_work.isra.0+0x19f/0x2c0 kvm_clear_async_pf_completion_queue+0x129/0x190 [kvm] kvm_arch_destroy_vm+0x78/0x1b0 [kvm] kvm_put_kvm+0x1c1/0x320 [kvm] async_pf_execute+0x198/0x260 [kvm] process_one_work+0x145/0x2d0 worker_thread+0x27e/0x3a0 kthread+0xba/0xe0 ret_from_fork+0x2d/0x50 ret_from_fork_asm+0x11/0x20 </TASK>
If kvm_clear_async_pf_completion_queue() actually flushes the workqueue, then there's no need to gift async_pf_execute() a reference because all invocations of async_pf_execute() will be forced to complete before the vCPU and its VM are destroyed/freed. And that in turn fixes the module unloading bug as __fput() won't do module_put() on the last vCPU reference until the vCPU has been freed, e.g. if closing the vCPU file also puts the last reference to the KVM module.
Note that kvm_check_async_pf_completion() may also take the work item off the completion queue and so also needs to flush the work queue, as the work will not be seen by kvm_clear_async_pf_completion_queue(). Waiting on the workqueue could theoretically delay a vCPU due to waiting for the work to complete, but that's a very, very small chance, and likely a very small delay. kvm_arch_async_page_present_queued() unconditionally makes a new request, i.e. will effectively delay entering the guest, so the remaining work is really just:
trace_kvm_async_pf_completed(addr, cr2_or_gpa);
__kvm_vcpu_wake_up(vcpu);
mmput(mm);
and mmput() can't drop the last reference to the page tables if the vCPU is still alive, i.e. the vCPU won't get stuck tearing down page tables.
Add a helper to do the flushing, specifically to deal with "wakeup all" work items, as they aren't actually work items, i.e. are never placed in a workqueue. Trying to flush a bogus workqueue entry rightly makes __flush_work() complain (kudos to whoever added that sanity check).
Note, commit 5f6de5cbebee ("KVM: Prevent module exit until al ---truncated---
Patch / fix
- Linux Linux 4.19.312, 5.4.274, 5.10.215, 5.15.154, 6.1.84, 6.6.24, 6.7.12, 6.8.3, 6.9
- linux linux_kernel 3d75b8aa5c29, 4f3a3bce428f, 82e25cc1c2e9, 83d3c5e30961, 8730d6335e5, a75afe480d43, ab2c2f5d9576, b54478d20375, caa9af2e27c2
- linux Debian 12 6.1.85-1
- linux Debian 14, Debian 13 6.7.12-1
debian advisories DEBIAN-CVE-2024-26976
- linux Ubuntu 20.04 LTS 5.4.0-189.209
- linux Ubuntu 22.04 LTS 5.15.0-116.126
- linux Ubuntu 24.04 LTS 6.8.0-35.35
- linux-aws Ubuntu 20.04 LTS 5.4.0-1128.138
- linux-aws Ubuntu 22.04 LTS 5.15.0-1065.71
- linux-aws Ubuntu 24.04 LTS 6.8.0-1009.9
- linux-gcp Ubuntu 20.04 LTS 5.4.0-1132.141
- linux-gcp Ubuntu 22.04 LTS 5.15.0-1064.72
ubuntu advisories UBUNTU-CVE-2024-26976
Ubuntu security data © Canonical Ltd., from https://github.com/canonical/ubuntu-security-notices via OSV; changed: normalised to fixed package versions per release. CC BY-SA 4.0
- kernel RHEL 9 5.14.0-503.11.1.el9_5
- rv RHEL 9 5.14.0-503.11.1.el9_5
- perf RHEL 9 5.14.0-503.11.1.el9_5
- rtla RHEL 9 5.14.0-503.11.1.el9_5
- bpftool RHEL 9 7.4.0-503.11.1.el9_5
- libperf RHEL 9 5.14.0-503.11.1.el9_5
- kernel-rt RHEL 9 5.14.0-503.11.1.el9_5
- kernel-64k RHEL 9 5.14.0-503.11.1.el9_5
red hat advisories RHSA-2025:3510RHSA-2024:9315RHSA-2024:8870RHSA-2024:8856
- kernel-rt Linux Micro 6.0 6.4.0-10.1
- kernel-source-rt Linux Micro 6.0 6.4.0-10.1
- kernel-livepatch-MICRO-6-0-RT_Update_2 Linux Micro 6.0 1-1.1
- kernel-source Linux Micro 6.0 6.4.0-19.1
- kernel-default Linux Micro 6.0 6.4.0-19.1
- kernel-kvmsmall Linux Micro 6.0 6.4.0-19.1
- kernel-default-base Linux Micro 6.0 6.4.0-17.1.1.51
- kernel-livepatch-MICRO-6-0_Update_2 Linux Micro 6.0 1-1.1
suse advisories SUSE-SU-2025:20047-1SUSE-SU-2025:20044-1SUSE-SU-2025:0236-1SUSE-SU-2024:3383-1SUSE-SU-2024:3195-1SUSE-SU-2024:3194-1
- kernel AlmaLinux 8 4.18.0-553.27.1.el8_10
- perf AlmaLinux 8 4.18.0-553.27.1.el8_10
- bpftool AlmaLinux 8 4.18.0-553.27.1.el8_10
- kernel-core AlmaLinux 8 4.18.0-553.27.1.el8_10
- kernel-tools AlmaLinux 8 4.18.0-553.27.1.el8_10
- python3-perf AlmaLinux 8 4.18.0-553.27.1.el8_10
- kernel-modules AlmaLinux 8 4.18.0-553.27.1.el8_10
- kernel-zfcpdump AlmaLinux 8 4.18.0-553.27.1.el8_10
almalinux advisories ALSA-2024:8856ALSA-2024:8870
- kernel-rt Rocky Linux 8 4.18.0-553.27.1.rt7.368.el8_10
- kernel Rocky Linux 8 4.18.0-553.27.1.el8_10
rocky linux advisories RLSA-2024:8870RLSA-2024:8856
- git.kernel.org/stable/c/ab2c2f5d9576112ad22cfd3798071cb74693b1f5 commit
- git.kernel.org/stable/c/82e25cc1c2e93c3023da98be282322fc08b61ffb commit
- git.kernel.org/stable/c/f8730d6335e5f43d09151fca1f0f41922209a264 commit
- git.kernel.org/stable/c/83d3c5e309611ef593e2fcb78444fc8ceedf9bac commit
- git.kernel.org/stable/c/b54478d20375874aeee257744dedfd3e413432ff commit
- git.kernel.org/stable/c/a75afe480d4349c524d9c659b1a5a544dbc39a98 commit
- git.kernel.org/stable/c/4f3a3bce428fb439c66a578adc447afce7b4a750 commit
- git.kernel.org/stable/c/caa9af2e27c275e089d702cfbaaece3b42bca31b commit
- git.kernel.org/stable/c/3d75b8aa5c29058a512db29da7cbee8052724157 commit
Vendor advisories
What the vendors themselves say about their products: affected, fixed or not affected, and what to do.
red hat product security vex CVE-2024-26976 updated cvss 5.5
kernel: KVM: Always flush async #PF workqueue when vCPU is being destroyed
-
Red Hat Enterprise Linux 6 perf, kernel, python-perf, kernel-kdump, kernel-firmware, kernel-bootwrapper, +1 more Red Hat Enterprise Linux 7 perf, kernel, bpftool, kernel-rt, python-perf, kernel-kdump, +8 moreaffected: workaround, no fix planned “Out of support scope”
-
Red Hat CodeReady Linux Builder (v. 9) libperf 5.14.0-503.11.1.el9_5, kernel-debuginfo-common-s390x 5.14.0-503.11.1.el9_5, kernel-debuginfo-common-x86_64 5.14.0-503.11.1.el9_5, kernel-debuginfo-common-aarch64 5.14.0-503.11.1.el9_5, kernel-debuginfo-common-ppc64le 5.14.0-503.11.1.el9_5fixed: vendor fix RHSA-2024:9315
-
Red Hat CodeReady Linux Builder EUS (v.9.4) libperf 5.14.0-427.62.1.el9_4, kernel-debuginfo-common-s390x 5.14.0-427.62.1.el9_4, kernel-debuginfo-common-x86_64 5.14.0-427.62.1.el9_4, kernel-debuginfo-common-aarch64 5.14.0-427.62.1.el9_4, kernel-debuginfo-common-ppc64le 5.14.0-427.62.1.el9_4fixed: vendor fix RHSA-2025:3510
-
Red Hat Enterprise Linux AppStream (v. 9) rv 5.14.0-503.11.1.el9_5, perf 5.14.0-503.11.1.el9_5, rtla 5.14.0-503.11.1.el9_5, kernel-devel-matched 5.14.0-503.11.1.el9_5, kernel-64k-devel-matched 5.14.0-503.11.1.el9_5, kernel-debug-devel-matched 5.14.0-503.11.1.el9_5, +6 morefixed: vendor fix RHSA-2024:9315
-
Red Hat Enterprise Linux AppStream EUS (v.9.4) rv 5.14.0-427.62.1.el9_4, perf 5.14.0-427.62.1.el9_4, rtla 5.14.0-427.62.1.el9_4, kernel-devel-matched 5.14.0-427.62.1.el9_4, kernel-64k-devel-matched 5.14.0-427.62.1.el9_4, kernel-debug-devel-matched 5.14.0-427.62.1.el9_4, +6 morefixed: vendor fix RHSA-2025:3510
-
Red Hat Enterprise Linux BaseOS (v. 8) perf 4.18.0-553.27.1.el8_10, kernel 4.18.0-553.27.1.el8_10, bpftool 4.18.0-553.27.1.el8_10, kernel-core 4.18.0-553.27.1.el8_10, kernel-tools 4.18.0-553.27.1.el8_10, python3-perf 4.18.0-553.27.1.el8_10, +15 morefixed: vendor fix RHSA-2024:8856
-
Red Hat Enterprise Linux BaseOS (v. 9) bpftool 7.4.0-503.11.1.el9_5, kernel 5.14.0-503.11.1.el9_5, kernel-64k 5.14.0-503.11.1.el9_5, kernel-core 5.14.0-503.11.1.el9_5, kernel-tools 5.14.0-503.11.1.el9_5, python3-perf 5.14.0-503.11.1.el9_5, +29 morefixed: vendor fix RHSA-2024:9315
-
Red Hat Enterprise Linux BaseOS EUS (v.9.4) bpftool 7.3.0-427.62.1.el9_4, kernel 5.14.0-427.62.1.el9_4, kernel-64k 5.14.0-427.62.1.el9_4, kernel-core 5.14.0-427.62.1.el9_4, kernel-tools 5.14.0-427.62.1.el9_4, python3-perf 5.14.0-427.62.1.el9_4, +28 morefixed: vendor fix RHSA-2025:3510
show 8 moreshow fewer
-
Red Hat Enterprise Linux CRB (v. 8) kernel-debuginfo-common-x86_64 4.18.0-553.27.1.el8_10, kernel-debuginfo-common-aarch64 4.18.0-553.27.1.el8_10, kernel-debuginfo-common-ppc64le 4.18.0-553.27.1.el8_10fixed: vendor fix RHSA-2024:8856
-
Red Hat Enterprise Linux NFV (v. 8) kernel-rt 4.18.0-553.27.1.rt7.368.el8_10, kernel-rt-kvm 4.18.0-553.27.1.rt7.368.el8_10, kernel-rt-core 4.18.0-553.27.1.rt7.368.el8_10, kernel-rt-modules 4.18.0-553.27.1.rt7.368.el8_10, kernel-rt-debug-kvm 4.18.0-553.27.1.rt7.368.el8_10, kernel-rt-debug-core 4.18.0-553.27.1.rt7.368.el8_10, +4 morefixed: vendor fix RHSA-2024:8870
-
Red Hat Enterprise Linux Real Time (v. 9) kernel-rt 5.14.0-503.11.1.el9_5, kernel-rt-core 5.14.0-503.11.1.el9_5, kernel-rt-modules 5.14.0-503.11.1.el9_5, kernel-rt-debug-core 5.14.0-503.11.1.el9_5, kernel-rt-modules-core 5.14.0-503.11.1.el9_5, kernel-rt-debug-modules 5.14.0-503.11.1.el9_5, +4 morefixed: vendor fix RHSA-2024:9315
-
Red Hat Enterprise Linux Real Time EUS (v.9.4) kernel-rt 5.14.0-427.62.1.el9_4, kernel-rt-core 5.14.0-427.62.1.el9_4, kernel-rt-modules 5.14.0-427.62.1.el9_4, kernel-rt-debug-core 5.14.0-427.62.1.el9_4, kernel-rt-modules-core 5.14.0-427.62.1.el9_4, kernel-rt-debug-modules 5.14.0-427.62.1.el9_4, +4 morefixed: vendor fix RHSA-2025:3510
-
Red Hat Enterprise Linux Real Time for NFV (v. 9) kernel-rt 5.14.0-503.11.1.el9_5, kernel-rt-kvm 5.14.0-503.11.1.el9_5, kernel-rt-core 5.14.0-503.11.1.el9_5, kernel-rt-modules 5.14.0-503.11.1.el9_5, kernel-rt-debug-kvm 5.14.0-503.11.1.el9_5, kernel-rt-debug-core 5.14.0-503.11.1.el9_5, +6 morefixed: vendor fix RHSA-2024:9315
-
Red Hat Enterprise Linux Real Time for NFV EUS (v.9.4) kernel-rt 5.14.0-427.62.1.el9_4, kernel-rt-kvm 5.14.0-427.62.1.el9_4, kernel-rt-core 5.14.0-427.62.1.el9_4, kernel-rt-modules 5.14.0-427.62.1.el9_4, kernel-rt-debug-kvm 5.14.0-427.62.1.el9_4, kernel-rt-debug-core 5.14.0-427.62.1.el9_4, +6 morefixed: vendor fix RHSA-2025:3510
-
Red Hat Enterprise Linux RT (v. 8) kernel-rt 4.18.0-553.27.1.rt7.368.el8_10, kernel-rt-core 4.18.0-553.27.1.rt7.368.el8_10, kernel-rt-modules 4.18.0-553.27.1.rt7.368.el8_10, kernel-rt-debug-core 4.18.0-553.27.1.rt7.368.el8_10, kernel-rt-debug-modules 4.18.0-553.27.1.rt7.368.el8_10, kernel-rt-modules-extra 4.18.0-553.27.1.rt7.368.el8_10, +2 morefixed: vendor fix RHSA-2024:8870
-
Red Hat CodeReady Linux Builder (v. 9) kernel-cross-headers 5.14.0-503.11.1.el9_5 Red Hat Enterprise Linux AppStream (v. 9) kernel-headers 5.14.0-503.11.1.el9_5not affected: vulnerable code not present
Red Hat CSAF VEX © Red Hat, Inc., from https://security.access.redhat.com/data/csaf/v2/vex/; changed: reduced to product statuses and remediations. CC BY 4.0 · csaf
CISA SSVC
- Exploitation
- none
- Automatable
- no
- Technical impact
- total
- Assessed
- 21 mo ago
Exploit prediction
0.26% chance of exploitation in the next 30 days, higher than 18% of all scored CVEs (FIRST EPSS, 2026-11-08).
CVSS scores
| assigned by | version | score | vector |
|---|---|---|---|
| CNA | 3.1 | 7.8 | CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CISA ADP | 3.1 | 7.0 | CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CNA | 3.1 | 7.0 | CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H |
Affected products
- Linux Linux
- linux linux_kernel
Classification
- Weakness
-
- CWE-400 Uncontrolled Resource Consumption
- Technology feeds
References
-
git.kernel.org
/stable/c/ab2c2f5d9576112ad22cfd3798071cb74693b1f5
patch
-
git.kernel.org
/stable/c/82e25cc1c2e93c3023da98be282322fc08b61ffb
patch
-
git.kernel.org
/stable/c/f8730d6335e5f43d09151fca1f0f41922209a264
patch
-
git.kernel.org
/stable/c/83d3c5e309611ef593e2fcb78444fc8ceedf9bac
patch
-
git.kernel.org
/stable/c/b54478d20375874aeee257744dedfd3e413432ff
patch
-
git.kernel.org
/stable/c/a75afe480d4349c524d9c659b1a5a544dbc39a98
patch
-
git.kernel.org
/stable/c/4f3a3bce428fb439c66a578adc447afce7b4a750
patch
-
git.kernel.org
/stable/c/caa9af2e27c275e089d702cfbaaece3b42bca31b
patch
-
git.kernel.org
/stable/c/3d75b8aa5c29058a512db29da7cbee8052724157
patch
-
lists.debian.org
/debian-lts-announce/2024/06/msg00017.html
mailing-list, third-party-advisory
-
lists.debian.org
/debian-lts-announce/2024/06/msg00020.html
mailing-list, third-party-advisory
Sources
- CVE List CVE-2024-26976
- NVD CVE-2024-26976
Fencer Vulns keeps one entry per vulnerability: the CVE id wins, then GHSA, and records that alias each other are merged, except that two CVEs always keep separate entries. The same data is available as JSON.