randstruct: Move seed generation into scripts/basic/
authorKees Cook <keescook@chromium.org>
Tue, 3 May 2022 20:55:02 +0000 (13:55 -0700)
committerKees Cook <keescook@chromium.org>
Sun, 8 May 2022 08:33:07 +0000 (01:33 -0700)
To enable Clang randstruct support, move the structure layout
randomization seed generation out of scripts/gcc-plugins/ into
scripts/basic/ so it happens early enough that it can be used by either
compiler implementation. The gcc-plugin still builds its own header file,
but now does so from the common "randstruct.seed" file.

Cc: linux-hardening@vger.kernel.org
Signed-off-by: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20220503205503.3054173-6-keescook@chromium.org
Documentation/dontdiff
Documentation/kbuild/reproducible-builds.rst
include/linux/vermagic.h
scripts/basic/.gitignore
scripts/basic/Makefile
scripts/gcc-plugins/Makefile
scripts/gcc-plugins/gen-random-seed.sh [deleted file]
scripts/gen-randstruct-seed.sh [new file with mode: 0755]
security/Kconfig.hardening

index 910b30a2a7d98b89ce3b9bc6afb7a88aa7c8025c..352ff53a2306ad897f5ef3e20ade4ca27f664471 100644 (file)
@@ -211,6 +211,7 @@ r200_reg_safe.h
 r300_reg_safe.h
 r420_reg_safe.h
 r600_reg_safe.h
+randstruct.seed
 randomize_layout_hash.h
 randomize_layout_seed.h
 recordmcount
index 81ff30505d35410485c1f43aa7a8420110cac209..071f0151a7a4e2414edeafb5d41f349cb46f55d6 100644 (file)
@@ -100,8 +100,9 @@ Structure randomisation
 -----------------------
 
 If you enable ``CONFIG_RANDSTRUCT``, you will need to pre-generate
-the random seed in ``scripts/gcc-plugins/randomize_layout_seed.h``
-so the same value is used in rebuilds.
+the random seed in ``scripts/basic/randstruct.seed`` so the same
+value is used by each build. See ``scripts/gen-randstruct-seed.sh``
+for details.
 
 Debug info conflicts
 --------------------
index efb51a2da599521d89bed78a5992c542238f6db3..a54046bf37e55bd5460c3f0d090346e443f96c95 100644 (file)
@@ -33,7 +33,7 @@
 #define MODULE_VERMAGIC_MODVERSIONS ""
 #endif
 #ifdef RANDSTRUCT
-#include <generated/randomize_layout_hash.h>
+#include <generated/randstruct_hash.h>
 #define MODULE_RANDSTRUCT "RANDSTRUCT_" RANDSTRUCT_HASHED_SEED
 #else
 #define MODULE_RANDSTRUCT
index 961c91c8a884614a852e620346b6346ecbd4b1a1..07c195f605a1b247760981eb48d387ceaa2b7f46 100644 (file)
@@ -1,2 +1,3 @@
 # SPDX-License-Identifier: GPL-2.0-only
 /fixdep
+/randstruct.seed
index eeb6a38c5551516bc3b1539e5f236ff952fea394..dd289a6725aca60c596ae4c7ec831775b98a495a 100644 (file)
@@ -3,3 +3,14 @@
 # fixdep: used to generate dependency information during build process
 
 hostprogs-always-y     += fixdep
+
+# randstruct: the seed is needed before building the gcc-plugin or
+# before running a Clang kernel build.
+gen-randstruct-seed    := $(srctree)/scripts/gen-randstruct-seed.sh
+quiet_cmd_create_randstruct_seed = GENSEED $@
+cmd_create_randstruct_seed = \
+       $(CONFIG_SHELL) $(gen-randstruct-seed) \
+               $@ $(objtree)/include/generated/randstruct_hash.h
+$(obj)/randstruct.seed: $(gen-randstruct-seed) FORCE
+       $(call if_changed,create_randstruct_seed)
+always-$(CONFIG_RANDSTRUCT) += randstruct.seed
index 1952d3bb80c6979ab2ffdf2423589cacb4d25602..148f4639cf097c4dac93ed4d9aa85cd69baa3e15 100644 (file)
@@ -1,12 +1,17 @@
 # SPDX-License-Identifier: GPL-2.0
 
-$(obj)/randomize_layout_plugin.so: $(objtree)/$(obj)/randomize_layout_seed.h
-quiet_cmd_create_randomize_layout_seed = GENSEED $@
+$(obj)/randomize_layout_plugin.so: $(obj)/randomize_layout_seed.h
+quiet_cmd_create_randomize_layout_seed = SEEDHDR $@
 cmd_create_randomize_layout_seed = \
-  $(CONFIG_SHELL) $(srctree)/$(src)/gen-random-seed.sh $@ $(objtree)/include/generated/randomize_layout_hash.h
-$(objtree)/$(obj)/randomize_layout_seed.h: FORCE
+       SEED=$$(cat $(filter-out FORCE,$^) </dev/null); \
+       echo '/*' > $@; \
+       echo ' * This file is automatically generated. Keep it private.' >> $@; \
+       echo ' * Exposing this value will expose the layout of randomized structures.' >> $@; \
+       echo ' */' >> $@; \
+       echo "const char *randstruct_seed = \"$$SEED\";" >> $@
+$(obj)/randomize_layout_seed.h: $(objtree)/scripts/basic/randstruct.seed FORCE
        $(call if_changed,create_randomize_layout_seed)
-targets += randomize_layout_seed.h randomize_layout_hash.h
+targets += randomize_layout_seed.h
 
 # Build rules for plugins
 #
diff --git a/scripts/gcc-plugins/gen-random-seed.sh b/scripts/gcc-plugins/gen-random-seed.sh
deleted file mode 100755 (executable)
index 68af5cc..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/sh
-# SPDX-License-Identifier: GPL-2.0
-
-if [ ! -f "$1" ]; then
-       SEED=`od -A n -t x8 -N 32 /dev/urandom | tr -d ' \n'`
-       echo "const char *randstruct_seed = \"$SEED\";" > "$1"
-       HASH=`echo -n "$SEED" | sha256sum | cut -d" " -f1 | tr -d ' \n'`
-       echo "#define RANDSTRUCT_HASHED_SEED \"$HASH\"" > "$2"
-fi
diff --git a/scripts/gen-randstruct-seed.sh b/scripts/gen-randstruct-seed.sh
new file mode 100755 (executable)
index 0000000..61017b3
--- /dev/null
@@ -0,0 +1,7 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0
+
+SEED=$(od -A n -t x8 -N 32 /dev/urandom | tr -d ' \n')
+echo "$SEED" > "$1"
+HASH=$(echo -n "$SEED" | sha256sum | cut -d" " -f1)
+echo "#define RANDSTRUCT_HASHED_SEED \"$HASH\"" > "$2"
index 364e3f8c6eeae9d6dc3b4ffebadb1ef77609f5a7..0277ba578779866cb96bb5521774cd02b6278039 100644 (file)
@@ -284,10 +284,11 @@ choice
          tools like Volatility against the system (unless the kernel
          source tree isn't cleaned after kernel installation).
 
-         The seed used for compilation is located at
-         scripts/randomize_layout_seed.h. It remains after a "make clean"
-         to allow for external modules to be compiled with the existing
-         seed and will be removed by a "make mrproper" or "make distclean".
+         The seed used for compilation is in scripts/basic/randomize.seed.
+         It remains after a "make clean" to allow for external modules to
+         be compiled with the existing seed and will be removed by a
+         "make mrproper" or "make distclean". This file should not be made
+         public, or the structure layout can be determined.
 
        config RANDSTRUCT_NONE
                bool "Disable structure layout randomization"