Matthias Brugger a1eecd
From: Russell King <rmk+kernel@armlinux.org.uk>
Matthias Brugger a1eecd
Date: Fri, 29 Jan 2021 10:19:07 +0000
Matthias Brugger a1eecd
Subject: ARM: ensure the signal page contains defined contents
Matthias Brugger a1eecd
Git-commit: 9c698bff66ab4914bb3d71da7dc6112519bde23e
Matthias Brugger a1eecd
Patch-mainline: v5.11-rc7
Matthias Brugger 47f3aa
References: CVE-2021-21781 bsc#1188445
Matthias Brugger a1eecd
Matthias Brugger a1eecd
Ensure that the signal page contains our poison instruction to increase
Matthias Brugger a1eecd
the protection against ROP attacks and also contains well defined
Matthias Brugger a1eecd
contents.
Matthias Brugger a1eecd
Matthias Brugger a1eecd
Acked-by: Will Deacon <will@kernel.org>
Matthias Brugger a1eecd
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Matthias Brugger a1eecd
Signed-off-by: Matthias Brugger <mbrugger@suse.com>
Matthias Brugger a1eecd
---
Matthias Brugger a1eecd
 arch/arm/kernel/signal.c | 14 ++++++++------
Matthias Brugger a1eecd
 1 file changed, 8 insertions(+), 6 deletions(-)
Matthias Brugger a1eecd
Matthias Brugger a1eecd
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
Matthias Brugger a1eecd
index 9d2e916121be..a3a38d0a4c85 100644
Matthias Brugger a1eecd
--- a/arch/arm/kernel/signal.c
Matthias Brugger a1eecd
+++ b/arch/arm/kernel/signal.c
Matthias Brugger a1eecd
@@ -693,18 +693,20 @@ struct page *get_signal_page(void)
Matthias Brugger a1eecd
 
Matthias Brugger a1eecd
 	addr = page_address(page);
Matthias Brugger a1eecd
 
Matthias Brugger a1eecd
+	/* Poison the entire page */
Matthias Brugger a1eecd
+	memset32(addr, __opcode_to_mem_arm(0xe7fddef1),
Matthias Brugger a1eecd
+		 PAGE_SIZE / sizeof(u32));
Matthias Brugger a1eecd
+
Matthias Brugger a1eecd
 	/* Give the signal return code some randomness */
Matthias Brugger a1eecd
 	offset = 0x200 + (get_random_int() & 0x7fc);
Matthias Brugger a1eecd
 	signal_return_offset = offset;
Matthias Brugger a1eecd
 
Matthias Brugger a1eecd
-	/*
Matthias Brugger a1eecd
-	 * Copy signal return handlers into the vector page, and
Matthias Brugger a1eecd
-	 * set sigreturn to be a pointer to these.
Matthias Brugger a1eecd
-	 */
Matthias Brugger a1eecd
+	/* Copy signal return handlers into the page */
Matthias Brugger a1eecd
 	memcpy(addr + offset, sigreturn_codes, sizeof(sigreturn_codes));
Matthias Brugger a1eecd
 
Matthias Brugger a1eecd
-	ptr = (unsigned long)addr + offset;
Matthias Brugger a1eecd
-	flush_icache_range(ptr, ptr + sizeof(sigreturn_codes));
Matthias Brugger a1eecd
+	/* Flush out all instructions in this page */
Matthias Brugger a1eecd
+	ptr = (unsigned long)addr;
Matthias Brugger a1eecd
+	flush_icache_range(ptr, ptr + PAGE_SIZE);
Matthias Brugger a1eecd
 
Matthias Brugger a1eecd
 	return page;
Matthias Brugger a1eecd
 }
Matthias Brugger a1eecd
-- 
Matthias Brugger a1eecd
2.31.1
Matthias Brugger a1eecd