diff options
author | Matthew Daley <mattjd@gmail.com> | 2013-10-10 15:22:55 +0200 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2013-10-10 15:22:55 +0200 |
commit | 889f547790953d30cd88a465aac5954e5f407e53 (patch) | |
tree | 3c7ae574ee5c5f32126451b48b41729e6ee8e822 | |
parent | b267a5a2cae14c97ab9198336f1529e7e48fad22 (diff) | |
download | xen-889f547790953d30cd88a465aac5954e5f407e53.tar.gz xen-889f547790953d30cd88a465aac5954e5f407e53.tar.bz2 xen-889f547790953d30cd88a465aac5954e5f407e53.zip |
x86: check segment descriptor read result in 64-bit OUTS emulation
When emulating such an operation from a 64-bit context (CS has long
mode set), and the data segment is overridden to FS/GS, the result of
reading the overridden segment's descriptor (read_descriptor) is not
checked. If it fails, data_base is left uninitialized.
This can lead to 8 bytes of Xen's stack being leaked to the guest
(implicitly, i.e. via the address given in a #PF).
Coverity-ID: 1055116
This is CVE-2013-4368 / XSA-67.
Signed-off-by: Matthew Daley <mattjd@gmail.com>
Fix formatting.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
master commit: 0771faba163769089c9f05f7f76b63e397677613
master date: 2013-10-10 15:19:53 +0200
-rw-r--r-- | xen/arch/x86/traps.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 2e6895c4ce..eb426eca4a 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -1990,10 +1990,10 @@ static int emulate_privileged_op(struct cpu_user_regs *regs) break; } } - else - read_descriptor(data_sel, v, regs, - &data_base, &data_limit, &ar, - 0); + else if ( !read_descriptor(data_sel, v, regs, + &data_base, &data_limit, &ar, 0) || + !(ar & _SEGMENT_S) || !(ar & _SEGMENT_P) ) + goto fail; data_limit = ~0UL; ar = _SEGMENT_WR|_SEGMENT_S|_SEGMENT_DPL|_SEGMENT_P; } |