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-toolsUpgrade kernel-headersUpgrade kernel-develUpgrade kernel-rt-modulesUpgrade kernel-rtUpgrade kernel-rt-debug-develUpgrade kernel-docUpgrade kernel-zfcpdump-coreUpgrade kernel-tools-libs-develUpgrade perfUpgrade kernel-zfcpdump-develUpgrade kernel-modulesUpgrade kernel-debug-develUpgrade kernel-rt-debug-modules-extraUpgrade python3-perfUpgrade kernel-abi-stablelistsUpgrade kernel-rt-coreUpgrade kernel-rt-debugUpgrade kernelUpgrade kernel-debug-modulesUpgrade kernel-coreUpgrade kernel-rt-debug-modulesUpgrade kernel-modules-extraUpgrade kernel-debugUpgrade kernel-cross-headersUpgrade kernel-rt-debug-coreUpgrade kernel-rt-develUpgrade bpftoolUpgrade kernel-zfcpdump-modulesUpgrade kernel-debug-modules-extraUpgrade kernel-debug-coreUpgrade kernel-zfcpdump-modules-extraUpgrade kernel-zfcpdumpUpgrade kernel-tools-libsUpgrade kernel-rt-modules-extra | Nov 7, 2024 | May 1, 2024 |
| Amazon Linux Ami 2 | — | Upgrade kernel-livepatch-5.15.156-102.160Upgrade kernel-livepatch-5.10.215-203.850Upgrade kernel-tools-debuginfoUpgrade kernel-develUpgrade kernel-debuginfo-common-aarch64Upgrade kernel-tools-develUpgrade bpftool-debuginfoUpgrade bpftoolUpgrade kernel-debuginfoUpgrade perfUpgrade python-perf-debuginfoUpgrade kernel-debuginfo-common-x86_64Upgrade kernel-headersUpgrade kernel-livepatch-4.14.345-262.561Upgrade kernel-toolsUpgrade kernelUpgrade python-perfUpgrade perf-debuginfo | Aug 14, 2024 | May 1, 2024 |
| Amazon_linux | — | Upgrade kernel | Aug 1, 2024 | May 1, 2024 |
| Amazon_linux_2023 | — | Upgrade kernel-debuginfoUpgrade kernel-tools-debuginfoUpgrade kernel-libbpfUpgrade kernel-libbpf-develUpgrade kernelUpgrade kernel-develUpgrade bpftoolUpgrade python3-perf-debuginfoUpgrade kernel-modules-extraUpgrade bpftool-debuginfoUpgrade kernel-debuginfo-common-x86_64Upgrade kernel-libbpf-staticUpgrade python3-perfUpgrade kernel-debuginfo-common-aarch64Upgrade kernel-livepatch-6.1.84-99.169Upgrade perfUpgrade kernel-headersUpgrade kernel-modules-extra-commonUpgrade kernel-tools-develUpgrade kernel-toolsUpgrade perf-debuginfo | Feb 17, 2025 | May 1, 2024 |
| Debian | — | Upgrade linux | May 8, 2024 | May 1, 2024 |
| Huawei Euleros 2_0_sp10 | — | Upgrade kernel-tools-libsUpgrade kernel-toolsUpgrade python3-perfUpgrade kernel-abi-stablelistsUpgrade kernel | Jul 16, 2024 | May 1, 2024 |
| Huawei Euleros 2_0_sp11 | — | Upgrade kernel-toolsUpgrade kernelUpgrade kernel-tools-libsUpgrade bpftoolUpgrade python3-perfUpgrade kernel-abi-stablelists | Oct 8, 2024 | May 1, 2024 |
| Huawei Euleros 2_0_sp12 | — | Upgrade bpftoolUpgrade python3-perfUpgrade kernelUpgrade kernel-abi-stablelistsUpgrade kernel-toolsUpgrade kernel-tools-libs | Oct 8, 2024 | May 1, 2024 |
| Huawei Euleros 2_0_sp8 | — | Upgrade python3-perfUpgrade kernel-develUpgrade kernel-toolsUpgrade bpftoolUpgrade perfUpgrade python-perfUpgrade kernelUpgrade kernel-tools-libsUpgrade kernel-headers | Jan 21, 2025 | May 1, 2024 |
| Huawei Euleros 2_0_sp9 | — | Upgrade kernel-tools-libsUpgrade kernelUpgrade kernel-toolsUpgrade python3-perf | Jul 17, 2024 | May 1, 2024 |
| Oracle_linux | — | Upgrade kernel | Nov 11, 2024 | May 1, 2024 |
| Redhat_linux | — | Upgrade kernel-rtNo solution existsUpgrade kernel | Nov 6, 2024 | May 1, 2024 |
| Rocky_linux | — | Upgrade kernel-debug-modulesUpgrade kernel-modules-extraUpgrade kernel-tools-libsUpgrade kernel-rt-debuginfoUpgrade python3-perf-debuginfoUpgrade kernel-coreUpgrade kernel-rt-debuginfo-common-x86_64Upgrade kernel-debuginfo-common-x86_64Upgrade kernel-rt-modulesUpgrade kernel-toolsUpgrade kernel-debug-modules-extraUpgrade kernel-rtUpgrade kernel-rt-debug-coreUpgrade bpftool-debuginfoUpgrade kernel-rt-debug-modulesUpgrade kernel-headersUpgrade kernel-rt-debug-debuginfoUpgrade kernel-modulesUpgrade kernel-debug-debuginfoUpgrade kernel-debugUpgrade bpftoolUpgrade python3-perfUpgrade perfUpgrade kernel-tools-debuginfoUpgrade kernel-rt-debug-kvmUpgrade kernel-cross-headersUpgrade kernel-rt-debugUpgrade kernel-rt-modules-extraUpgrade perf-debuginfoUpgrade kernel-rt-kvmUpgrade kernelUpgrade kernel-develUpgrade kernel-rt-develUpgrade kernel-rt-debug-modules-extraUpgrade kernel-debug-develUpgrade kernel-tools-libs-develUpgrade kernel-debuginfoUpgrade kernel-rt-debug-develUpgrade kernel-rt-coreUpgrade kernel-debug-core | Nov 19, 2024 | May 1, 2024 |
| Suse | — | Upgrade kernel-zfcpdumpUpgrade kernel-source-rtUpgrade kernel-kvmsmall-develUpgrade dtb-amdUpgrade kernel-devel-azureUpgrade reiserfs-kmp-64kbUpgrade kernel-default-extraUpgrade kernel-kvmsmall-vdsoUpgrade kernel-debug-develUpgrade kernel-default-baseUpgrade kernel-azure-vdsoUpgrade kernel-docs-htmlUpgrade ocfs2-kmp-rtUpgrade kernel-defaultUpgrade gfs2-kmp-rtUpgrade kernel-kvmsmallUpgrade kernel-rt_debugUpgrade kernel-syms-rtUpgrade kernel-rt-vdsoUpgrade kernel-rt-livepatch-develUpgrade kernel-azure-develUpgrade kernel-default-manUpgrade kernel-default-livepatch-develUpgrade kselftests-kmp-rtUpgrade kernel-docsUpgrade kernel-macrosUpgrade kernel-azure-livepatch-develUpgrade dtb-apmUpgrade kernel-azure-extraUpgrade kernel-kvmsmall-livepatch-develUpgrade dtb-armUpgrade kernel-symsUpgrade kernel-64kb-optionalUpgrade dlm-kmp-azureUpgrade kernel-obs-qaUpgrade dtb-marvellUpgrade kernel-64kb-livepatch-develUpgrade dtb-broadcomUpgrade dtb-appleUpgrade dlm-kmp-defaultUpgrade cluster-md-kmp-defaultUpgrade kselftests-kmp-defaultUpgrade gfs2-kmp-64kbUpgrade reiserfs-kmp-rtUpgrade kernel-rt_debug-vdsoUpgrade dtb-amlogicUpgrade kernel-rt-optionalUpgrade dtb-socionextUpgrade kernel-debug-livepatch-develUpgrade dtb-nvidiaUpgrade kernel-syms-azureUpgrade ocfs2-kmp-defaultUpgrade cluster-md-kmp-64kbUpgrade ocfs2-kmp-64kbUpgrade dtb-exynosUpgrade dtb-amazonUpgrade dtb-caviumUpgrade kselftests-kmp-64kbUpgrade dlm-kmp-rtUpgrade kernel-source-vanillaUpgrade kernel-default-optionalUpgrade kernel-rt-develUpgrade kernel-default-vdsoUpgrade dtb-renesasUpgrade kernel-rt_debug-livepatch-develUpgrade dtb-lgUpgrade kernel-64kb-develUpgrade dtb-alteraUpgrade cluster-md-kmp-rtUpgrade kernel-sourceUpgrade kernel-azureUpgrade dtb-xilinxUpgrade gfs2-kmp-defaultUpgrade gfs2-kmp-azureUpgrade kernel-azure-optionalUpgrade kernel-rt-extraUpgrade dtb-qcomUpgrade kselftests-kmp-azureUpgrade kernel-rt-livepatchUpgrade kernel-debug-vdsoUpgrade kernel-64kb-extraUpgrade dtb-rockchipUpgrade dtb-mediatekUpgrade dlm-kmp-64kbUpgrade kernel-obs-buildUpgrade kernel-devel-rtUpgrade kernel-default-livepatchUpgrade kernel-source-azureUpgrade reiserfs-kmp-defaultUpgrade dtb-sprdUpgrade reiserfs-kmp-azureUpgrade kernel-debugUpgrade kernel-rt_debug-develUpgrade dtb-freescaleUpgrade kernel-default-base-rebuildUpgrade kernel-default-develUpgrade dtb-hisiliconUpgrade kernel-develUpgrade cluster-md-kmp-azureUpgrade dtb-allwinnerUpgrade kernel-64kbUpgrade ocfs2-kmp-azureUpgrade kernel-rt | Aug 14, 2024 | May 1, 2024 |
| Ubuntu | — | Upgrade linux-image-5.15.0-1058-raspiUpgrade linux-image-oem-20.04dUpgrade linux-image-generic-hwe-18.04Upgrade linux-image-xilinx-zynqmpUpgrade linux-image-gkeUpgrade linux-image-oemUpgrade linux-image-5.4.0-1127-oracleUpgrade linux-image-5.15.0-1058-ibmUpgrade linux-image-5.15.0-1068-azureUpgrade linux-image-virtualUpgrade linux-image-oem-20.04cUpgrade linux-image-virtual-hwe-18.04Upgrade linux-image-azure-cvmUpgrade linux-image-azure-lts-22.04Upgrade linux-image-gcp-lts-20.04Upgrade linux-image-gkeopUpgrade linux-image-generic-hwe-24.04Upgrade linux-image-bluefieldUpgrade linux-image-5.4.0-1088-bluefieldUpgrade linux-image-6.8.0-35-lowlatencyUpgrade linux-image-genericUpgrade linux-image-5.4.0-1133-azureUpgrade linux-image-5.15.0-1060-intel-iotgUpgrade linux-image-5.15.0-1065-gcpUpgrade linux-image-6.8.0-1004-gkeUpgrade linux-image-raspi-hwe-18.04Upgrade linux-image-snapdragon-hwe-18.04Upgrade linux-image-oracle-64kUpgrade linux-image-5.15.0-116-genericUpgrade linux-image-6.8.0-1009-awsUpgrade linux-image-5.15.0-116-generic-64kUpgrade linux-image-gkeop-5.4Upgrade linux-image-virtual-hwe-24.04Upgrade linux-image-intel-iotgUpgrade linux-image-generic-lpae-hwe-20.04Upgrade linux-image-6.8.0-1008-azure-fdeUpgrade linux-image-oem-24.04aUpgrade linux-image-azure-fde-lts-22.04Upgrade linux-image-5.15.0-1035-xilinx-zynqmpUpgrade linux-image-gcpUpgrade linux-image-6.8.0-35-lowlatency-64kUpgrade linux-image-lowlatency-64kUpgrade linux-image-raspi2Upgrade linux-image-oracle-lts-22.04Upgrade linux-image-lowlatency-hwe-18.04Upgrade linux-image-generic-64k-hwe-20.04Upgrade linux-image-6.8.0-1006-oemUpgrade linux-image-5.15.0-1060-nvidia-lowlatencyUpgrade linux-image-oem-osp1Upgrade linux-image-intelUpgrade linux-image-gkeop-5.15Upgrade linux-image-oem-20.04Upgrade linux-image-oem-24.04Upgrade linux-image-generic-lpaeUpgrade linux-image-6.8.0-1006-oracleUpgrade linux-image-5.15.0-1068-azure-fdeUpgrade linux-image-azure-lts-20.04Upgrade linux-image-oracleUpgrade linux-image-aws-lts-20.04Upgrade linux-image-5.4.0-1047-xilinx-zynqmpUpgrade linux-image-6.8.0-1008-azureUpgrade linux-image-ibmUpgrade linux-image-azure-fdeUpgrade linux-image-lowlatency-64k-hwe-20.04Upgrade linux-image-5.15.0-116-lowlatency-64kUpgrade linux-image-gke-5.15Upgrade linux-image-generic-64k-hwe-24.04Upgrade linux-image-virtual-hwe-20.04Upgrade linux-image-6.8.0-35-genericUpgrade linux-image-5.15.0-1048-gkeopUpgrade linux-image-lowlatency-hwe-20.04Upgrade linux-image-5.15.0-1064-gcpUpgrade linux-image-nvidiaUpgrade linux-image-nvidia-lowlatencyUpgrade linux-image-generic-hwe-20.04Upgrade linux-image-aws-lts-22.04Upgrade linux-image-6.8.0-1005-raspiUpgrade linux-image-5.4.0-1112-raspiUpgrade linux-image-5.15.0-1063-oracleUpgrade linux-image-kvmUpgrade linux-image-ibm-lts-20.04Upgrade linux-image-raspiUpgrade linux-image-5.4.0-1132-gcpUpgrade linux-image-5.15.0-1062-kvmUpgrade linux-image-5.15.0-1062-gkeUpgrade linux-image-raspi-nolpaeUpgrade linux-image-5.4.0-1040-iotUpgrade linux-image-5.4.0-189-genericUpgrade linux-image-azureUpgrade linux-image-6.8.0-1008-gcpUpgrade linux-image-ibm-classicUpgrade linux-image-5.15.0-1065-awsUpgrade linux-image-5.15.0-116-generic-lpaeUpgrade linux-image-6.8.0-35-generic-64kUpgrade linux-image-generic-64kUpgrade linux-image-gcp-lts-22.04Upgrade linux-image-oracle-lts-20.04Upgrade linux-image-ibm-lts-24.04Upgrade linux-image-5.15.0-116-lowlatencyUpgrade linux-image-lowlatencyUpgrade linux-image-5.4.0-1128-awsUpgrade linux-image-6.8.0-1006-oracle-64kUpgrade linux-image-oem-20.04bUpgrade linux-image-5.4.0-189-generic-lpaeUpgrade linux-image-awsUpgrade linux-image-5.4.0-1095-gkeopUpgrade linux-image-5.4.0-189-lowlatencyUpgrade linux-image-5.4.0-1075-ibmUpgrade linux-image-5.4.0-1116-kvmUpgrade linux-image-5.15.0-1060-nvidiaUpgrade linux-image-6.8.0-1006-ibm | 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