mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-28 09:31:14 +00:00
Merge branch 'merge/randstruct' into for-next/gcc-plugins
This commit is contained in:
commit
d1185a8c5d
14 changed files with 1146 additions and 9 deletions
|
@ -207,6 +207,8 @@ r200_reg_safe.h
|
||||||
r300_reg_safe.h
|
r300_reg_safe.h
|
||||||
r420_reg_safe.h
|
r420_reg_safe.h
|
||||||
r600_reg_safe.h
|
r600_reg_safe.h
|
||||||
|
randomize_layout_hash.h
|
||||||
|
randomize_layout_seed.h
|
||||||
recordmcount
|
recordmcount
|
||||||
relocs
|
relocs
|
||||||
rlim_names.h
|
rlim_names.h
|
||||||
|
|
41
arch/Kconfig
41
arch/Kconfig
|
@ -425,7 +425,7 @@ config GCC_PLUGIN_STRUCTLEAK
|
||||||
bool "Force initialization of variables containing userspace addresses"
|
bool "Force initialization of variables containing userspace addresses"
|
||||||
depends on GCC_PLUGINS
|
depends on GCC_PLUGINS
|
||||||
help
|
help
|
||||||
This plugin zero-initializes any structures that containing a
|
This plugin zero-initializes any structures containing a
|
||||||
__user attribute. This can prevent some classes of information
|
__user attribute. This can prevent some classes of information
|
||||||
exposures.
|
exposures.
|
||||||
|
|
||||||
|
@ -443,6 +443,45 @@ config GCC_PLUGIN_STRUCTLEAK_VERBOSE
|
||||||
initialized. Since not all existing initializers are detected
|
initialized. Since not all existing initializers are detected
|
||||||
by the plugin, this can produce false positive warnings.
|
by the plugin, this can produce false positive warnings.
|
||||||
|
|
||||||
|
config GCC_PLUGIN_RANDSTRUCT
|
||||||
|
bool "Randomize layout of sensitive kernel structures"
|
||||||
|
depends on GCC_PLUGINS
|
||||||
|
select MODVERSIONS if MODULES
|
||||||
|
help
|
||||||
|
If you say Y here, the layouts of structures explicitly
|
||||||
|
marked by __randomize_layout will be randomized at
|
||||||
|
compile-time. This can introduce the requirement of an
|
||||||
|
additional information exposure vulnerability for exploits
|
||||||
|
targeting these structure types.
|
||||||
|
|
||||||
|
Enabling this feature will introduce some performance impact,
|
||||||
|
slightly increase memory usage, and prevent the use of forensic
|
||||||
|
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/gcc-plgins/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.
|
||||||
|
|
||||||
|
Note that the implementation requires gcc 4.7 or newer.
|
||||||
|
|
||||||
|
This plugin was ported from grsecurity/PaX. More information at:
|
||||||
|
* https://grsecurity.net/
|
||||||
|
* https://pax.grsecurity.net/
|
||||||
|
|
||||||
|
config GCC_PLUGIN_RANDSTRUCT_PERFORMANCE
|
||||||
|
bool "Use cacheline-aware structure randomization"
|
||||||
|
depends on GCC_PLUGIN_RANDSTRUCT
|
||||||
|
depends on !COMPILE_TEST
|
||||||
|
help
|
||||||
|
If you say Y here, the RANDSTRUCT randomization will make a
|
||||||
|
best effort at restricting randomization to cacheline-sized
|
||||||
|
groups of elements. It will further not randomize bitfields
|
||||||
|
in structures. This reduces the performance hit of RANDSTRUCT
|
||||||
|
at the cost of weakened randomization.
|
||||||
|
|
||||||
config HAVE_CC_STACKPROTECTOR
|
config HAVE_CC_STACKPROTECTOR
|
||||||
bool
|
bool
|
||||||
help
|
help
|
||||||
|
|
|
@ -87,6 +87,8 @@
|
||||||
#define CALGN(code...)
|
#define CALGN(code...)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define IMM12_MASK 0xfff
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Enable and disable interrupts
|
* Enable and disable interrupts
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -797,7 +797,10 @@ ENTRY(__switch_to)
|
||||||
#if defined(CONFIG_CC_STACKPROTECTOR) && !defined(CONFIG_SMP)
|
#if defined(CONFIG_CC_STACKPROTECTOR) && !defined(CONFIG_SMP)
|
||||||
ldr r7, [r2, #TI_TASK]
|
ldr r7, [r2, #TI_TASK]
|
||||||
ldr r8, =__stack_chk_guard
|
ldr r8, =__stack_chk_guard
|
||||||
ldr r7, [r7, #TSK_STACK_CANARY]
|
.if (TSK_STACK_CANARY > IMM12_MASK)
|
||||||
|
add r7, r7, #TSK_STACK_CANARY & ~IMM12_MASK
|
||||||
|
.endif
|
||||||
|
ldr r7, [r7, #TSK_STACK_CANARY & IMM12_MASK]
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_CPU_USE_DOMAINS
|
#ifdef CONFIG_CPU_USE_DOMAINS
|
||||||
mcr p15, 0, r6, c3, c0, 0 @ Set domain register
|
mcr p15, 0, r6, c3, c0, 0 @ Set domain register
|
||||||
|
|
|
@ -25,11 +25,6 @@
|
||||||
ldr \rd, [\rn, #VMA_VM_FLAGS]
|
ldr \rd, [\rn, #VMA_VM_FLAGS]
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro tsk_mm, rd, rn
|
|
||||||
ldr \rd, [\rn, #TI_TASK]
|
|
||||||
ldr \rd, [\rd, #TSK_ACTIVE_MM]
|
|
||||||
.endm
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* act_mm - get current->active_mm
|
* act_mm - get current->active_mm
|
||||||
*/
|
*/
|
||||||
|
@ -37,7 +32,10 @@
|
||||||
bic \rd, sp, #8128
|
bic \rd, sp, #8128
|
||||||
bic \rd, \rd, #63
|
bic \rd, \rd, #63
|
||||||
ldr \rd, [\rd, #TI_TASK]
|
ldr \rd, [\rd, #TI_TASK]
|
||||||
ldr \rd, [\rd, #TSK_ACTIVE_MM]
|
.if (TSK_ACTIVE_MM > IMM12_MASK)
|
||||||
|
add \rd, \rd, #TSK_ACTIVE_MM & ~IMM12_MASK
|
||||||
|
.endif
|
||||||
|
ldr \rd, [\rd, #TSK_ACTIVE_MM & IMM12_MASK]
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -223,6 +223,11 @@
|
||||||
/* Mark a function definition as prohibited from being cloned. */
|
/* Mark a function definition as prohibited from being cloned. */
|
||||||
#define __noclone __attribute__((__noclone__, __optimize__("no-tracer")))
|
#define __noclone __attribute__((__noclone__, __optimize__("no-tracer")))
|
||||||
|
|
||||||
|
#ifdef RANDSTRUCT_PLUGIN
|
||||||
|
#define __randomize_layout __attribute__((randomize_layout))
|
||||||
|
#define __no_randomize_layout __attribute__((no_randomize_layout))
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* GCC_VERSION >= 40500 */
|
#endif /* GCC_VERSION >= 40500 */
|
||||||
|
|
||||||
#if GCC_VERSION >= 40600
|
#if GCC_VERSION >= 40600
|
||||||
|
@ -294,6 +299,14 @@
|
||||||
#define __no_sanitize_address __attribute__((no_sanitize_address))
|
#define __no_sanitize_address __attribute__((no_sanitize_address))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if GCC_VERSION >= 50100
|
||||||
|
/*
|
||||||
|
* Mark structures as requiring designated initializers.
|
||||||
|
* https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
|
||||||
|
*/
|
||||||
|
#define __designated_init __attribute__((designated_init))
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* gcc version >= 40000 specific checks */
|
#endif /* gcc version >= 40000 specific checks */
|
||||||
|
|
||||||
#if !defined(__noclone)
|
#if !defined(__noclone)
|
||||||
|
|
|
@ -440,10 +440,22 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s
|
||||||
# define __attribute_const__ /* unimplemented */
|
# define __attribute_const__ /* unimplemented */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef __designated_init
|
||||||
|
# define __designated_init
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef __latent_entropy
|
#ifndef __latent_entropy
|
||||||
# define __latent_entropy
|
# define __latent_entropy
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef __randomize_layout
|
||||||
|
# define __randomize_layout __designated_init
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __no_randomize_layout
|
||||||
|
# define __no_randomize_layout
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Tell gcc if a function is cold. The compiler will assume any path
|
* Tell gcc if a function is cold. The compiler will assume any path
|
||||||
* directly leading to the call is unlikely.
|
* directly leading to the call is unlikely.
|
||||||
|
|
|
@ -24,10 +24,17 @@
|
||||||
#ifndef MODULE_ARCH_VERMAGIC
|
#ifndef MODULE_ARCH_VERMAGIC
|
||||||
#define MODULE_ARCH_VERMAGIC ""
|
#define MODULE_ARCH_VERMAGIC ""
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef RANDSTRUCT_PLUGIN
|
||||||
|
#include <generated/randomize_layout_hash.h>
|
||||||
|
#define MODULE_RANDSTRUCT_PLUGIN "RANDSTRUCT_PLUGIN_" RANDSTRUCT_HASHED_SEED
|
||||||
|
#else
|
||||||
|
#define MODULE_RANDSTRUCT_PLUGIN
|
||||||
|
#endif
|
||||||
|
|
||||||
#define VERMAGIC_STRING \
|
#define VERMAGIC_STRING \
|
||||||
UTS_RELEASE " " \
|
UTS_RELEASE " " \
|
||||||
MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT \
|
MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT \
|
||||||
MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS \
|
MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS \
|
||||||
MODULE_ARCH_VERMAGIC
|
MODULE_ARCH_VERMAGIC \
|
||||||
|
MODULE_RANDSTRUCT_PLUGIN
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,10 @@ ifdef CONFIG_GCC_PLUGINS
|
||||||
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK_VERBOSE) += -fplugin-arg-structleak_plugin-verbose
|
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK_VERBOSE) += -fplugin-arg-structleak_plugin-verbose
|
||||||
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK) += -DSTRUCTLEAK_PLUGIN
|
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK) += -DSTRUCTLEAK_PLUGIN
|
||||||
|
|
||||||
|
gcc-plugin-$(CONFIG_GCC_PLUGIN_RANDSTRUCT) += randomize_layout_plugin.so
|
||||||
|
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_RANDSTRUCT) += -DRANDSTRUCT_PLUGIN
|
||||||
|
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_RANDSTRUCT_PERFORMANCE) += -fplugin-arg-randomize_layout_plugin-performance-mode
|
||||||
|
|
||||||
GCC_PLUGINS_CFLAGS := $(strip $(addprefix -fplugin=$(objtree)/scripts/gcc-plugins/, $(gcc-plugin-y)) $(gcc-plugin-cflags-y))
|
GCC_PLUGINS_CFLAGS := $(strip $(addprefix -fplugin=$(objtree)/scripts/gcc-plugins/, $(gcc-plugin-y)) $(gcc-plugin-cflags-y))
|
||||||
|
|
||||||
export PLUGINCC GCC_PLUGINS_CFLAGS GCC_PLUGIN GCC_PLUGIN_SUBDIR
|
export PLUGINCC GCC_PLUGINS_CFLAGS GCC_PLUGIN GCC_PLUGIN_SUBDIR
|
||||||
|
|
1
scripts/gcc-plugins/.gitignore
vendored
Normal file
1
scripts/gcc-plugins/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
randomize_layout_seed.h
|
|
@ -18,6 +18,14 @@ endif
|
||||||
|
|
||||||
export HOSTLIBS
|
export HOSTLIBS
|
||||||
|
|
||||||
|
$(obj)/randomize_layout_plugin.o: $(objtree)/$(obj)/randomize_layout_seed.h
|
||||||
|
quiet_cmd_create_randomize_layout_seed = GENSEED $@
|
||||||
|
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
|
||||||
|
$(call if_changed,create_randomize_layout_seed)
|
||||||
|
targets = randomize_layout_seed.h randomize_layout_hash.h
|
||||||
|
|
||||||
$(HOSTLIBS)-y := $(foreach p,$(GCC_PLUGIN),$(if $(findstring /,$(p)),,$(p)))
|
$(HOSTLIBS)-y := $(foreach p,$(GCC_PLUGIN),$(if $(findstring /,$(p)),,$(p)))
|
||||||
always := $($(HOSTLIBS)-y)
|
always := $($(HOSTLIBS)-y)
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,13 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if BUILDING_GCC_VERSION >= 4006
|
#if BUILDING_GCC_VERSION >= 4006
|
||||||
|
/*
|
||||||
|
* The c-family headers were moved into a subdirectory in GCC version
|
||||||
|
* 4.7, but most plugin-building users of GCC 4.6 are using the Debian
|
||||||
|
* or Ubuntu package, which has an out-of-tree patch to move this to the
|
||||||
|
* same location as found in 4.7 and later:
|
||||||
|
* https://sources.debian.net/src/gcc-4.6/4.6.3-14/debian/patches/pr45078.diff/
|
||||||
|
*/
|
||||||
#include "c-family/c-common.h"
|
#include "c-family/c-common.h"
|
||||||
#else
|
#else
|
||||||
#include "c-common.h"
|
#include "c-common.h"
|
||||||
|
@ -946,4 +953,9 @@ static inline void debug_gimple_stmt(const_gimple s)
|
||||||
get_inner_reference(exp, pbitsize, pbitpos, poffset, pmode, punsignedp, preversep, pvolatilep)
|
get_inner_reference(exp, pbitsize, pbitpos, poffset, pmode, punsignedp, preversep, pvolatilep)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if BUILDING_GCC_VERSION < 7000
|
||||||
|
#define SET_DECL_ALIGN(decl, align) DECL_ALIGN(decl) = (align)
|
||||||
|
#define SET_DECL_MODE(decl, mode) DECL_MODE(decl) = (mode)
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
8
scripts/gcc-plugins/gen-random-seed.sh
Normal file
8
scripts/gcc-plugins/gen-random-seed.sh
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
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
|
1028
scripts/gcc-plugins/randomize_layout_plugin.c
Normal file
1028
scripts/gcc-plugins/randomize_layout_plugin.c
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue