lib: Introduce test_stackinit module
[muen/linux.git] / scripts / gcc-plugins / Kconfig
1 preferred-plugin-hostcc := $(if-success,[ $(gcc-version) -ge 40800 ],$(HOSTCXX),$(HOSTCC))
2
3 config PLUGIN_HOSTCC
4         string
5         default "$(shell,$(srctree)/scripts/gcc-plugin.sh "$(preferred-plugin-hostcc)" "$(HOSTCXX)" "$(CC)")" if CC_IS_GCC
6         help
7           Host compiler used to build GCC plugins.  This can be $(HOSTCXX),
8           $(HOSTCC), or a null string if GCC plugin is unsupported.
9
10 config HAVE_GCC_PLUGINS
11         bool
12         help
13           An arch should select this symbol if it supports building with
14           GCC plugins.
15
16 menuconfig GCC_PLUGINS
17         bool "GCC plugins"
18         depends on HAVE_GCC_PLUGINS
19         depends on PLUGIN_HOSTCC != ""
20         help
21           GCC plugins are loadable modules that provide extra features to the
22           compiler. They are useful for runtime instrumentation and static analysis.
23
24           See Documentation/gcc-plugins.txt for details.
25
26 if GCC_PLUGINS
27
28 config GCC_PLUGIN_CYC_COMPLEXITY
29         bool "Compute the cyclomatic complexity of a function" if EXPERT
30         depends on !COMPILE_TEST        # too noisy
31         help
32           The complexity M of a function's control flow graph is defined as:
33            M = E - N + 2P
34           where
35
36           E = the number of edges
37           N = the number of nodes
38           P = the number of connected components (exit nodes).
39
40           Enabling this plugin reports the complexity to stderr during the
41           build. It mainly serves as a simple example of how to create a
42           gcc plugin for the kernel.
43
44 config GCC_PLUGIN_SANCOV
45         bool
46         help
47           This plugin inserts a __sanitizer_cov_trace_pc() call at the start of
48           basic blocks. It supports all gcc versions with plugin support (from
49           gcc-4.5 on). It is based on the commit "Add fuzzing coverage support"
50           by Dmitry Vyukov <dvyukov@google.com>.
51
52 config GCC_PLUGIN_LATENT_ENTROPY
53         bool "Generate some entropy during boot and runtime"
54         help
55           By saying Y here the kernel will instrument some kernel code to
56           extract some entropy from both original and artificially created
57           program state.  This will help especially embedded systems where
58           there is little 'natural' source of entropy normally.  The cost
59           is some slowdown of the boot process (about 0.5%) and fork and
60           irq processing.
61
62           Note that entropy extracted this way is not cryptographically
63           secure!
64
65           This plugin was ported from grsecurity/PaX. More information at:
66            * https://grsecurity.net/
67            * https://pax.grsecurity.net/
68
69 config GCC_PLUGIN_STRUCTLEAK
70         bool "Zero initialize stack variables"
71         # Currently STRUCTLEAK inserts initialization out of live scope of
72         # variables from KASAN point of view. This leads to KASAN false
73         # positive reports. Prohibit this combination for now.
74         depends on !KASAN_EXTRA
75         help
76           While the kernel is built with warnings enabled for any missed
77           stack variable initializations, this warning is silenced for
78           anything passed by reference to another function, under the
79           occasionally misguided assumption that the function will do
80           the initialization. As this regularly leads to exploitable
81           flaws, this plugin is available to identify and zero-initialize
82           such variables, depending on the chosen level of coverage.
83
84           This plugin was originally ported from grsecurity/PaX. More
85           information at:
86            * https://grsecurity.net/
87            * https://pax.grsecurity.net/
88
89 choice
90         prompt "Coverage"
91         depends on GCC_PLUGIN_STRUCTLEAK
92         default GCC_PLUGIN_STRUCTLEAK_BYREF_ALL
93         help
94           This chooses the level of coverage over classes of potentially
95           uninitialized variables. The selected class will be
96           zero-initialized before use.
97
98         config GCC_PLUGIN_STRUCTLEAK_USER
99                 bool "structs marked for userspace"
100                 help
101                   Zero-initialize any structures on the stack containing
102                   a __user attribute. This can prevent some classes of
103                   uninitialized stack variable exploits and information
104                   exposures, like CVE-2013-2141:
105                   https://git.kernel.org/linus/b9e146d8eb3b9eca
106
107         config GCC_PLUGIN_STRUCTLEAK_BYREF
108                 bool "structs passed by reference"
109                 help
110                   Zero-initialize any structures on the stack that may
111                   be passed by reference and had not already been
112                   explicitly initialized. This can prevent most classes
113                   of uninitialized stack variable exploits and information
114                   exposures, like CVE-2017-1000410:
115                   https://git.kernel.org/linus/06e7e776ca4d3654
116
117         config GCC_PLUGIN_STRUCTLEAK_BYREF_ALL
118                 bool "anything passed by reference"
119                 help
120                   Zero-initialize any stack variables that may be passed
121                   by reference and had not already been explicitly
122                   initialized. This is intended to eliminate all classes
123                   of uninitialized stack variable exploits and information
124                   exposures.
125
126 endchoice
127
128 config GCC_PLUGIN_STRUCTLEAK_VERBOSE
129         bool "Report forcefully initialized variables"
130         depends on GCC_PLUGIN_STRUCTLEAK
131         depends on !COMPILE_TEST        # too noisy
132         help
133           This option will cause a warning to be printed each time the
134           structleak plugin finds a variable it thinks needs to be
135           initialized. Since not all existing initializers are detected
136           by the plugin, this can produce false positive warnings.
137
138 config GCC_PLUGIN_RANDSTRUCT
139         bool "Randomize layout of sensitive kernel structures"
140         select MODVERSIONS if MODULES
141         help
142           If you say Y here, the layouts of structures that are entirely
143           function pointers (and have not been manually annotated with
144           __no_randomize_layout), or structures that have been explicitly
145           marked with __randomize_layout, will be randomized at compile-time.
146           This can introduce the requirement of an additional information
147           exposure vulnerability for exploits targeting these structure
148           types.
149
150           Enabling this feature will introduce some performance impact,
151           slightly increase memory usage, and prevent the use of forensic
152           tools like Volatility against the system (unless the kernel
153           source tree isn't cleaned after kernel installation).
154
155           The seed used for compilation is located at
156           scripts/gcc-plgins/randomize_layout_seed.h.  It remains after
157           a make clean to allow for external modules to be compiled with
158           the existing seed and will be removed by a make mrproper or
159           make distclean.
160
161           Note that the implementation requires gcc 4.7 or newer.
162
163           This plugin was ported from grsecurity/PaX. More information at:
164            * https://grsecurity.net/
165            * https://pax.grsecurity.net/
166
167 config GCC_PLUGIN_RANDSTRUCT_PERFORMANCE
168         bool "Use cacheline-aware structure randomization"
169         depends on GCC_PLUGIN_RANDSTRUCT
170         depends on !COMPILE_TEST        # do not reduce test coverage
171         help
172           If you say Y here, the RANDSTRUCT randomization will make a
173           best effort at restricting randomization to cacheline-sized
174           groups of elements.  It will further not randomize bitfields
175           in structures.  This reduces the performance hit of RANDSTRUCT
176           at the cost of weakened randomization.
177
178 config GCC_PLUGIN_STACKLEAK
179         bool "Erase the kernel stack before returning from syscalls"
180         depends on GCC_PLUGINS
181         depends on HAVE_ARCH_STACKLEAK
182         help
183           This option makes the kernel erase the kernel stack before
184           returning from system calls. That reduces the information which
185           kernel stack leak bugs can reveal and blocks some uninitialized
186           stack variable attacks.
187
188           The tradeoff is the performance impact: on a single CPU system kernel
189           compilation sees a 1% slowdown, other systems and workloads may vary
190           and you are advised to test this feature on your expected workload
191           before deploying it.
192
193           This plugin was ported from grsecurity/PaX. More information at:
194            * https://grsecurity.net/
195            * https://pax.grsecurity.net/
196
197 config STACKLEAK_TRACK_MIN_SIZE
198         int "Minimum stack frame size of functions tracked by STACKLEAK"
199         default 100
200         range 0 4096
201         depends on GCC_PLUGIN_STACKLEAK
202         help
203           The STACKLEAK gcc plugin instruments the kernel code for tracking
204           the lowest border of the kernel stack (and for some other purposes).
205           It inserts the stackleak_track_stack() call for the functions with
206           a stack frame size greater than or equal to this parameter.
207           If unsure, leave the default value 100.
208
209 config STACKLEAK_METRICS
210         bool "Show STACKLEAK metrics in the /proc file system"
211         depends on GCC_PLUGIN_STACKLEAK
212         depends on PROC_FS
213         help
214           If this is set, STACKLEAK metrics for every task are available in
215           the /proc file system. In particular, /proc/<pid>/stack_depth
216           shows the maximum kernel stack consumption for the current and
217           previous syscalls. Although this information is not precise, it
218           can be useful for estimating the STACKLEAK performance impact for
219           your workloads.
220
221 config STACKLEAK_RUNTIME_DISABLE
222         bool "Allow runtime disabling of kernel stack erasing"
223         depends on GCC_PLUGIN_STACKLEAK
224         help
225           This option provides 'stack_erasing' sysctl, which can be used in
226           runtime to control kernel stack erasing for kernels built with
227           CONFIG_GCC_PLUGIN_STACKLEAK.
228
229 config GCC_PLUGIN_ARM_SSP_PER_TASK
230         bool
231         depends on GCC_PLUGINS && ARM
232
233 endif