289 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			289 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| # SPDX-License-Identifier: GPL-2.0-only
 | |
| menu "Kernel hardening options"
 | |
| 
 | |
| config GCC_PLUGIN_STRUCTLEAK
 | |
| 	bool
 | |
| 	help
 | |
| 	  While the kernel is built with warnings enabled for any missed
 | |
| 	  stack variable initializations, this warning is silenced for
 | |
| 	  anything passed by reference to another function, under the
 | |
| 	  occasionally misguided assumption that the function will do
 | |
| 	  the initialization. As this regularly leads to exploitable
 | |
| 	  flaws, this plugin is available to identify and zero-initialize
 | |
| 	  such variables, depending on the chosen level of coverage.
 | |
| 
 | |
| 	  This plugin was originally ported from grsecurity/PaX. More
 | |
| 	  information at:
 | |
| 	   * https://grsecurity.net/
 | |
| 	   * https://pax.grsecurity.net/
 | |
| 
 | |
| menu "Memory initialization"
 | |
| 
 | |
| config CC_HAS_AUTO_VAR_INIT_PATTERN
 | |
| 	def_bool $(cc-option,-ftrivial-auto-var-init=pattern)
 | |
| 
 | |
| config CC_HAS_AUTO_VAR_INIT_ZERO
 | |
| 	def_bool $(cc-option,-ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang)
 | |
| 
 | |
| choice
 | |
| 	prompt "Initialize kernel stack variables at function entry"
 | |
| 	default GCC_PLUGIN_STRUCTLEAK_BYREF_ALL if COMPILE_TEST && GCC_PLUGINS
 | |
| 	default INIT_STACK_ALL_PATTERN if COMPILE_TEST && CC_HAS_AUTO_VAR_INIT_PATTERN
 | |
| 	default INIT_STACK_NONE
 | |
| 	help
 | |
| 	  This option enables initialization of stack variables at
 | |
| 	  function entry time. This has the possibility to have the
 | |
| 	  greatest coverage (since all functions can have their
 | |
| 	  variables initialized), but the performance impact depends
 | |
| 	  on the function calling complexity of a given workload's
 | |
| 	  syscalls.
 | |
| 
 | |
| 	  This chooses the level of coverage over classes of potentially
 | |
| 	  uninitialized variables. The selected class will be
 | |
| 	  initialized before use in a function.
 | |
| 
 | |
| 	config INIT_STACK_NONE
 | |
| 		bool "no automatic initialization (weakest)"
 | |
| 		help
 | |
| 		  Disable automatic stack variable initialization.
 | |
| 		  This leaves the kernel vulnerable to the standard
 | |
| 		  classes of uninitialized stack variable exploits
 | |
| 		  and information exposures.
 | |
| 
 | |
| 	config GCC_PLUGIN_STRUCTLEAK_USER
 | |
| 		bool "zero-init structs marked for userspace (weak)"
 | |
| 		depends on GCC_PLUGINS
 | |
| 		select GCC_PLUGIN_STRUCTLEAK
 | |
| 		help
 | |
| 		  Zero-initialize any structures on the stack containing
 | |
| 		  a __user attribute. This can prevent some classes of
 | |
| 		  uninitialized stack variable exploits and information
 | |
| 		  exposures, like CVE-2013-2141:
 | |
| 		  https://git.kernel.org/linus/b9e146d8eb3b9eca
 | |
| 
 | |
| 	config GCC_PLUGIN_STRUCTLEAK_BYREF
 | |
| 		bool "zero-init structs passed by reference (strong)"
 | |
| 		depends on GCC_PLUGINS
 | |
| 		depends on !(KASAN && KASAN_STACK)
 | |
| 		select GCC_PLUGIN_STRUCTLEAK
 | |
| 		help
 | |
| 		  Zero-initialize any structures on the stack that may
 | |
| 		  be passed by reference and had not already been
 | |
| 		  explicitly initialized. This can prevent most classes
 | |
| 		  of uninitialized stack variable exploits and information
 | |
| 		  exposures, like CVE-2017-1000410:
 | |
| 		  https://git.kernel.org/linus/06e7e776ca4d3654
 | |
| 
 | |
| 		  As a side-effect, this keeps a lot of variables on the
 | |
| 		  stack that can otherwise be optimized out, so combining
 | |
| 		  this with CONFIG_KASAN_STACK can lead to a stack overflow
 | |
| 		  and is disallowed.
 | |
| 
 | |
| 	config GCC_PLUGIN_STRUCTLEAK_BYREF_ALL
 | |
| 		bool "zero-init anything passed by reference (very strong)"
 | |
| 		depends on GCC_PLUGINS
 | |
| 		depends on !(KASAN && KASAN_STACK)
 | |
| 		select GCC_PLUGIN_STRUCTLEAK
 | |
| 		help
 | |
| 		  Zero-initialize any stack variables that may be passed
 | |
| 		  by reference and had not already been explicitly
 | |
| 		  initialized. This is intended to eliminate all classes
 | |
| 		  of uninitialized stack variable exploits and information
 | |
| 		  exposures.
 | |
| 
 | |
| 	config INIT_STACK_ALL_PATTERN
 | |
| 		bool "0xAA-init everything on the stack (strongest)"
 | |
| 		depends on CC_HAS_AUTO_VAR_INIT_PATTERN
 | |
| 		depends on !KMSAN
 | |
| 		help
 | |
| 		  Initializes everything on the stack with a 0xAA
 | |
| 		  pattern. This is intended to eliminate all classes
 | |
| 		  of uninitialized stack variable exploits and information
 | |
| 		  exposures, even variables that were warned to have been
 | |
| 		  left uninitialized.
 | |
| 
 | |
| 		  Pattern initialization is known to provoke many existing bugs
 | |
| 		  related to uninitialized locals, e.g. pointers receive
 | |
| 		  non-NULL values, buffer sizes and indices are very big.
 | |
| 
 | |
| 	config INIT_STACK_ALL_ZERO
 | |
| 		bool "zero-init everything on the stack (strongest and safest)"
 | |
| 		depends on CC_HAS_AUTO_VAR_INIT_ZERO
 | |
| 		depends on !KMSAN
 | |
| 		help
 | |
| 		  Initializes everything on the stack with a zero
 | |
| 		  value. This is intended to eliminate all classes
 | |
| 		  of uninitialized stack variable exploits and information
 | |
| 		  exposures, even variables that were warned to have been
 | |
| 		  left uninitialized.
 | |
| 
 | |
| 		  Zero initialization provides safe defaults for strings,
 | |
| 		  pointers, indices and sizes, and is therefore
 | |
| 		  more suitable as a security mitigation measure.
 | |
| 
 | |
| endchoice
 | |
| 
 | |
| config GCC_PLUGIN_STRUCTLEAK_VERBOSE
 | |
| 	bool "Report forcefully initialized variables"
 | |
| 	depends on GCC_PLUGIN_STRUCTLEAK
 | |
| 	depends on !COMPILE_TEST	# too noisy
 | |
| 	help
 | |
| 	  This option will cause a warning to be printed each time the
 | |
| 	  structleak plugin finds a variable it thinks needs to be
 | |
| 	  initialized. Since not all existing initializers are detected
 | |
| 	  by the plugin, this can produce false positive warnings.
 | |
| 
 | |
| config GCC_PLUGIN_STACKLEAK
 | |
| 	bool "Poison kernel stack before returning from syscalls"
 | |
| 	depends on GCC_PLUGINS
 | |
| 	depends on HAVE_ARCH_STACKLEAK
 | |
| 	help
 | |
| 	  This option makes the kernel erase the kernel stack before
 | |
| 	  returning from system calls. This has the effect of leaving
 | |
| 	  the stack initialized to the poison value, which both reduces
 | |
| 	  the lifetime of any sensitive stack contents and reduces
 | |
| 	  potential for uninitialized stack variable exploits or information
 | |
| 	  exposures (it does not cover functions reaching the same stack
 | |
| 	  depth as prior functions during the same syscall). This blocks
 | |
| 	  most uninitialized stack variable attacks, with the performance
 | |
| 	  impact being driven by the depth of the stack usage, rather than
 | |
| 	  the function calling complexity.
 | |
| 
 | |
| 	  The performance impact on a single CPU system kernel compilation
 | |
| 	  sees a 1% slowdown, other systems and workloads may vary and you
 | |
| 	  are advised to test this feature on your expected workload before
 | |
| 	  deploying it.
 | |
| 
 | |
| 	  This plugin was ported from grsecurity/PaX. More information at:
 | |
| 	   * https://grsecurity.net/
 | |
| 	   * https://pax.grsecurity.net/
 | |
| 
 | |
| config STACKLEAK_TRACK_MIN_SIZE
 | |
| 	int "Minimum stack frame size of functions tracked by STACKLEAK"
 | |
| 	default 100
 | |
| 	range 0 4096
 | |
| 	depends on GCC_PLUGIN_STACKLEAK
 | |
| 	help
 | |
| 	  The STACKLEAK gcc plugin instruments the kernel code for tracking
 | |
| 	  the lowest border of the kernel stack (and for some other purposes).
 | |
| 	  It inserts the stackleak_track_stack() call for the functions with
 | |
| 	  a stack frame size greater than or equal to this parameter.
 | |
| 	  If unsure, leave the default value 100.
 | |
| 
 | |
| config STACKLEAK_METRICS
 | |
| 	bool "Show STACKLEAK metrics in the /proc file system"
 | |
| 	depends on GCC_PLUGIN_STACKLEAK
 | |
| 	depends on PROC_FS
 | |
| 	help
 | |
| 	  If this is set, STACKLEAK metrics for every task are available in
 | |
| 	  the /proc file system. In particular, /proc/<pid>/stack_depth
 | |
| 	  shows the maximum kernel stack consumption for the current and
 | |
| 	  previous syscalls. Although this information is not precise, it
 | |
| 	  can be useful for estimating the STACKLEAK performance impact for
 | |
| 	  your workloads.
 | |
| 
 | |
| config STACKLEAK_RUNTIME_DISABLE
 | |
| 	bool "Allow runtime disabling of kernel stack erasing"
 | |
| 	depends on GCC_PLUGIN_STACKLEAK
 | |
| 	help
 | |
| 	  This option provides 'stack_erasing' sysctl, which can be used in
 | |
| 	  runtime to control kernel stack erasing for kernels built with
 | |
| 	  CONFIG_GCC_PLUGIN_STACKLEAK.
 | |
| 
 | |
| config INIT_ON_ALLOC_DEFAULT_ON
 | |
| 	bool "Enable heap memory zeroing on allocation by default"
 | |
| 	depends on !KMSAN
 | |
| 	help
 | |
| 	  This has the effect of setting "init_on_alloc=1" on the kernel
 | |
| 	  command line. This can be disabled with "init_on_alloc=0".
 | |
| 	  When "init_on_alloc" is enabled, all page allocator and slab
 | |
| 	  allocator memory will be zeroed when allocated, eliminating
 | |
| 	  many kinds of "uninitialized heap memory" flaws, especially
 | |
| 	  heap content exposures. The performance impact varies by
 | |
| 	  workload, but most cases see <1% impact. Some synthetic
 | |
| 	  workloads have measured as high as 7%.
 | |
| 
 | |
| config INIT_ON_FREE_DEFAULT_ON
 | |
| 	bool "Enable heap memory zeroing on free by default"
 | |
| 	depends on !KMSAN
 | |
| 	help
 | |
| 	  This has the effect of setting "init_on_free=1" on the kernel
 | |
| 	  command line. This can be disabled with "init_on_free=0".
 | |
| 	  Similar to "init_on_alloc", when "init_on_free" is enabled,
 | |
| 	  all page allocator and slab allocator memory will be zeroed
 | |
| 	  when freed, eliminating many kinds of "uninitialized heap memory"
 | |
| 	  flaws, especially heap content exposures. The primary difference
 | |
| 	  with "init_on_free" is that data lifetime in memory is reduced,
 | |
| 	  as anything freed is wiped immediately, making live forensics or
 | |
| 	  cold boot memory attacks unable to recover freed memory contents.
 | |
| 	  The performance impact varies by workload, but is more expensive
 | |
| 	  than "init_on_alloc" due to the negative cache effects of
 | |
| 	  touching "cold" memory areas. Most cases see 3-5% impact. Some
 | |
| 	  synthetic workloads have measured as high as 8%.
 | |
| 
 | |
| endmenu
 | |
| 
 | |
| choice
 | |
| 	prompt "Randomize layout of sensitive kernel structures"
 | |
| 	default RANDSTRUCT_FULL if COMPILE_TEST && GCC_PLUGINS
 | |
| 	default RANDSTRUCT_NONE
 | |
| 	help
 | |
| 	  If you enable this, the layouts of structures that are entirely
 | |
| 	  function pointers (and have not been manually annotated with
 | |
| 	  __no_randomize_layout), or structures that have been explicitly
 | |
| 	  marked with __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/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".
 | |
| 
 | |
| 	config RANDSTRUCT_NONE
 | |
| 		bool "Disable structure layout randomization"
 | |
| 		help
 | |
| 		  Build normally: no structure layout randomization.
 | |
| 
 | |
| 	config RANDSTRUCT_FULL
 | |
| 		bool "Fully randomize structure layout"
 | |
| 		depends on GCC_PLUGINS
 | |
| 		select MODVERSIONS if MODULES
 | |
| 		help
 | |
| 		  Fully randomize the member layout of sensitive
 | |
| 		  structures as much as possible, which may have both a
 | |
| 		  memory size and performance impact.
 | |
| 
 | |
| 	config RANDSTRUCT_PERFORMANCE
 | |
| 		bool "Limit randomization of structure layout to cache-lines"
 | |
| 		depends on GCC_PLUGINS
 | |
| 		select MODVERSIONS if MODULES
 | |
| 		help
 | |
| 		  Randomization of sensitive kernel structures will make a
 | |
| 		  best effort at restricting randomization to cacheline-sized
 | |
| 		  groups of members. It will further not randomize bitfields
 | |
| 		  in structures. This reduces the performance hit of RANDSTRUCT
 | |
| 		  at the cost of weakened randomization.
 | |
| endchoice
 | |
| 
 | |
| config RANDSTRUCT
 | |
| 	def_bool !RANDSTRUCT_NONE
 | |
| 
 | |
| config GCC_PLUGIN_RANDSTRUCT
 | |
| 	def_bool GCC_PLUGINS && RANDSTRUCT
 | |
| 	help
 | |
| 	  Use GCC plugin to randomize structure layout.
 | |
| 
 | |
| 	  This plugin was ported from grsecurity/PaX. More
 | |
| 	  information at:
 | |
| 	   * https://grsecurity.net/
 | |
| 	   * https://pax.grsecurity.net/
 | |
| 
 | |
| endmenu
 |