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---
CVSS Details
- CVSS 3.1 Base Score: 7.8
- CVSS 3.1 Vector: (CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H)
Covered by Rapid7
| Product | Vendor Advisory | Solution File | Added | Published |
|---|---|---|---|---|
| Alma_linux | — | Upgrade kernel-rt-debug-develUpgrade kernel-modulesUpgrade kernel-rt-coreUpgrade kernel-debug-develUpgrade kernel-rt-debug-modules-extraUpgrade kernel-develUpgrade perfUpgrade kernel-abi-stablelistsUpgrade kernel-zfcpdump-develUpgrade kernel-headersUpgrade kernel-rtUpgrade kernel-docUpgrade kernel-zfcpdump-coreUpgrade kernel-tools-libs-develUpgrade python3-perfUpgrade kernel-rt-modulesUpgrade kernel-toolsUpgrade kernel-rt-debug-coreUpgrade kernel-tools-libsUpgrade bpftoolUpgrade kernel-modules-extraUpgrade kernel-rt-develUpgrade kernel-cross-headersUpgrade kernel-debug-modules-extraUpgrade kernel-debug-modulesUpgrade kernel-debug-coreUpgrade kernel-rt-debugUpgrade kernel-zfcpdumpUpgrade kernel-zfcpdump-modules-extraUpgrade kernel-coreUpgrade kernel-debugUpgrade kernelUpgrade kernel-zfcpdump-modulesUpgrade kernel-rt-debug-modulesUpgrade kernel-rt-modules-extra | Nov 7, 2024 | May 1, 2024 |
| Amazon Linux Ami 2 | — | Upgrade kernel-livepatch-5.15.156-102.160Upgrade kernel-debuginfoUpgrade kernel-debuginfo-common-aarch64Upgrade kernel-tools-debuginfoUpgrade bpftoolUpgrade kernel-develUpgrade kernel-tools-develUpgrade kernel-livepatch-5.10.215-203.850Upgrade bpftool-debuginfoUpgrade perfUpgrade python-perf-debuginfoUpgrade kernel-toolsUpgrade kernel-debuginfo-common-x86_64Upgrade perf-debuginfoUpgrade python-perfUpgrade kernelUpgrade kernel-livepatch-4.14.345-262.561Upgrade kernel-headers | Aug 14, 2024 | May 1, 2024 |
| Amazon_linux | — | Upgrade kernel | Aug 1, 2024 | May 1, 2024 |
| Amazon_linux_2023 | — | Upgrade kernel-libbpf-staticUpgrade kernel-develUpgrade kernel-libbpfUpgrade kernelUpgrade kernel-debuginfoUpgrade bpftool-debuginfoUpgrade kernel-libbpf-develUpgrade kernel-debuginfo-common-x86_64Upgrade kernel-tools-debuginfoUpgrade kernel-modules-extraUpgrade python3-perf-debuginfoUpgrade bpftoolUpgrade kernel-toolsUpgrade perf-debuginfoUpgrade kernel-debuginfo-common-aarch64Upgrade kernel-modules-extra-commonUpgrade python3-perfUpgrade kernel-headersUpgrade perfUpgrade kernel-livepatch-6.1.84-99.169Upgrade kernel-tools-devel | Feb 17, 2025 | May 1, 2024 |
| Debian | — | Upgrade linux | May 8, 2024 | May 1, 2024 |
| Huawei Euleros 2_0_sp10 | — | Upgrade kernel-toolsUpgrade kernel-tools-libsUpgrade python3-perfUpgrade kernelUpgrade kernel-abi-stablelists | Jul 16, 2024 | May 1, 2024 |
| Huawei Euleros 2_0_sp11 | — | Upgrade kernel-abi-stablelistsUpgrade python3-perfUpgrade kernelUpgrade kernel-toolsUpgrade kernel-tools-libsUpgrade bpftool | Oct 8, 2024 | May 1, 2024 |
| Huawei Euleros 2_0_sp12 | — | Upgrade python3-perfUpgrade bpftoolUpgrade kernel-tools-libsUpgrade kernelUpgrade kernel-abi-stablelistsUpgrade kernel-tools | Oct 8, 2024 | May 1, 2024 |
| Huawei Euleros 2_0_sp8 | — | Upgrade kernel-headersUpgrade kernel-tools-libsUpgrade kernelUpgrade python-perfUpgrade bpftoolUpgrade kernel-toolsUpgrade kernel-develUpgrade python3-perfUpgrade perf | Jan 21, 2025 | May 1, 2024 |
| Huawei Euleros 2_0_sp9 | — | Upgrade python3-perfUpgrade kernel-toolsUpgrade kernel-tools-libsUpgrade kernel | Jul 17, 2024 | May 1, 2024 |
| Oracle_linux | — | Upgrade kernel | Nov 11, 2024 | May 1, 2024 |
| Redhat_linux | — | No solution existsUpgrade kernel-rtUpgrade kernel | Nov 6, 2024 | May 1, 2024 |
| Rocky_linux | — | Upgrade kernel-rt-debug-modules-extraUpgrade kernel-tools-libs-develUpgrade kernel-rt-develUpgrade kernel-rt-debug-develUpgrade kernel-debug-develUpgrade perf-debuginfoUpgrade kernelUpgrade kernel-rt-kvmUpgrade kernel-rt-modules-extraUpgrade python3-perfUpgrade kernel-debuginfoUpgrade kernel-rt-debug-kvmUpgrade perfUpgrade kernel-tools-debuginfoUpgrade bpftoolUpgrade kernel-debugUpgrade kernel-develUpgrade kernel-debug-coreUpgrade kernel-rt-coreUpgrade kernel-rt-debugUpgrade kernel-cross-headersUpgrade kernel-coreUpgrade kernel-debuginfo-common-x86_64Upgrade kernel-toolsUpgrade kernel-modulesUpgrade kernel-debug-modules-extraUpgrade kernel-debug-debuginfoUpgrade kernel-modules-extraUpgrade python3-perf-debuginfoUpgrade kernel-rt-modulesUpgrade kernel-debug-modulesUpgrade kernel-tools-libsUpgrade kernel-rt-debug-debuginfoUpgrade kernel-rt-debug-modulesUpgrade kernel-rt-debug-coreUpgrade kernel-rtUpgrade kernel-headersUpgrade bpftool-debuginfoUpgrade kernel-rt-debuginfoUpgrade kernel-rt-debuginfo-common-x86_64 | Nov 19, 2024 | May 1, 2024 |
| Suse | — | Upgrade dtb-caviumUpgrade dtb-qcomUpgrade kernel-rt-extraUpgrade kernel-default-optionalUpgrade kernel-source-vanillaUpgrade kselftests-kmp-64kbUpgrade ocfs2-kmp-azureUpgrade kernel-rt_debug-livepatch-develUpgrade kernel-rt_debug-develUpgrade dtb-alteraUpgrade kernel-syms-azureUpgrade kernel-default-livepatchUpgrade kernel-devel-rtUpgrade dtb-mediatekUpgrade kernel-rt-develUpgrade dtb-allwinnerUpgrade dtb-amazonUpgrade dtb-renesasUpgrade gfs2-kmp-azureUpgrade gfs2-kmp-defaultUpgrade dtb-exynosUpgrade dlm-kmp-64kbUpgrade kernel-obs-buildUpgrade kernel-rt-livepatchUpgrade kselftests-kmp-azureUpgrade dtb-rockchipUpgrade kernel-debug-vdsoUpgrade kernel-source-azureUpgrade dtb-xilinxUpgrade dtb-sprdUpgrade reiserfs-kmp-defaultUpgrade kernel-default-develUpgrade kernel-rtUpgrade dtb-hisiliconUpgrade kernel-azure-optionalUpgrade kernel-default-base-rebuildUpgrade ocfs2-kmp-64kbUpgrade reiserfs-kmp-azureUpgrade cluster-md-kmp-64kbUpgrade kernel-64kbUpgrade dtb-freescaleUpgrade kernel-debugUpgrade kernel-64kb-extraUpgrade kernel-64kb-develUpgrade kernel-sourceUpgrade dlm-kmp-rtUpgrade ocfs2-kmp-defaultUpgrade kernel-default-vdsoUpgrade cluster-md-kmp-azureUpgrade cluster-md-kmp-rtUpgrade dtb-lgUpgrade kernel-azureUpgrade kernel-develUpgrade dtb-nvidiaUpgrade kernel-64kb-optionalUpgrade kernel-syms-rtUpgrade kselftests-kmp-defaultUpgrade reiserfs-kmp-rtUpgrade dtb-marvellUpgrade dlm-kmp-defaultUpgrade kernel-symsUpgrade kernel-rt_debug-vdsoUpgrade kernel-devel-azureUpgrade dtb-amdUpgrade reiserfs-kmp-64kbUpgrade kernel-64kb-livepatch-develUpgrade kernel-zfcpdumpUpgrade kernel-debug-livepatch-develUpgrade dtb-socionextUpgrade dtb-amlogicUpgrade dtb-apmUpgrade kernel-default-livepatch-develUpgrade kernel-azure-develUpgrade kernel-rt-livepatch-develUpgrade kernel-rt_debugUpgrade kernel-rt-vdsoUpgrade kernel-default-manUpgrade ocfs2-kmp-rtUpgrade kernel-defaultUpgrade kselftests-kmp-rtUpgrade kernel-kvmsmallUpgrade kernel-default-baseUpgrade dlm-kmp-azureUpgrade kernel-docs-htmlUpgrade kernel-debug-develUpgrade kernel-azure-vdsoUpgrade gfs2-kmp-rtUpgrade kernel-default-extraUpgrade gfs2-kmp-64kbUpgrade dtb-broadcomUpgrade kernel-source-rtUpgrade kernel-obs-qaUpgrade kernel-kvmsmall-vdsoUpgrade kernel-kvmsmall-develUpgrade dtb-appleUpgrade kernel-azure-livepatch-develUpgrade kernel-macrosUpgrade kernel-kvmsmall-livepatch-develUpgrade kernel-docsUpgrade kernel-azure-extraUpgrade dtb-armUpgrade kernel-rt-optionalUpgrade cluster-md-kmp-default | Aug 14, 2024 | May 1, 2024 |
| Ubuntu | — | Upgrade linux-image-6.8.0-1009-awsUpgrade linux-image-generic-hwe-24.04Upgrade linux-image-gkeop-5.4Upgrade linux-image-5.15.0-1058-ibmUpgrade linux-image-virtual-hwe-18.04Upgrade linux-image-virtual-hwe-24.04Upgrade linux-image-xilinx-zynqmpUpgrade linux-image-5.15.0-116-genericUpgrade linux-image-oemUpgrade linux-image-gkeop-5.15Upgrade linux-image-generic-hwe-18.04Upgrade linux-image-6.8.0-1008-azure-fdeUpgrade linux-image-oem-24.04aUpgrade linux-image-bluefieldUpgrade linux-image-raspi2Upgrade linux-image-intelUpgrade linux-image-5.15.0-1035-xilinx-zynqmpUpgrade linux-image-5.15.0-116-generic-64kUpgrade linux-image-generic-lpae-hwe-20.04Upgrade linux-image-5.4.0-1088-bluefieldUpgrade linux-image-oracleUpgrade linux-image-6.8.0-1006-oracleUpgrade linux-image-5.15.0-1058-raspiUpgrade linux-image-intel-iotgUpgrade linux-image-6.8.0-1004-gkeUpgrade linux-image-azure-lts-22.04Upgrade linux-image-5.15.0-1068-azureUpgrade linux-image-oem-20.04Upgrade linux-image-gcpUpgrade linux-image-6.8.0-35-lowlatencyUpgrade linux-image-6.8.0-1006-oemUpgrade linux-image-snapdragon-hwe-18.04Upgrade linux-image-5.4.0-1133-azureUpgrade linux-image-genericUpgrade linux-image-generic-64k-hwe-20.04Upgrade linux-image-gkeopUpgrade linux-image-oracle-64kUpgrade linux-image-oem-24.04Upgrade linux-image-lowlatency-64kUpgrade linux-image-5.15.0-1068-azure-fdeUpgrade linux-image-oem-20.04dUpgrade linux-image-raspi-hwe-18.04Upgrade linux-image-oem-osp1Upgrade linux-image-6.8.0-35-lowlatency-64kUpgrade linux-image-azure-fde-lts-22.04Upgrade linux-image-oracle-lts-22.04Upgrade linux-image-azure-cvmUpgrade linux-image-gcp-lts-20.04Upgrade linux-image-5.15.0-1060-nvidia-lowlatencyUpgrade linux-image-virtualUpgrade linux-image-gkeUpgrade linux-image-generic-lpaeUpgrade linux-image-lowlatency-hwe-18.04Upgrade linux-image-5.4.0-1127-oracleUpgrade linux-image-5.15.0-1065-gcpUpgrade linux-image-azure-lts-20.04Upgrade linux-image-5.15.0-1060-intel-iotgUpgrade linux-image-oem-20.04cUpgrade linux-image-5.4.0-189-genericUpgrade linux-image-6.8.0-1006-oracle-64kUpgrade linux-image-6.8.0-1008-azureUpgrade linux-image-oracle-lts-20.04Upgrade linux-image-5.4.0-1040-iotUpgrade linux-image-generic-hwe-20.04Upgrade linux-image-lowlatencyUpgrade linux-image-5.4.0-1132-gcpUpgrade linux-image-5.15.0-1062-gkeUpgrade linux-image-ibm-lts-20.04Upgrade linux-image-5.15.0-1065-awsUpgrade linux-image-nvidia-lowlatencyUpgrade linux-image-kvmUpgrade linux-image-5.15.0-1064-gcpUpgrade linux-image-5.15.0-116-generic-lpaeUpgrade linux-image-5.15.0-1062-kvmUpgrade linux-image-generic-64kUpgrade linux-image-raspiUpgrade linux-image-virtual-hwe-20.04Upgrade linux-image-nvidiaUpgrade linux-image-5.4.0-189-lowlatencyUpgrade linux-image-aws-lts-20.04Upgrade linux-image-ibm-classicUpgrade linux-image-6.8.0-35-genericUpgrade linux-image-awsUpgrade linux-image-5.15.0-116-lowlatencyUpgrade linux-image-5.4.0-1116-kvmUpgrade linux-image-5.4.0-1095-gkeopUpgrade linux-image-5.4.0-1075-ibmUpgrade linux-image-lowlatency-hwe-20.04Upgrade linux-image-ibm-lts-24.04Upgrade linux-image-gke-5.15Upgrade linux-image-5.4.0-1047-xilinx-zynqmpUpgrade linux-image-6.8.0-35-generic-64kUpgrade linux-image-6.8.0-1008-gcpUpgrade linux-image-azure-fdeUpgrade linux-image-generic-64k-hwe-24.04Upgrade linux-image-5.4.0-189-generic-lpaeUpgrade linux-image-5.15.0-116-lowlatency-64kUpgrade linux-image-5.4.0-1128-awsUpgrade linux-image-5.15.0-1048-gkeopUpgrade linux-image-6.8.0-1006-ibmUpgrade linux-image-ibmUpgrade linux-image-5.15.0-1060-nvidiaUpgrade linux-image-lowlatency-64k-hwe-20.04Upgrade linux-image-oem-20.04bUpgrade linux-image-6.8.0-1005-raspiUpgrade linux-image-raspi-nolpaeUpgrade linux-image-azureUpgrade linux-image-gcp-lts-22.04Upgrade linux-image-5.15.0-1063-oracleUpgrade linux-image-5.4.0-1112-raspiUpgrade linux-image-aws-lts-22.04 | Jul 1, 2024 | May 1, 2024 |
| Vmware Photon_os | — | Use 'tdnf update' to upgrade all packages to the latest version. | Jan 20, 2025 | May 1, 2024 |
Prioritise with Active Threat Intelligence
With curated Threat Intelligence, you can see which vulnerabilities truly put you at risk, prioritize what matters most, and act before attackers do.
Explore Intelligence Hub