Skip to content

Commit cfa3938

Browse files
thejhbonzini
authored andcommitted
kvm: fix kvm_ioctl_create_device() reference counting (CVE-2019-6974)
kvm_ioctl_create_device() does the following: 1. creates a device that holds a reference to the VM object (with a borrowed reference, the VM's refcount has not been bumped yet) 2. initializes the device 3. transfers the reference to the device to the caller's file descriptor table 4. calls kvm_get_kvm() to turn the borrowed reference to the VM into a real reference The ownership transfer in step 3 must not happen before the reference to the VM becomes a proper, non-borrowed reference, which only happens in step 4. After step 3, an attacker can close the file descriptor and drop the borrowed reference, which can cause the refcount of the kvm object to drop to zero. This means that we need to grab a reference for the device before anon_inode_getfd(), otherwise the VM can disappear from under us. Fixes: 852b6d5 ("kvm: add device control API") Cc: stable@kernel.org Signed-off-by: Jann Horn <jannh@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
1 parent 8834f56 commit cfa3938

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

virt/kvm/kvm_main.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3000,16 +3000,17 @@ static int kvm_ioctl_create_device(struct kvm *kvm,
30003000
if (ops->init)
30013001
ops->init(dev);
30023002

3003+
kvm_get_kvm(kvm);
30033004
ret = anon_inode_getfd(ops->name, &kvm_device_fops, dev, O_RDWR | O_CLOEXEC);
30043005
if (ret < 0) {
3006+
kvm_put_kvm(kvm);
30053007
mutex_lock(&kvm->lock);
30063008
list_del(&dev->vm_node);
30073009
mutex_unlock(&kvm->lock);
30083010
ops->destroy(dev);
30093011
return ret;
30103012
}
30113013

3012-
kvm_get_kvm(kvm);
30133014
cd->fd = ret;
30143015
return 0;
30153016
}

0 commit comments

Comments
 (0)