Skip to content

Commit 74afda4

Browse files
kristina-martsenkoctmarinas
authored andcommitted
arm64: compile the kernel with ptrauth return address signing
Compile all functions with two ptrauth instructions: PACIASP in the prologue to sign the return address, and AUTIASP in the epilogue to authenticate the return address (from the stack). If authentication fails, the return will cause an instruction abort to be taken, followed by an oops and killing the task. This should help protect the kernel against attacks using return-oriented programming. As ptrauth protects the return address, it can also serve as a replacement for CONFIG_STACKPROTECTOR, although note that it does not protect other parts of the stack. The new instructions are in the HINT encoding space, so on a system without ptrauth they execute as NOPs. CONFIG_ARM64_PTR_AUTH now not only enables ptrauth for userspace and KVM guests, but also automatically builds the kernel with ptrauth instructions if the compiler supports it. If there is no compiler support, we do not warn that the kernel was built without ptrauth instructions. GCC 7 and 8 support the -msign-return-address option, while GCC 9 deprecates that option and replaces it with -mbranch-protection. Support both options. Clang uses an external assembler hence this patch makes sure that the correct parameters (-march=armv8.3-a) are passed down to help it recognize the ptrauth instructions. Ftrace function tracer works properly with Ptrauth only when patchable-function-entry feature is present and is ensured by the Kconfig dependency. Cc: Catalin Marinas <[email protected]> Cc: Will Deacon <[email protected]> Cc: Masahiro Yamada <[email protected]> Reviewed-by: Kees Cook <[email protected]> Reviewed-by: Vincenzo Frascino <[email protected]> # not co-dev parts Co-developed-by: Vincenzo Frascino <[email protected]> Signed-off-by: Vincenzo Frascino <[email protected]> Signed-off-by: Kristina Martsenko <[email protected]> [Amit: Cover leaf function, comments, Ftrace Kconfig] Signed-off-by: Amit Daniel Kachhap <[email protected]> Signed-off-by: Catalin Marinas <[email protected]>
1 parent c2d920b commit 74afda4

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

arch/arm64/Kconfig

+23-1
Original file line numberDiff line numberDiff line change
@@ -1499,18 +1499,26 @@ config ARM64_PTR_AUTH
14991499
bool "Enable support for pointer authentication"
15001500
default y
15011501
depends on !KVM || ARM64_VHE
1502+
depends on (CC_HAS_SIGN_RETURN_ADDRESS || CC_HAS_BRANCH_PROT_PAC_RET) && AS_HAS_PAC
1503+
depends on (!FUNCTION_GRAPH_TRACER || DYNAMIC_FTRACE_WITH_REGS)
15021504
help
15031505
Pointer authentication (part of the ARMv8.3 Extensions) provides
15041506
instructions for signing and authenticating pointers against secret
15051507
keys, which can be used to mitigate Return Oriented Programming (ROP)
15061508
and other attacks.
15071509

15081510
This option enables these instructions at EL0 (i.e. for userspace).
1509-
15101511
Choosing this option will cause the kernel to initialise secret keys
15111512
for each process at exec() time, with these keys being
15121513
context-switched along with the process.
15131514

1515+
If the compiler supports the -mbranch-protection or
1516+
-msign-return-address flag (e.g. GCC 7 or later), then this option
1517+
will also cause the kernel itself to be compiled with return address
1518+
protection. In this case, and if the target hardware is known to
1519+
support pointer authentication, then CONFIG_STACKPROTECTOR can be
1520+
disabled with minimal loss of protection.
1521+
15141522
The feature is detected at runtime. If the feature is not present in
15151523
hardware it will not be advertised to userspace/KVM guest nor will it
15161524
be enabled. However, KVM guest also require VHE mode and hence
@@ -1522,6 +1530,20 @@ config ARM64_PTR_AUTH
15221530
but with the feature disabled. On such a system, this option should
15231531
not be selected.
15241532

1533+
This feature works with FUNCTION_GRAPH_TRACER option only if
1534+
DYNAMIC_FTRACE_WITH_REGS is enabled.
1535+
1536+
config CC_HAS_BRANCH_PROT_PAC_RET
1537+
# GCC 9 or later, clang 8 or later
1538+
def_bool $(cc-option,-mbranch-protection=pac-ret+leaf)
1539+
1540+
config CC_HAS_SIGN_RETURN_ADDRESS
1541+
# GCC 7, 8
1542+
def_bool $(cc-option,-msign-return-address=all)
1543+
1544+
config AS_HAS_PAC
1545+
def_bool $(as-option,-Wa$(comma)-march=armv8.3-a)
1546+
15251547
endmenu
15261548

15271549
menu "ARMv8.5 architectural features"

arch/arm64/Makefile

+11
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,17 @@ stack_protector_prepare: prepare0
6565
include/generated/asm-offsets.h))
6666
endif
6767

68+
ifeq ($(CONFIG_ARM64_PTR_AUTH),y)
69+
branch-prot-flags-$(CONFIG_CC_HAS_SIGN_RETURN_ADDRESS) := -msign-return-address=all
70+
branch-prot-flags-$(CONFIG_CC_HAS_BRANCH_PROT_PAC_RET) := -mbranch-protection=pac-ret+leaf
71+
# -march=armv8.3-a enables the non-nops instructions for PAC, to avoid the
72+
# compiler to generate them and consequently to break the single image contract
73+
# we pass it only to the assembler. This option is utilized only in case of non
74+
# integrated assemblers.
75+
branch-prot-flags-$(CONFIG_AS_HAS_PAC) += -Wa,-march=armv8.3-a
76+
KBUILD_CFLAGS += $(branch-prot-flags-y)
77+
endif
78+
6879
ifeq ($(CONFIG_CPU_BIG_ENDIAN), y)
6980
KBUILD_CPPFLAGS += -mbig-endian
7081
CHECKFLAGS += -D__AARCH64EB__

0 commit comments

Comments
 (0)