[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen stable-4.6] x86/PV: writes of %fs and %gs base MSRs require canonical addresses
commit fcab9d3c6a539fc2928963f53d5a2cb6511d1b4b Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Tue Nov 22 14:22:09 2016 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Tue Nov 22 14:22:09 2016 +0100 x86/PV: writes of %fs and %gs base MSRs require canonical addresses Commit c42494acb2 ("x86: fix FS/GS base handling when using the fsgsbase feature") replaced the use of wrmsr_safe() on these paths without recognizing that wr{f,g}sbase() use just wrmsrl() and that the WR{F,G}SBASE instructions also raise #GP for non-canonical input. Similarly arch_set_info_guest() needs to prevent non-canonical addresses from getting stored into state later to be loaded by context switch code. For consistency also check stack pointers and LDT base. DR0..3, otoh, already get properly checked in set_debugreg() (albeit we discard the error there). The SHADOW_GS_BASE check isn't strictly necessary, but I think we better avoid trying the WRMSR if we know it's going to fail. This is CVE-2016-9385 / XSA-193. Reported-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> master commit: f3fa3abf3e61fb1f25ce721e14ac324dda67311f master date: 2016-11-22 13:46:28 +0100 --- xen/arch/x86/domain.c | 8 +++++++- xen/arch/x86/traps.c | 9 ++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index e166c1b..fa2aead 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -796,7 +796,13 @@ int arch_set_info_guest( { if ( !compat ) { - if ( !is_canonical_address(c.nat->user_regs.eip) || + if ( !is_canonical_address(c.nat->user_regs.rip) || + !is_canonical_address(c.nat->user_regs.rsp) || + !is_canonical_address(c.nat->kernel_sp) || + (c.nat->ldt_ents && !is_canonical_address(c.nat->ldt_base)) || + !is_canonical_address(c.nat->fs_base) || + !is_canonical_address(c.nat->gs_base_kernel) || + !is_canonical_address(c.nat->gs_base_user) || !is_canonical_address(c.nat->event_callback_eip) || !is_canonical_address(c.nat->syscall_callback_eip) || !is_canonical_address(c.nat->failsafe_callback_eip) ) diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 9383501..27af87f 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -2515,19 +2515,22 @@ static int emulate_privileged_op(struct cpu_user_regs *regs) switch ( regs->_ecx ) { case MSR_FS_BASE: - if ( is_pv_32bit_domain(currd) ) + if ( is_pv_32bit_domain(currd) || + !is_canonical_address(msr_content) ) goto fail; wrfsbase(msr_content); v->arch.pv_vcpu.fs_base = msr_content; break; case MSR_GS_BASE: - if ( is_pv_32bit_domain(currd) ) + if ( is_pv_32bit_domain(currd) || + !is_canonical_address(msr_content) ) goto fail; wrgsbase(msr_content); v->arch.pv_vcpu.gs_base_kernel = msr_content; break; case MSR_SHADOW_GS_BASE: - if ( is_pv_32bit_domain(currd) ) + if ( is_pv_32bit_domain(currd) || + !is_canonical_address(msr_content) ) goto fail; if ( wrmsr_safe(MSR_SHADOW_GS_BASE, msr_content) ) goto fail; -- generated by git-patchbot for /home/xen/git/xen.git#stable-4.6 _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |