Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6b8cf5cc authored by Dan Williams's avatar Dan Williams Committed by Ingo Molnar
Browse files

x86/entry/64/compat: Clear registers for compat syscalls, to reduce speculation attack surface



At entry userspace may have populated registers with values that could
otherwise be useful in a speculative execution attack. Clear them to
minimize the kernel's attack surface.

Originally-From: Andi Kleen <ak@linux.intel.com>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
Cc: <stable@vger.kernel.org>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/151787989697.7847.4083702787288600552.stgit@dwillia2-desk3.amr.corp.intel.com


[ Made small improvements to the changelog. ]
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 3ac6d8c7
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -85,15 +85,25 @@ ENTRY(entry_SYSENTER_compat)
	pushq	%rcx			/* pt_regs->cx */
	pushq	$-ENOSYS		/* pt_regs->ax */
	pushq   $0			/* pt_regs->r8  = 0 */
	xorq	%r8, %r8		/* nospec   r8 */
	pushq   $0			/* pt_regs->r9  = 0 */
	xorq	%r9, %r9		/* nospec   r9 */
	pushq   $0			/* pt_regs->r10 = 0 */
	xorq	%r10, %r10		/* nospec   r10 */
	pushq   $0			/* pt_regs->r11 = 0 */
	xorq	%r11, %r11		/* nospec   r11 */
	pushq   %rbx                    /* pt_regs->rbx */
	xorl	%ebx, %ebx		/* nospec   rbx */
	pushq   %rbp                    /* pt_regs->rbp (will be overwritten) */
	xorl	%ebp, %ebp		/* nospec   rbp */
	pushq   $0			/* pt_regs->r12 = 0 */
	xorq	%r12, %r12		/* nospec   r12 */
	pushq   $0			/* pt_regs->r13 = 0 */
	xorq	%r13, %r13		/* nospec   r13 */
	pushq   $0			/* pt_regs->r14 = 0 */
	xorq	%r14, %r14		/* nospec   r14 */
	pushq   $0			/* pt_regs->r15 = 0 */
	xorq	%r15, %r15		/* nospec   r15 */
	cld

	/*
@@ -214,15 +224,25 @@ GLOBAL(entry_SYSCALL_compat_after_hwframe)
	pushq	%rbp			/* pt_regs->cx (stashed in bp) */
	pushq	$-ENOSYS		/* pt_regs->ax */
	pushq   $0			/* pt_regs->r8  = 0 */
	xorq	%r8, %r8		/* nospec   r8 */
	pushq   $0			/* pt_regs->r9  = 0 */
	xorq	%r9, %r9		/* nospec   r9 */
	pushq   $0			/* pt_regs->r10 = 0 */
	xorq	%r10, %r10		/* nospec   r10 */
	pushq   $0			/* pt_regs->r11 = 0 */
	xorq	%r11, %r11		/* nospec   r11 */
	pushq   %rbx                    /* pt_regs->rbx */
	xorl	%ebx, %ebx		/* nospec   rbx */
	pushq   %rbp                    /* pt_regs->rbp (will be overwritten) */
	xorl	%ebp, %ebp		/* nospec   rbp */
	pushq   $0			/* pt_regs->r12 = 0 */
	xorq	%r12, %r12		/* nospec   r12 */
	pushq   $0			/* pt_regs->r13 = 0 */
	xorq	%r13, %r13		/* nospec   r13 */
	pushq   $0			/* pt_regs->r14 = 0 */
	xorq	%r14, %r14		/* nospec   r14 */
	pushq   $0			/* pt_regs->r15 = 0 */
	xorq	%r15, %r15		/* nospec   r15 */

	/*
	 * User mode is traced as though IRQs are on, and SYSENTER
@@ -338,15 +358,25 @@ ENTRY(entry_INT80_compat)
	pushq	%rcx			/* pt_regs->cx */
	pushq	$-ENOSYS		/* pt_regs->ax */
	pushq   $0			/* pt_regs->r8  = 0 */
	xorq	%r8, %r8		/* nospec   r8 */
	pushq   $0			/* pt_regs->r9  = 0 */
	xorq	%r9, %r9		/* nospec   r9 */
	pushq   $0			/* pt_regs->r10 = 0 */
	xorq	%r10, %r10		/* nospec   r10 */
	pushq   $0			/* pt_regs->r11 = 0 */
	xorq	%r11, %r11		/* nospec   r11 */
	pushq   %rbx                    /* pt_regs->rbx */
	xorl	%ebx, %ebx		/* nospec   rbx */
	pushq   %rbp                    /* pt_regs->rbp */
	xorl	%ebp, %ebp		/* nospec   rbp */
	pushq   %r12                    /* pt_regs->r12 */
	xorq	%r12, %r12		/* nospec   r12 */
	pushq   %r13                    /* pt_regs->r13 */
	xorq	%r13, %r13		/* nospec   r13 */
	pushq   %r14                    /* pt_regs->r14 */
	xorq	%r14, %r14		/* nospec   r14 */
	pushq   %r15                    /* pt_regs->r15 */
	xorq	%r15, %r15		/* nospec   r15 */
	cld

	/*