lkml.org 
[lkml]   [2019]   [Oct]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    Subject[PATCH 00/18] add support for Clang's Shadow Call Stack
    From
    This patch series adds support for Clang's Shadow Call Stack (SCS)
    mitigation, which uses a separately allocated shadow stack to protect
    against return address overwrites. More information can be found here:

    https://clang.llvm.org/docs/ShadowCallStack.html

    SCS is currently supported only on arm64, where the compiler requires
    the x18 register to be reserved for holding the current task's shadow
    stack pointer. Because of this, the series includes four patches from
    Ard to remove x18 usage from assembly code and to reserve the register
    from general allocation.

    With -fsanitize=shadow-call-stack, the compiler injects instructions
    to all non-leaf C functions to store the return address to the shadow
    stack and unconditionally load it again before returning. As a result,
    SCS is incompatible with features that rely on modifying function
    return addresses to alter control flow, such as function graph tracing
    and kretprobes. A copy of the return address is still kept in the
    kernel stack for compatibility with stack unwinding, for example.

    SCS has a minimal performance overhead, but allocating shadow stacks
    increases kernel memory usage. The feature is therefore mostly useful
    on hardware that lacks support for PAC instructions. This series adds
    a ROP protection choice to the kernel configuration, where other
    return address protection options can be selected as they are added to
    the kernel.


    Ard Biesheuvel (4):
    arm64/lib: copy_page: avoid x18 register in assembler code
    arm64: kvm: stop treating register x18 as caller save
    arm64: kernel: avoid x18 as an arbitrary temp register
    arm64: kbuild: reserve reg x18 from general allocation by the compiler

    Sami Tolvanen (14):
    arm64: mm: don't use x18 in idmap_kpti_install_ng_mappings
    add support for Clang's Shadow Call Stack (SCS)
    scs: add accounting
    scs: add support for stack usage debugging
    trace: disable function graph tracing with SCS
    kprobes: fix compilation without CONFIG_KRETPROBES
    kprobes: disable kretprobes with SCS
    arm64: reserve x18 only with Shadow Call Stack
    arm64: preserve x18 when CPU is suspended
    arm64: efi: restore x18 if it was corrupted
    arm64: vdso: disable Shadow Call Stack
    arm64: kprobes: fix kprobes without CONFIG_KRETPROBES
    arm64: disable SCS for hypervisor code
    arm64: implement Shadow Call Stack

    Makefile | 6 +
    arch/Kconfig | 41 ++++-
    arch/arm64/Kconfig | 1 +
    arch/arm64/Makefile | 4 +
    arch/arm64/include/asm/scs.h | 60 ++++++++
    arch/arm64/include/asm/stacktrace.h | 4 +
    arch/arm64/include/asm/thread_info.h | 3 +
    arch/arm64/kernel/Makefile | 1 +
    arch/arm64/kernel/asm-offsets.c | 3 +
    arch/arm64/kernel/cpu-reset.S | 4 +-
    arch/arm64/kernel/efi-rt-wrapper.S | 7 +-
    arch/arm64/kernel/entry.S | 23 +++
    arch/arm64/kernel/head.S | 9 ++
    arch/arm64/kernel/irq.c | 2 +
    arch/arm64/kernel/probes/kprobes.c | 2 +
    arch/arm64/kernel/process.c | 3 +
    arch/arm64/kernel/scs.c | 39 +++++
    arch/arm64/kernel/smp.c | 4 +
    arch/arm64/kernel/vdso/Makefile | 2 +-
    arch/arm64/kvm/hyp/Makefile | 3 +-
    arch/arm64/kvm/hyp/entry.S | 12 +-
    arch/arm64/lib/copy_page.S | 38 ++---
    arch/arm64/mm/proc.S | 69 +++++----
    drivers/base/node.c | 6 +
    fs/proc/meminfo.c | 4 +
    include/linux/compiler-clang.h | 2 +
    include/linux/compiler_types.h | 4 +
    include/linux/mmzone.h | 3 +
    include/linux/scs.h | 88 +++++++++++
    init/init_task.c | 6 +
    init/main.c | 3 +
    kernel/Makefile | 1 +
    kernel/fork.c | 9 ++
    kernel/kprobes.c | 38 ++---
    kernel/sched/core.c | 2 +
    kernel/sched/sched.h | 1 +
    kernel/scs.c | 221 +++++++++++++++++++++++++++
    kernel/trace/Kconfig | 1 +
    mm/page_alloc.c | 6 +
    mm/vmstat.c | 3 +
    40 files changed, 656 insertions(+), 82 deletions(-)
    create mode 100644 arch/arm64/include/asm/scs.h
    create mode 100644 arch/arm64/kernel/scs.c
    create mode 100644 include/linux/scs.h
    create mode 100644 kernel/scs.c

    --
    2.23.0.866.gb869b98d4c-goog

    \
     
     \ /
      Last update: 2019-10-18 18:11    [W:2.138 / U:1.776 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site