- patches.arch/kvm-convert-msr_kvm_system_time-to-use-gfn_to_hva_cache_init.patch:
[opensuse:kernel-source.git] / patches.arch / kvm-fix-for-buffer-overflow-in-handling-of-msr_kvm_system_time.patch
1 From 6d104e07e459cedbb5f3a7688ca855f77779ec99 Mon Sep 17 00:00:00 2001
2 From: Andrew Honig <ahonig@google.com>
3 Date: Mon, 11 Mar 2013 14:29:41 -0600
4 Subject: KVM: Fix for buffer overflow in handling of MSR_KVM_SYSTEM_TIME
5 Patch-mainline: Not yet, Embargo lifted 2013-03-18
6 References: bnc#806980 CVE-2013-1796
7
8 If the guest sets the GPA of the time_page so that the request to update the
9 time straddles a page then KVM will write onto an incorrect page.  The
10 write is done byusing kmap atomic to get a pointer to the page for the time
11 structure and then performing a memcpy to that page starting at an offset
12 that the guest controls.  Well behaved guests always provide a 32-byte aligned
13 address, however a malicious guest could use this to corrupt host kernel
14 memory.
15
16 Tested: Tested against kvmclock unit test.
17
18 Signed-off-by: Andrew Honig <ahonig@google.com>
19 Acked-by: Bruce Rogers <brogers@suse.com>
20 ---
21  arch/x86/kvm/x86.c |    5 +++++
22  1 files changed, 5 insertions(+), 0 deletions(-)
23
24 diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
25 index 18dbbf0..5fc7431 100644
26 --- a/arch/x86/kvm/x86.c
27 +++ b/arch/x86/kvm/x86.c
28 @@ -1544,6 +1544,11 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data)
29                 /* ...but clean it before doing the actual write */
30                 vcpu->arch.time_offset = data & ~(PAGE_MASK | 1);
31  
32 +               /* Check that the address is 32-byte aligned. */
33 +               if (vcpu->arch.time_offset &
34 +                               (sizeof(struct pvclock_vcpu_time_info) - 1))
35 +                       return 1;
36 +
37                 vcpu->arch.time_page =
38                                 gfn_to_page(vcpu->kvm, data >> PAGE_SHIFT);
39  
40