|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen stable-4.6] x86/entry: Erase guest GPR state on entry to Xen
commit ec05090403ef4d760fbe701e31afd0f0edc414d5
Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
AuthorDate: Wed Feb 14 12:38:48 2018 +0100
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Wed Feb 14 12:38:48 2018 +0100
x86/entry: Erase guest GPR state on entry to Xen
This reduces the number of code gadgets which can be attacked with arbitrary
guest-controlled GPR values.
This is part of XSA-254.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Wei Liu <wei.liu2@xxxxxxxxxx>
master commit: 03bd8c3a70d101fc2f8f36f1e171b7594462a4cd
master date: 2018-01-05 19:57:08 +0000
---
xen/arch/x86/x86_64/compat/entry.S | 3 +--
xen/arch/x86/x86_64/entry.S | 2 +-
xen/include/asm-x86/asm_defns.h | 30 +++++++++++++++++++++++++-----
3 files changed, 27 insertions(+), 8 deletions(-)
diff --git a/xen/arch/x86/x86_64/compat/entry.S
b/xen/arch/x86/x86_64/compat/entry.S
index 1b919a8..9c875e5 100644
--- a/xen/arch/x86/x86_64/compat/entry.S
+++ b/xen/arch/x86/x86_64/compat/entry.S
@@ -23,10 +23,9 @@ ENTRY(compat_hypercall)
UNLIKELY_START(ne, msi_check)
movl $HYPERCALL_VECTOR,%edi
call check_for_unexpected_msi
- LOAD_C_CLOBBERED compat=1 ax=0
UNLIKELY_END(msi_check)
- movl UREGS_rax(%rsp),%eax
+ LOAD_C_CLOBBERED compat=1
GET_CURRENT(%rbx)
cmpl $NR_hypercalls,%eax
diff --git a/xen/arch/x86/x86_64/entry.S b/xen/arch/x86/x86_64/entry.S
index 6d8e5d1..b5188e4 100644
--- a/xen/arch/x86/x86_64/entry.S
+++ b/xen/arch/x86/x86_64/entry.S
@@ -189,7 +189,7 @@ ENTRY(lstar_enter)
jz switch_to_kernel
/*hypercall:*/
- movq %r10,%rcx
+ LOAD_C_CLOBBERED cx=0
cmpq $NR_hypercalls,%rax
jae bad_hypercall
#ifndef NDEBUG
diff --git a/xen/include/asm-x86/asm_defns.h b/xen/include/asm-x86/asm_defns.h
index 54328e7..0bb0589 100644
--- a/xen/include/asm-x86/asm_defns.h
+++ b/xen/include/asm-x86/asm_defns.h
@@ -183,7 +183,7 @@ static always_inline void stac(void)
#endif
#ifdef __ASSEMBLY__
-.macro SAVE_ALL op, compat=0
+.macro SAVE_ALL op, compat=0, clrargs=1
.ifeqs "\op", "CLAC"
ASM_CLAC
.else
@@ -198,22 +198,34 @@ static always_inline void stac(void)
addq $-(UREGS_error_code-UREGS_r15), %rsp
cld
movq %rdi,UREGS_rdi(%rsp)
+ xor %edi, %edi
movq %rsi,UREGS_rsi(%rsp)
+ xor %esi, %esi
movq %rdx,UREGS_rdx(%rsp)
+ xor %edx, %edx
movq %rcx,UREGS_rcx(%rsp)
+ xor %ecx, %ecx
movq %rax,UREGS_rax(%rsp)
+ xor %eax, %eax
.if !\compat
movq %r8,UREGS_r8(%rsp)
movq %r9,UREGS_r9(%rsp)
movq %r10,UREGS_r10(%rsp)
movq %r11,UREGS_r11(%rsp)
.endif
+ xor %r8, %r8
+ xor %r9, %r9
+ xor %r10, %r10
+ xor %r11, %r11
movq %rbx,UREGS_rbx(%rsp)
+ xor %ebx, %ebx
movq %rbp,UREGS_rbp(%rsp)
#ifdef CONFIG_FRAME_POINTER
/* Indicate special exception stack frame by inverting the frame pointer. */
leaq UREGS_rbp(%rsp), %rbp
notq %rbp
+#else
+ xor %ebp, %ebp
#endif
.if !\compat
movq %r12,UREGS_r12(%rsp)
@@ -221,6 +233,10 @@ static always_inline void stac(void)
movq %r14,UREGS_r14(%rsp)
movq %r15,UREGS_r15(%rsp)
.endif
+ xor %r12, %r12
+ xor %r13, %r13
+ xor %r14, %r14
+ xor %r15, %r15
.endm
/*
@@ -230,19 +246,23 @@ static always_inline void stac(void)
*
* For the way it is used in RESTORE_ALL, this macro must preserve EFLAGS.ZF.
*/
-.macro LOAD_C_CLOBBERED compat=0 ax=1
+.macro LOAD_C_CLOBBERED compat=0 cx=1
.if !\compat
movq UREGS_r11(%rsp),%r11
+.if \cx
movq UREGS_r10(%rsp),%r10
+.else
+ movq UREGS_r10(%rsp),%rcx
+.endif
movq UREGS_r9(%rsp),%r9
movq UREGS_r8(%rsp),%r8
-.if \ax
movq UREGS_rax(%rsp),%rax
-.endif
-.elseif \ax
+.else
movl UREGS_rax(%rsp),%eax
.endif
+.if \cx
movq UREGS_rcx(%rsp),%rcx
+.endif
movq UREGS_rdx(%rsp),%rdx
movq UREGS_rsi(%rsp),%rsi
movq UREGS_rdi(%rsp),%rdi
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.6
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |