]> www.infradead.org Git - nvme.git/commitdiff
riscv: enable HAVE_ARCH_STACKLEAK
authorJisheng Zhang <jszhang@kernel.org>
Sun, 23 Jun 2024 23:53:16 +0000 (07:53 +0800)
committerPalmer Dabbelt <palmer@rivosinc.com>
Fri, 26 Jul 2024 12:50:47 +0000 (05:50 -0700)
Add support for the stackleak feature. Whenever the kernel returns to user
space the kernel stack is filled with a poison value.

At the same time, disables the plugin in EFI stub code because EFI stub
is out of scope for the protection.

Tested on qemu and milkv duo:
/ # echo STACKLEAK_ERASING > /sys/kernel/debug/provoke-crash/DIRECT
[   38.675575] lkdtm: Performing direct entry STACKLEAK_ERASING
[   38.678448] lkdtm: stackleak stack usage:
[   38.678448]   high offset: 288 bytes
[   38.678448]   current:     496 bytes
[   38.678448]   lowest:      1328 bytes
[   38.678448]   tracked:     1328 bytes
[   38.678448]   untracked:   448 bytes
[   38.678448]   poisoned:    14312 bytes
[   38.678448]   low offset:  8 bytes
[   38.689887] lkdtm: OK: the rest of the thread stack is properly erased

Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
Reviewed-by: Charlie Jenkins <charlie@rivosinc.com>
Link: https://lore.kernel.org/r/20240623235316.2010-1-jszhang@kernel.org
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/Kconfig
arch/riscv/include/asm/thread_info.h
arch/riscv/kernel/entry.S
drivers/firmware/efi/libstub/Makefile

index 34ae39ecb89812761df783aa09a5940da749e270..19ca402e6f264390c1c8f4b7fa90c242b26d252d 100644 (file)
@@ -123,6 +123,7 @@ config RISCV
        select HAVE_ARCH_MMAP_RND_COMPAT_BITS if COMPAT
        select HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET
        select HAVE_ARCH_SECCOMP_FILTER
+       select HAVE_ARCH_STACKLEAK
        select HAVE_ARCH_THREAD_STRUCT_WHITELIST
        select HAVE_ARCH_TRACEHOOK
        select HAVE_ARCH_TRANSPARENT_HUGEPAGE if 64BIT && MMU
index 5d473343634b9d3af3c1f1872da25e6e60f77162..fca5c6be2b8112ff6962a51ef0f89794a332f1a4 100644 (file)
@@ -10,6 +10,7 @@
 
 #include <asm/page.h>
 #include <linux/const.h>
+#include <linux/sizes.h>
 
 /* thread information allocation */
 #define THREAD_SIZE_ORDER      CONFIG_THREAD_SIZE_ORDER
index c933460ed3e9fc3363ccae2b962ba32e6bf9a74e..ac2e908d4418d0c4a03787981b02360a1e212312 100644 (file)
@@ -133,6 +133,10 @@ SYM_CODE_START_NOALIGN(ret_from_exception)
 #endif
        bnez s0, 1f
 
+#ifdef CONFIG_GCC_PLUGIN_STACKLEAK
+       call    stackleak_erase_on_task_stack
+#endif
+
        /* Save unwound kernel stack pointer in thread_info */
        addi s0, sp, PT_SIZE_ON_STACK
        REG_S s0, TASK_TI_KERNEL_SP(tp)
index 1f32d6cf98d6913ff4e0169868126fc50a5b11fd..f23ba62ce127b475a29bd8ed8235fbbc69cd6cbc 100644 (file)
@@ -28,7 +28,8 @@ cflags-$(CONFIG_ARM)          += -DEFI_HAVE_STRLEN -DEFI_HAVE_STRNLEN \
                                   -DEFI_HAVE_MEMCHR -DEFI_HAVE_STRRCHR \
                                   -DEFI_HAVE_STRCMP -fno-builtin -fpic \
                                   $(call cc-option,-mno-single-pic-base)
-cflags-$(CONFIG_RISCV)         += -fpic -DNO_ALTERNATIVE -mno-relax
+cflags-$(CONFIG_RISCV)         += -fpic -DNO_ALTERNATIVE -mno-relax \
+                                  $(DISABLE_STACKLEAK_PLUGIN)
 cflags-$(CONFIG_LOONGARCH)     += -fpie
 
 cflags-$(CONFIG_EFI_PARAMS_FROM_FDT)   += -I$(srctree)/scripts/dtc/libfdt