[Lucid][CVE][PATCH 1/2] KVM: Validate userspace_addr of memslot when registered
Luis Henriques
luis.henriques at canonical.com
Thu Aug 15 11:52:22 UTC 2013
From: Takuya Yoshikawa <yoshikawa.takuya at oss.ntt.co.jp>
CVE-2013-1943
BugLink: http://bugs.launchpad.net/bugs/1191918
This way, we can avoid checking the user space address many times when
we read the guest memory.
Although we can do the same for write if we check which slots are
writable, we do not care write now: reading the guest memory happens
more often than writing.
[avi: change VERIFY_READ to VERIFY_WRITE]
Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya at oss.ntt.co.jp>
Signed-off-by: Avi Kivity <avi at redhat.com>
(back ported from commit fa3d315a4ce2c0891cdde262562e710d95fba19e)
Signed-off-by: Luis Henriques <luis.henriques at canonical.com>
---
virt/kvm/kvm_main.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 3715e41..2542058 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -1189,7 +1189,10 @@ int __kvm_set_memory_region(struct kvm *kvm,
goto out;
if (mem->guest_phys_addr & (PAGE_SIZE - 1))
goto out;
- if (user_alloc && (mem->userspace_addr & (PAGE_SIZE - 1)))
+ /* We can read the guest memory with __xxx_user() later on. */
+ if (user_alloc &&
+ ((mem->userspace_addr & (PAGE_SIZE - 1)) ||
+ !access_ok(VERIFY_WRITE, mem->userspace_addr, mem->memory_size)))
goto out;
if (mem->slot >= KVM_MEMORY_SLOTS + KVM_PRIVATE_MEM_SLOTS)
goto out;
@@ -1620,7 +1623,7 @@ int kvm_read_guest_page(struct kvm *kvm, gfn_t gfn, void *data, int offset,
addr = gfn_to_hva(kvm, gfn);
if (kvm_is_error_hva(addr))
return -EFAULT;
- r = copy_from_user(data, (void __user *)addr + offset, len);
+ r = __copy_from_user(data, (void __user *)addr + offset, len);
if (r)
return -EFAULT;
return 0;
--
1.8.3.2
More information about the kernel-team
mailing list