In the Linux kernel, the following vulnerability has been resolved:
KVM: VMX: Always clear vmx->fail on emulation_required
Revert a relatively recent change that set vmx->fail if the vCPU is in L2 and emulation_required is true, as that behavior is completely bogus. Setting vmx->fail and synthesizing a VM-Exit is contradictory and wrong:
(a) it's impossible to have both a VM-Fail and VM-Exit (b) vmcs.EXITREASON is not modified on VM-Fail (c) emulationrequired refers to guest state and guest state checks are always VM-Exits, not VM-Fails.
For KVM specifically, emulation_required is handled before nested exits in _vmxhandleexit(), thus setting vmx->fail has no immediate effect, i.e. KVM calls into handleinvalidgueststate() and vmx->fail is ignored. Setting vmx->fail can ultimately result in a WARN in nestedvmxvmexit() firing when tearing down the VM as KVM never expects vmx->fail to be set when L2 is active, KVM always reflects those errors into L1.
------------[ cut here ]------------ WARNING: CPU: 0 PID: 21158 at arch/x86/kvm/vmx/nested.c:4548 nestedvmxvmexit+0x16bd/0x17e0 arch/x86/kvm/vmx/nested.c:4547 Modules linked in: CPU: 0 PID: 21158 Comm: syz-executor.1 Not tainted 5.16.0-rc3-syzkaller #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 RIP: 0010:nestedvmxvmexit+0x16bd/0x17e0 arch/x86/kvm/vmx/nested.c:4547 Code: <0f> 0b e9 2e f8 ff ff e8 57 b3 5d 00 0f 0b e9 00 f1 ff ff 89 e9 80 Call Trace: vmxleavenested arch/x86/kvm/vmx/nested.c:6220 [inline] nestedvmxfreevcpu+0x83/0xc0 arch/x86/kvm/vmx/nested.c:330 vmxfreevcpu+0x11f/0x2a0 arch/x86/kvm/vmx/vmx.c:6799 kvmarchvcpudestroy+0x6b/0x240 arch/x86/kvm/x86.c:10989 kvmvcpudestroy+0x29/0x90 arch/x86/kvm/../../../virt/kvm/kvmmain.c:441 kvmfreevcpus arch/x86/kvm/x86.c:11426 [inline] kvmarchdestroyvm+0x3ef/0x6b0 arch/x86/kvm/x86.c:11545 kvmdestroyvm arch/x86/kvm/../../../virt/kvm/kvmmain.c:1189 [inline] kvmputkvm+0x751/0xe40 arch/x86/kvm/../../../virt/kvm/kvmmain.c:1220 kvmvcpurelease+0x53/0x60 arch/x86/kvm/../../../virt/kvm/kvm_main.c:3489 __fput+0x3fc/0x870 fs/filetable.c:280 taskworkrun+0x146/0x1c0 kernel/taskwork.c:164 exittaskwork include/linux/taskwork.h:32 [inline] doexit+0x705/0x24f0 kernel/exit.c:832 dogroupexit+0x168/0x2d0 kernel/exit.c:929 getsignal+0x1740/0x2120 kernel/signal.c:2852 archdosignalorrestart+0x9c/0x730 arch/x86/kernel/signal.c:868 handlesignalwork kernel/entry/common.c:148 [inline] exittousermodeloop kernel/entry/common.c:172 [inline] exittousermode_prepare+0x191/0x220 kernel/entry/common.c:207 _syscallexittousermodework kernel/entry/common.c:289 [inline] syscallexittousermode+0x2e/0x70 kernel/entry/common.c:300 dosyscall64+0x53/0xd0 arch/x86/entry/common.c:86 entrySYSCALL64afterhwframe+0x44/0xae
"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2021-47092.json"
[
{
"events": [
{
"introduced": "5.15"
},
{
"fixed": "5.15.12"
}
]
},
{
"events": [
{
"introduced": "0"
},
{
"last_affected": "5.16-rc1"
}
]
},
{
"events": [
{
"introduced": "0"
},
{
"last_affected": "5.16-rc2"
}
]
},
{
"events": [
{
"introduced": "0"
},
{
"last_affected": "5.16-rc3"
}
]
},
{
"events": [
{
"introduced": "0"
},
{
"last_affected": "5.16-rc4"
}
]
},
{
"events": [
{
"introduced": "0"
},
{
"last_affected": "5.16-rc5"
}
]
},
{
"events": [
{
"introduced": "0"
},
{
"last_affected": "5.16-rc6"
}
]
}
]