CVE-2024-40953: KVM: Fix a data race on last_boosted_vcpu in kvm_vcpu_on_spin()
In the Linux kernel, the following vulnerability has been resolved:
KVM: Fix a data race on lastboostedvcpu in kvmvcpuonspin()
Use {READ,WRITE}ONCE() to access kvm->lastboostedvcpu to ensure the loads and stores are atomic. In the extremely unlikely scenario the compiler tears the stores, it's theoretically possible for KVM to attempt to get a vCPU using an out-of-bounds index, e.g. if the write is split into multiple 8-bit stores, and is paired with a 32-bit load on a VM with 257 vCPUs:
CPU0 CPU1 lastboostedvcpu = 0xff;
(lastboostedvcpu = 0x100) lastboostedvcpu[15:8] = 0x01; i = (lastboostedvcpu = 0x1ff) lastboostedvcpu[7:0] = 0x00;
vcpu = kvm->vcpuarray[0x1ff];
As detected by KCSAN:
BUG: KCSAN: data-race in kvmvcpuonspin [kvm] / kvmvcpuonspin [kvm]
write to 0xffffc90025a92344 of 4 bytes by task 4340 on cpu 16: kvmvcpuonspin (arch/x86/kvm/../../../virt/kvm/kvmmain.c:4112) kvm handlepause (arch/x86/kvm/vmx/vmx.c:5929) kvmintel vmxhandleexit (arch/x86/kvm/vmx/vmx.c:? arch/x86/kvm/vmx/vmx.c:6606) kvmintel vcpurun (arch/x86/kvm/x86.c:11107 arch/x86/kvm/x86.c:11211) kvm kvmarchvcpuioctlrun (arch/x86/kvm/x86.c:?) kvm kvmvcpuioctl (arch/x86/kvm/../../../virt/kvm/kvmmain.c:?) kvm sesysioctl (fs/ioctl.c:52 fs/ioctl.c:904 fs/ioctl.c:890) x64sysioctl (fs/ioctl.c:890) x64syscall (arch/x86/entry/syscall64.c:33) dosyscall64 (arch/x86/entry/common.c:?) entrySYSCALL64afterhwframe (arch/x86/entry/entry64.S:130)
read to 0xffffc90025a92344 of 4 bytes by task 4342 on cpu 4: kvmvcpuonspin (arch/x86/kvm/../../../virt/kvm/kvmmain.c:4069) kvm handlepause (arch/x86/kvm/vmx/vmx.c:5929) kvmintel vmxhandleexit (arch/x86/kvm/vmx/vmx.c:? arch/x86/kvm/vmx/vmx.c:6606) kvmintel vcpurun (arch/x86/kvm/x86.c:11107 arch/x86/kvm/x86.c:11211) kvm kvmarchvcpuioctlrun (arch/x86/kvm/x86.c:?) kvm kvmvcpuioctl (arch/x86/kvm/../../../virt/kvm/kvmmain.c:?) kvm sesysioctl (fs/ioctl.c:52 fs/ioctl.c:904 fs/ioctl.c:890) x64sysioctl (fs/ioctl.c:890) x64syscall (arch/x86/entry/syscall64.c:33) dosyscall64 (arch/x86/entry/common.c:?) entrySYSCALL64afterhwframe (arch/x86/entry/entry64.S:130)
value changed: 0x00000012 -> 0x00000000
Other sources
This CVE was automatically created from a reference found in an email or other text. If you are reading this, then this CVE entry is probably erroneous, since this text should be replaced by the official CVE description automatically.
— Launchpad
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
debian/linuxto a version that resolves this vulnerability.Fixed in 5.10.234-1Fixed in 6.1.129-1Fixed in 6.1.135-1Fixed in 6.12.25-1 - Upgrade
Upgrade
debian/linux-6.1to a version that resolves this vulnerability.Fixed in 6.1.129-1~deb11u1
Event History
Frequently Asked Questions
What is the severity of CVE-2024-40953?
CVE-2024-40953 has been classified with a low severity due to the unlikely conditions under which the vulnerability could be exploited.
How do I fix CVE-2024-40953?
To fix CVE-2024-40953, update to the recommended Linux kernel versions provided in the advisory, specifically 6.1.123-1, 6.1.119-1, or 6.12.11-1.
Which systems are affected by CVE-2024-40953?
CVE-2024-40953 affects certain versions of the Linux kernel, specifically versions up to 5.10.226-1.
What is the nature of the vulnerability in CVE-2024-40953?
CVE-2024-40953 concerns a data race condition in the KVM module on Linux, affecting the atomicity of accessing the last_boosted_vcpu variable.
Can CVE-2024-40953 be exploited remotely?
CVE-2024-40953 does not allow for direct remote exploitation as it requires specific conditions that are difficult to achieve.