OSDN Git Service

ARM: smp: add support for per-task stack canaries
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Thu, 6 Dec 2018 08:32:57 +0000 (09:32 +0100)
committerKees Cook <keescook@chromium.org>
Wed, 12 Dec 2018 21:20:07 +0000 (13:20 -0800)
commit189af4657186da08a2e79fb8e906cfd82b2ccddc
treeaef1d1ec51997c0baf5f415ad71a7929ac049746
parentccda4af0f4b92f7b4c308d3acc262f4a7e3affad
ARM: smp: add support for per-task stack canaries

On ARM, we currently only change the value of the stack canary when
switching tasks if the kernel was built for UP. On SMP kernels, this
is impossible since the stack canary value is obtained via a global
symbol reference, which means
a) all running tasks on all CPUs must use the same value
b) we can only modify the value when no kernel stack frames are live
   on any CPU, which is effectively never.

So instead, use a GCC plugin to add a RTL pass that replaces each
reference to the address of the __stack_chk_guard symbol with an
expression that produces the address of the 'stack_canary' field
that is added to struct thread_info. This way, each task will use
its own randomized value.

Cc: Russell King <linux@armlinux.org.uk>
Cc: Kees Cook <keescook@chromium.org>
Cc: Emese Revfy <re.emese@gmail.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Laura Abbott <labbott@redhat.com>
Cc: kernel-hardening@lists.openwall.com
Acked-by: Nicolas Pitre <nico@linaro.org>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Kees Cook <keescook@chromium.org>
arch/arm/Kconfig
arch/arm/Makefile
arch/arm/boot/compressed/Makefile
arch/arm/include/asm/stackprotector.h
arch/arm/include/asm/thread_info.h
arch/arm/kernel/asm-offsets.c
arch/arm/kernel/process.c
scripts/Makefile.gcc-plugins
scripts/gcc-plugins/Kconfig
scripts/gcc-plugins/arm_ssp_per_task_plugin.c [new file with mode: 0644]