]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commit - virt/kvm/kvm_main.c
kvm: fix kvm_ioctl_create_device() reference counting (CVE-2019-6974)
authorJann Horn <jannh@google.com>
Mon, 25 Feb 2019 11:48:05 +0000 (11:48 +0000)
committerKhalid Elmously <khalid.elmously@canonical.com>
Thu, 28 Feb 2019 23:09:26 +0000 (18:09 -0500)
commitf650825fca73fb7de5f2d07d420a3fb89f467fb1
tree4a5c2a5f01e0a9c4492364bc0cd46c8299bd893d
parent8daa577370883bcd09d5c38c83c14b1a23fa7eb3
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: 852b6d57dc7f ("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>
CVE-2019-6974

(cherry picked from commit cfa39381173d5f969daf43582c95ad679189cbc9)
Signed-off-by: Tyler Hicks <tyhicks@canonical.com>
Acked-by: Marcelo Henrique Cerri <marcelo.cerri@canonical.com>
Acked-by: Kleber Souza <kleber.souza@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
virt/kvm/kvm_main.c