-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
arm64: head: avoid relocating the kernel twice for KASLR
Currently, when KASLR is in effect, we set up the kernel virtual address space twice: the first time, the KASLR seed is looked up in the device tree, and the kernel virtual mapping is torn down and recreated again, after which the relocations are applied a second time. The latter step means that statically initialized global pointer variables will be reset to their initial values, and to ensure that BSS variables are not set to values based on the initial translation, they are cleared again as well. All of this is needed because we need the command line (taken from the DT) to tell us whether or not to randomize the virtual address space before entering the kernel proper. However, this code has expanded little by little and now creates global state unrelated to the virtual randomization of the kernel before the mapping is torn down and set up again, and the BSS cleared for a second time. This has created some issues in the past, and it would be better to avoid this little dance if possible. So instead, let's use the temporary mapping of the device tree, and execute the bare minimum of code to decide whether or not KASLR should be enabled, and what the seed is. Only then, create the virtual kernel mapping, clear BSS, etc and proceed as normal. This avoids the issues around inconsistent global state due to BSS being cleared twice, and is generally more maintainable, as it permits us to defer all the remaining DT parsing and KASLR initialization to a later time. This means the relocation fixup code runs only a single time as well, allowing us to simplify the RELR handling code too, which is not idempotent and was therefore required to keep track of the offset that was applied the first time around. Note that this means we have to clone a pair of FDT library objects, so that we can control how they are built - we need the stack protector and other instrumentation disabled so that the code can tolerate being called this early. Note that only the kernel page tables and the temporary stack are mapped read-write at this point, which ensures that the early code does not modify any global state inadvertently. Signed-off-by: Ard Biesheuvel <ardb@kernel.org> Link: https://lore.kernel.org/r/20220624150651.1358849-21-ardb@kernel.org Signed-off-by: Will Deacon <will@kernel.org>
- Loading branch information
Ard Biesheuvel
authored and
Will Deacon
committed
Jun 24, 2022
1 parent
fc5a89f
commit aacd149
Showing
6 changed files
with
171 additions
and
140 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
# SPDX-License-Identifier: GPL-2.0 | ||
# Copyright 2022 Google LLC | ||
|
||
KBUILD_CFLAGS := $(subst $(CC_FLAGS_FTRACE),,$(KBUILD_CFLAGS)) -fpie \ | ||
-Os -DDISABLE_BRANCH_PROFILING $(DISABLE_STACKLEAK_PLUGIN) \ | ||
$(call cc-option,-mbranch-protection=none) \ | ||
-I$(srctree)/scripts/dtc/libfdt -fno-stack-protector \ | ||
-include $(srctree)/include/linux/hidden.h \ | ||
-D__DISABLE_EXPORTS -ffreestanding -D__NO_FORTIFY \ | ||
$(call cc-option,-fno-addrsig) | ||
|
||
# remove SCS flags from all objects in this directory | ||
KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_SCS), $(KBUILD_CFLAGS)) | ||
# disable LTO | ||
KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_LTO), $(KBUILD_CFLAGS)) | ||
|
||
GCOV_PROFILE := n | ||
KASAN_SANITIZE := n | ||
KCSAN_SANITIZE := n | ||
UBSAN_SANITIZE := n | ||
KCOV_INSTRUMENT := n | ||
|
||
$(obj)/%.pi.o: OBJCOPYFLAGS := --prefix-symbols=__pi_ \ | ||
--remove-section=.note.gnu.property \ | ||
--prefix-alloc-sections=.init | ||
$(obj)/%.pi.o: $(obj)/%.o FORCE | ||
$(call if_changed,objcopy) | ||
|
||
$(obj)/lib-%.o: $(srctree)/lib/%.c FORCE | ||
$(call if_changed_rule,cc_o_c) | ||
|
||
obj-y := kaslr_early.pi.o lib-fdt.pi.o lib-fdt_ro.pi.o | ||
extra-y := $(patsubst %.pi.o,%.o,$(obj-y)) |
Oops, something went wrong.