Borislav Petkov b5316f
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Borislav Petkov b5316f
Date: Fri, 8 Jul 2022 19:10:11 +0200
Borislav Petkov d06c64
Subject: x86/kexec: Disable RET on kexec
Borislav Petkov d06c64
Git-commit: 697977d8415d61f3acbc4ee6d564c9dcf0309507
Borislav Petkov d06c64
Patch-mainline: v5.19-rc7
Borislav Petkov b5316f
References: bsc#1199657 CVE-2022-29900 CVE-2022-29901
Borislav Petkov b5316f
Borislav Petkov b5316f
All the invocations unroll to __x86_return_thunk and this file
Borislav Petkov b5316f
must be PIC independent.
Borislav Petkov b5316f
Borislav Petkov b5316f
This fixes kexec on 64-bit AMD boxes.
Borislav Petkov b5316f
Borislav Petkov d06c64
  [ bp: Fix 32-bit build. ]
Borislav Petkov d06c64
Borislav Petkov b5316f
Reported-by: Edward Tran <edward.tran@oracle.com>
Borislav Petkov b5316f
Reported-by: Awais Tanveer <awais.tanveer@oracle.com>
Borislav Petkov b5316f
Suggested-by: Ankur Arora <ankur.a.arora@oracle.com>
Borislav Petkov b5316f
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Borislav Petkov b5316f
Signed-off-by: Alexandre Chartre <alexandre.chartre@oracle.com>
Borislav Petkov b5316f
Signed-off-by: Borislav Petkov <bp@suse.de>
Borislav Petkov b5316f
---
Borislav Petkov d06c64
 arch/x86/kernel/relocate_kernel_32.S |   17 ++++++++++++-----
Borislav Petkov b5316f
 arch/x86/kernel/relocate_kernel_64.S |   18 ++++++++++++------
Borislav Petkov d06c64
 2 files changed, 24 insertions(+), 11 deletions(-)
Borislav Petkov b5316f
Borislav Petkov b5316f
--- a/arch/x86/kernel/relocate_kernel_32.S
Borislav Petkov b5316f
+++ b/arch/x86/kernel/relocate_kernel_32.S
Borislav Petkov d06c64
@@ -9,10 +9,12 @@
Borislav Petkov d06c64
 #include <linux/linkage.h>
Borislav Petkov d06c64
 #include <asm/page_types.h>
Borislav Petkov d06c64
 #include <asm/kexec.h>
Borislav Petkov d06c64
+#include <asm/nospec-branch.h>
Borislav Petkov b5316f
 #include <asm/processor-flags.h>
Borislav Petkov b5316f
 
Borislav Petkov b5316f
 /*
Borislav Petkov b5316f
- * Must be relocatable PIC code callable as a C function
Borislav Petkov b5316f
+ * Must be relocatable PIC code callable as a C function, in particular
Borislav Petkov b5316f
+ * there must be a plain RET and not jump to return thunk.
Borislav Petkov b5316f
  */
Borislav Petkov b5316f
 
Borislav Petkov b5316f
 #define PTR(x) (x << 2)
Borislav Petkov d06c64
@@ -94,7 +96,8 @@ relocate_kernel:
Borislav Petkov b5316f
 	movl    %edi, %eax
Borislav Petkov b5316f
 	addl    $(identity_mapped - relocate_kernel), %eax
Borislav Petkov b5316f
 	pushl   %eax
Borislav Petkov b5316f
-	RET
Borislav Petkov b5316f
+	ret
Borislav Petkov b5316f
+	int3
Borislav Petkov b5316f
 
Borislav Petkov b5316f
 identity_mapped:
Borislav Petkov b5316f
 	/* set return address to 0 if not preserving context */
Borislav Petkov d06c64
@@ -161,12 +164,14 @@ identity_mapped:
Borislav Petkov b5316f
 	xorl    %edx, %edx
Borislav Petkov b5316f
 	xorl    %esi, %esi
Borislav Petkov b5316f
 	xorl    %ebp, %ebp
Borislav Petkov b5316f
-	RET
Borislav Petkov b5316f
+	ret
Borislav Petkov b5316f
+	int3
Borislav Petkov b5316f
 1:
Borislav Petkov b5316f
 	popl	%edx
Borislav Petkov b5316f
 	movl	CP_PA_SWAP_PAGE(%edi), %esp
Borislav Petkov b5316f
 	addl	$PAGE_SIZE, %esp
Borislav Petkov b5316f
 2:
Borislav Petkov b5316f
+	ANNOTATE_RETPOLINE_SAFE
Borislav Petkov b5316f
 	call	*%edx
Borislav Petkov b5316f
 
Borislav Petkov b5316f
 	/* get the re-entry point of the peer system */
Borislav Petkov d06c64
@@ -209,7 +214,8 @@ virtual_mapped:
Borislav Petkov b5316f
 	popl	%edi
Borislav Petkov b5316f
 	popl	%esi
Borislav Petkov b5316f
 	popl	%ebx
Borislav Petkov b5316f
-	RET
Borislav Petkov b5316f
+	ret
Borislav Petkov b5316f
+	int3
Borislav Petkov b5316f
 
Borislav Petkov b5316f
 	/* Do the copies */
Borislav Petkov b5316f
 swap_pages:
Borislav Petkov d06c64
@@ -271,7 +277,8 @@ swap_pages:
Borislav Petkov b5316f
 	popl	%edi
Borislav Petkov b5316f
 	popl	%ebx
Borislav Petkov b5316f
 	popl	%ebp
Borislav Petkov b5316f
-	RET
Borislav Petkov b5316f
+	ret
Borislav Petkov b5316f
+	int3
Borislav Petkov b5316f
 
Borislav Petkov b5316f
 	.globl kexec_control_code_size
Borislav Petkov b5316f
 .set kexec_control_code_size, . - relocate_kernel
Borislav Petkov b5316f
--- a/arch/x86/kernel/relocate_kernel_64.S
Borislav Petkov b5316f
+++ b/arch/x86/kernel/relocate_kernel_64.S
Borislav Petkov b5316f
@@ -13,7 +13,8 @@
Borislav Petkov b5316f
 #include <asm/pgtable_types.h>
Borislav Petkov b5316f
 
Borislav Petkov b5316f
 /*
Borislav Petkov b5316f
- * Must be relocatable PIC code callable as a C function
Borislav Petkov b5316f
+ * Must be relocatable PIC code callable as a C function, in particular
Borislav Petkov b5316f
+ * there must be a plain RET and not jump to return thunk.
Borislav Petkov b5316f
  */
Borislav Petkov b5316f
 
Borislav Petkov b5316f
 #define PTR(x) (x << 3)
Borislav Petkov b5316f
@@ -104,7 +105,8 @@ relocate_kernel:
Borislav Petkov b5316f
 	/* jump to identity mapped page */
Borislav Petkov b5316f
 	addq	$(identity_mapped - relocate_kernel), %r8
Borislav Petkov b5316f
 	pushq	%r8
Borislav Petkov b5316f
-	RET
Borislav Petkov b5316f
+	ret
Borislav Petkov b5316f
+	int3
Borislav Petkov b5316f
 
Borislav Petkov b5316f
 identity_mapped:
Borislav Petkov b5316f
 	/* set return address to 0 if not preserving context */
Borislav Petkov b5316f
@@ -189,7 +191,8 @@ identity_mapped:
Borislav Petkov b5316f
 	xorl	%r14d, %r14d
Borislav Petkov b5316f
 	xorl	%r15d, %r15d
Borislav Petkov b5316f
 
Borislav Petkov b5316f
-	RET
Borislav Petkov b5316f
+	ret
Borislav Petkov b5316f
+	int3
Borislav Petkov b5316f
 
Borislav Petkov b5316f
 1:
Borislav Petkov b5316f
 	popq	%rdx
Borislav Petkov b5316f
@@ -210,7 +213,8 @@ identity_mapped:
Borislav Petkov b5316f
 	call	swap_pages
Borislav Petkov b5316f
 	movq	$virtual_mapped, %rax
Borislav Petkov b5316f
 	pushq	%rax
Borislav Petkov b5316f
-	RET
Borislav Petkov b5316f
+	ret
Borislav Petkov b5316f
+	int3
Borislav Petkov b5316f
 
Borislav Petkov b5316f
 virtual_mapped:
Borislav Petkov b5316f
 	movq	RSP(%r8), %rsp
Borislav Petkov b5316f
@@ -229,7 +233,8 @@ virtual_mapped:
Borislav Petkov b5316f
 	popq	%r12
Borislav Petkov b5316f
 	popq	%rbp
Borislav Petkov b5316f
 	popq	%rbx
Borislav Petkov b5316f
-	RET
Borislav Petkov b5316f
+	ret
Borislav Petkov b5316f
+	int3
Borislav Petkov b5316f
 
Borislav Petkov b5316f
 	/* Do the copies */
Borislav Petkov b5316f
 swap_pages:
Borislav Petkov b5316f
@@ -284,7 +289,8 @@ swap_pages:
Borislav Petkov b5316f
 	lea	PAGE_SIZE(%rax), %rsi
Borislav Petkov b5316f
 	jmp	0b
Borislav Petkov b5316f
 3:
Borislav Petkov b5316f
-	RET
Borislav Petkov b5316f
+	ret
Borislav Petkov b5316f
+	int3
Borislav Petkov b5316f
 
Borislav Petkov b5316f
 	.globl kexec_control_code_size
Borislav Petkov b5316f
 .set kexec_control_code_size, . - relocate_kernel