Skip to contentSkip to conversation

arm64: Add CONFIG_CC_STACKPROTECTOR

PATCH Superseded Laura Abbott 2 participants 3 messages Jan 24, 2014 – Jan 27, 2014 arm64

v2 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 arm64: Add CONFIG_CC_STACKPROTECTOR

arm64 currently lacks support for -fstack-protector. Add similar functionality to arm to detect stack corruption.

Cc Will Deacon <[email protected]>
Cc Catalin Marinas <[email protected]>
---
 arch/arm64/Kconfig                      |   11 +++++++++
 arch/arm64/Makefile                     |    4 +++
 arch/arm64/include/asm/stackprotector.h |   38 +++++++++++++++++++++++++++++++
 arch/arm64/kernel/process.c             |    6 +++++
 4 files changed, 59 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm64/include/asm/stackprotector.h
arch/arm64/Kconfig +11 -0
index 6d4dd22..47280cf 100644
@@ -168,6 +168,17 @@ config HOTPLUG_CPU
 	  Say Y here to experiment with turning CPUs off and on.  CPUs
 	  can be controlled through /sys/devices/system/cpu.
 
+config CC_STACKPROTECTOR
+	bool "Enable -fstack-protector buffer overflow detection"
+	help
+	  This option turns on the -fstack-protector GCC feature. This
+	  feature puts, at the beginning of functions, a canary value on
+	  the stack just before the return address, and validates
+	  the value just before actually returning.  Stack based buffer
+	  overflows (that need to overwrite this return address) now also
+	  overwrite the canary, which gets detected and the attack is then
+	  neutralized via a kernel panic.
+
 source kernel/Kconfig.preempt
 
 config HZ
arch/arm64/Makefile +4 -0
index 2fceb71..1ce221e 100644
@@ -48,6 +48,10 @@ core-$(CONFIG_XEN) += arch/arm64/xen/
 libs-y		:= arch/arm64/lib/ $(libs-y)
 libs-y		+= $(LIBGCC)
 
+ifeq ($(CONFIG_CC_STACKPROTECTOR),y)
+KBUILD_CFLAGS	+=-fstack-protector
+endif
+
 # Default target when executing plain make
 KBUILD_IMAGE	:= Image.gz
 KBUILD_DTBS	:= dtbs
arch/arm64/include/asm/stackprotector.h new file +38 -0
new file mode 100644
index 0000000..fe5e287
@@ -0,0 +1,38 @@
+/*
+ * GCC stack protector support.
+ *
+ * Stack protector works by putting predefined pattern at the start of
+ * the stack frame and verifying that it hasn't been overwritten when
+ * returning from the function.  The pattern is called stack canary
+ * and gcc expects it to be defined by a global variable called
+ * "__stack_chk_guard" on ARM.  This unfortunately means that on SMP
+ * we cannot have a different canary value per task.
+ */
+
+#ifndef __ASM_STACKPROTECTOR_H
+#define __ASM_STACKPROTECTOR_H
+
+#include <linux/random.h>
+#include <linux/version.h>
+
+extern unsigned long __stack_chk_guard;
+
+/*
+ * Initialize the stackprotector canary value.
+ *
+ * NOTE: this must only be called from functions that never return,
+ * and it must always be inlined.
+ */
+static __always_inline void boot_init_stack_canary(void)
+{
+	unsigned long canary;
+
+	/* Try to get a semi random initial value. */
+	get_random_bytes(&canary, sizeof(canary));
+	canary ^= LINUX_VERSION_CODE;
+
+	current->stack_canary = canary;
+	__stack_chk_guard = current->stack_canary;
+}
+
+#endif	/* _ASM_STACKPROTECTOR_H */
arch/arm64/kernel/process.c +6 -0
index de17c89..72c5188 100644
@@ -50,6 +50,12 @@
 #include <asm/processor.h>
 #include <asm/stacktrace.h>
 
+#ifdef CONFIG_CC_STACKPROTECTOR
+#include <linux/stackprotector.h>
+unsigned long __stack_chk_guard __read_mostly;
+EXPORT_SYMBOL(__stack_chk_guard);
+#endif
+
 static void setup_restart(void)
 {
 	/*
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation
#1 lore raw

PATCH v2 1/1 arm64: Add CONFIG_CC_STACKPROTECTOR

Hi Laura,

Quoted 2 lines · Laura Abbott

arm64 currently lacks support for -fstack-protector. Add similar functionality to arm to detect stack corruption.

[...]

Quoted 5 lines
arch/arm64/include/asm/stackprotector.h new file +5 -0
+/*
+ * Initialize the stackprotector canary value.
+ *
+ * NOTE: this must only be called from functions that never return,
+ * and it must always be inlined.

arch/arm64/include/asm/stackprotector.h line 34

Quoted 10 lines
arch/arm64/include/asm/stackprotector.h new file +10 -0
+ */
+static __always_inline void boot_init_stack_canary(void)
+{
+	unsigned long canary;
+
+	/* Try to get a semi random initial value. */
+	get_random_bytes(&canary, sizeof(canary));
+	canary ^= LINUX_VERSION_CODE;
+
+	current->stack_canary = canary;

Do we actually need this line now?

Will

#2 lore raw

PATCH v2 1/1 arm64: Add CONFIG_CC_STACKPROTECTOR

Quoted 17 lines · Will Deacon

Hi Laura,

Quoted 2 lines · Laura Abbott

arm64 currently lacks support for -fstack-protector. Add similar functionality to arm to detect stack corruption.

[...]

Quoted 9 lines
arch/arm64/include/asm/stackprotector.h new file +9 -0
+/*
+ * Initialize the stackprotector canary value.
+ *
+ * NOTE: this must only be called from functions that never return,
+ * and it must always be inlined.
+ */
+static __always_inline void boot_init_stack_canary(void)
+{
+	unsigned long canary;
Quoted 9 lines

arch/arm64/include/asm/stackprotector.h line 34

Quoted 6 lines
arch/arm64/include/asm/stackprotector.h new file +6 -0
+
+	/* Try to get a semi random initial value. */
+	get_random_bytes(&canary, sizeof(canary));
+	canary ^= LINUX_VERSION_CODE;
+
+	current->stack_canary = canary;

Do we actually need this line now?

Probably not but it seems strange to not have anything there for the stack canary. Not sure if 'nothing' is better or worse than a possibly incorrect stack canary that gets automatically created in fork.

Laura

Signature · 2 lines
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation