Skip to content

Commit

Permalink
x86: clear EFLAGS.NT in SYSENTER entry path
Browse files Browse the repository at this point in the history
... as it causes problems if we happen to exit back via IRET: In the
course of trying to handle the fault, the hypervisor creates a stack
frame by hand, and uses PUSHFQ to set the respective EFLAGS field, but
expects to be able to IRET through that stack frame to the second
portion of the fixup code (which causes a #GP due to the stored EFLAGS
having NT set).

And even if this worked (e.g if we cleared NT in that path), it would
then (through the fail safe callback) cause a #GP in the guest with the
SYSENTER handler's first instruction as the source, which in turn would
allow guest user mode code to crash the guest kernel.

Inject a #GP on the fake (NULL) address of the SYSENTER instruction
instead, just like in the case where the guest kernel didn't register
a corresponding entry point.

This is CVE-2013-1917 / XSA-44.

Reported-by: Andrew Cooper <andrew.cooper3@citirx.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Tested-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
  • Loading branch information
jbeulich committed Apr 18, 2013
1 parent 8d266f6 commit fdac951
Showing 1 changed file with 7 additions and 0 deletions.
7 changes: 7 additions & 0 deletions xen/arch/x86/x86_64/entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,14 @@ sysenter_eflags_saved:
cmpb $0,VCPU_sysenter_disables_events(%rbx)
movq VCPU_sysenter_addr(%rbx),%rax
setne %cl
testl $X86_EFLAGS_NT,UREGS_eflags(%rsp)
leaq VCPU_trap_bounce(%rbx),%rdx
UNLIKELY_START(nz, sysenter_nt_set)
pushfq
andl $~X86_EFLAGS_NT,(%rsp)
popfq
xorl %eax,%eax
UNLIKELY_END(sysenter_nt_set)
testq %rax,%rax
leal (,%rcx,TBF_INTERRUPT),%ecx
UNLIKELY_START(z, sysenter_gpf)
Expand Down

0 comments on commit fdac951

Please sign in to comment.