[PATCH 1/2] kvm: fix kvm_ioctl_create_device() reference counting (CVE-2019-6974)

Tyler Hicks tyhicks at canonical.com
Mon Feb 25 11:49:47 UTC 2019


From: Jann Horn <jannh at google.com>

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: 852b6d57dc7f ("kvm: add device control API")
Cc: stable at kernel.org
Signed-off-by: Jann Horn <jannh at google.com>
Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

CVE-2019-6974

(backported from commit cfa39381173d5f969daf43582c95ad679189cbc9)
[tyhicks: Backport to 4.4:
 - Contextual changes due to missing upstream commit a28ebea2adc4]
Signed-off-by: Tyler Hicks <tyhicks at canonical.com>
---
 virt/kvm/kvm_main.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 9d2277f69ce6..5f35e6c1c2d1 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -2328,14 +2328,15 @@ static int kvm_ioctl_create_device(struct kvm *kvm,
 		return ret;
 	}
 
+	kvm_get_kvm(kvm);
 	ret = anon_inode_getfd(ops->name, &kvm_device_fops, dev, O_RDWR | O_CLOEXEC);
 	if (ret < 0) {
+		kvm_put_kvm(kvm);
 		ops->destroy(dev);
 		return ret;
 	}
 
 	list_add(&dev->vm_node, &kvm->devices);
-	kvm_get_kvm(kvm);
 	cd->fd = ret;
 	return 0;
 }
-- 
2.7.4




More information about the kernel-team mailing list