blob: fdca89c057452e7715a21316a1d3b763a525d785 [file] [log] [blame]
Thomas Gleixnerec8f24b2019-05-19 13:07:45 +01001# SPDX-License-Identifier: GPL-2.0-only
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -07002
Andrey Konovalov2bd926b2018-12-28 00:29:53 -08003# This config refers to the generic KASAN mode.
Andrey Ryabinin0b24bec2015-02-13 14:39:17 -08004config HAVE_ARCH_KASAN
5 bool
6
Andrey Konovalov2bd926b2018-12-28 00:29:53 -08007config HAVE_ARCH_KASAN_SW_TAGS
8 bool
9
Andrey Konovalov6a63a632020-12-22 12:01:20 -080010config HAVE_ARCH_KASAN_HW_TAGS
11 bool
12
13config HAVE_ARCH_KASAN_VMALLOC
Daniel Axtens3c5c3cf2019-11-30 17:54:50 -080014 bool
15
Daniel Axtens158f2552021-06-28 19:40:39 -070016config ARCH_DISABLE_KASAN_INLINE
17 bool
18 help
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -070019 Disables both inline and stack instrumentation. Selected by
20 architectures that do not support these instrumentation types.
Daniel Axtens158f2552021-06-28 19:40:39 -070021
Andrey Konovalov2bd926b2018-12-28 00:29:53 -080022config CC_HAS_KASAN_GENERIC
23 def_bool $(cc-option, -fsanitize=kernel-address)
24
25config CC_HAS_KASAN_SW_TAGS
26 def_bool $(cc-option, -fsanitize=kernel-hwaddress)
Andrey Ryabinin0b24bec2015-02-13 14:39:17 -080027
Andrey Konovalov6a63a632020-12-22 12:01:20 -080028# This option is only required for software KASAN modes.
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -070029# Old GCC versions do not have proper support for no_sanitize_address.
Andrey Konovalov6a63a632020-12-22 12:01:20 -080030# See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89124 for details.
Marco Elver7b861a52020-06-04 07:58:10 +020031config CC_HAS_WORKING_NOSANITIZE_ADDRESS
Marco Elveracf7b0b2020-06-23 13:24:48 +020032 def_bool !CC_IS_GCC || GCC_VERSION >= 80300
Marco Elver7b861a52020-06-04 07:58:10 +020033
Marco Elver7a3767f2020-08-06 23:24:28 -070034menuconfig KASAN
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -070035 bool "KASAN: dynamic memory safety error detector"
Andrey Konovalov6a63a632020-12-22 12:01:20 -080036 depends on (((HAVE_ARCH_KASAN && CC_HAS_KASAN_GENERIC) || \
37 (HAVE_ARCH_KASAN_SW_TAGS && CC_HAS_KASAN_SW_TAGS)) && \
38 CC_HAS_WORKING_NOSANITIZE_ADDRESS) || \
39 HAVE_ARCH_KASAN_HW_TAGS
Vlastimil Babkae240e532022-11-14 18:13:45 +010040 depends on (SLUB && SYSFS && !SLUB_TINY) || (SLAB && !DEBUG_SLAB)
Vlastimil Babka2dba5eb2022-01-21 22:14:27 -080041 select STACKDEPOT_ALWAYS_INIT
Andrey Konovalov2bd926b2018-12-28 00:29:53 -080042 help
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -070043 Enables KASAN (Kernel Address Sanitizer) - a dynamic memory safety
44 error detector designed to find out-of-bounds and use-after-free bugs.
45
Andrey Konovalov2bd926b2018-12-28 00:29:53 -080046 See Documentation/dev-tools/kasan.rst for details.
47
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -070048 For better error reports, also enable CONFIG_STACKTRACE.
49
Marco Elver7a3767f2020-08-06 23:24:28 -070050if KASAN
51
Marco Elver36be5cb2023-02-24 09:59:40 +010052config CC_HAS_KASAN_MEMINTRINSIC_PREFIX
53 def_bool (CC_IS_CLANG && $(cc-option,-fsanitize=kernel-address -mllvm -asan-kernel-mem-intrinsic-prefix=1)) || \
54 (CC_IS_GCC && $(cc-option,-fsanitize=kernel-address --param asan-kernel-mem-intrinsic-prefix=1))
55 # Don't define it if we don't need it: compilation of the test uses
56 # this variable to decide how the compiler should treat builtins.
57 depends on !KASAN_HW_TAGS
58 help
59 The compiler is able to prefix memintrinsics with __asan or __hwasan.
60
Andrey Konovalov2bd926b2018-12-28 00:29:53 -080061choice
62 prompt "KASAN mode"
Andrey Konovalov2bd926b2018-12-28 00:29:53 -080063 default KASAN_GENERIC
64 help
Andrey Konovalov6a63a632020-12-22 12:01:20 -080065 KASAN has three modes:
Marco Elverac4766b2020-08-06 23:24:31 -070066
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -070067 1. Generic KASAN (supported by many architectures, enabled with
68 CONFIG_KASAN_GENERIC, similar to userspace ASan),
69 2. Software Tag-Based KASAN (arm64 only, based on software memory
70 tagging, enabled with CONFIG_KASAN_SW_TAGS, similar to userspace
71 HWASan), and
72 3. Hardware Tag-Based KASAN (arm64 only, based on hardware memory
73 tagging, enabled with CONFIG_KASAN_HW_TAGS).
Andrey Konovalov6a63a632020-12-22 12:01:20 -080074
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -070075 See Documentation/dev-tools/kasan.rst for details about each mode.
Andrey Konovalov2bd926b2018-12-28 00:29:53 -080076
77config KASAN_GENERIC
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -070078 bool "Generic KASAN"
Andrey Konovalov2bd926b2018-12-28 00:29:53 -080079 depends on HAVE_ARCH_KASAN && CC_HAS_KASAN_GENERIC
Marco Elverfa360be2021-09-24 15:43:23 -070080 depends on CC_HAS_WORKING_NOSANITIZE_ADDRESS
Jason A. Donenfelddd275ca2018-06-27 23:26:20 -070081 select SLUB_DEBUG if SLUB
Andrey Konovalov6a63a632020-12-22 12:01:20 -080082 select CONSTRUCTORS
Andrey Ryabinin0b24bec2015-02-13 14:39:17 -080083 help
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -070084 Enables Generic KASAN.
Marco Elverac4766b2020-08-06 23:24:31 -070085
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -070086 Requires GCC 8.3.0+ or Clang.
Marco Elverac4766b2020-08-06 23:24:31 -070087
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -070088 Consumes about 1/8th of available memory at kernel start and adds an
89 overhead of ~50% for dynamic allocations.
Andrey Konovalov2bd926b2018-12-28 00:29:53 -080090 The performance slowdown is ~x3.
Marco Elverac4766b2020-08-06 23:24:31 -070091
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -070092 (Incompatible with CONFIG_DEBUG_SLAB: the kernel does not boot.)
Andrey Ryabinin0b24bec2015-02-13 14:39:17 -080093
Andrey Konovalov2bd926b2018-12-28 00:29:53 -080094config KASAN_SW_TAGS
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -070095 bool "Software Tag-Based KASAN"
Andrey Konovalov2bd926b2018-12-28 00:29:53 -080096 depends on HAVE_ARCH_KASAN_SW_TAGS && CC_HAS_KASAN_SW_TAGS
Marco Elverfa360be2021-09-24 15:43:23 -070097 depends on CC_HAS_WORKING_NOSANITIZE_ADDRESS
Andrey Konovalov2bd926b2018-12-28 00:29:53 -080098 select SLUB_DEBUG if SLUB
Andrey Konovalov6a63a632020-12-22 12:01:20 -080099 select CONSTRUCTORS
Arnd Bergmanne7c52b82018-02-06 15:41:41 -0800100 help
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700101 Enables Software Tag-Based KASAN.
Marco Elverac4766b2020-08-06 23:24:31 -0700102
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700103 Requires GCC 11+ or Clang.
Andrey Konovalov6a63a632020-12-22 12:01:20 -0800104
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700105 Supported only on arm64 CPUs and relies on Top Byte Ignore.
Marco Elverac4766b2020-08-06 23:24:31 -0700106
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700107 Consumes about 1/16th of available memory at kernel start and
108 add an overhead of ~20% for dynamic allocations.
Marco Elverac4766b2020-08-06 23:24:31 -0700109
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700110 May potentially introduce problems related to pointer casting and
111 comparison, as it embeds a tag into the top byte of each pointer.
112
113 (Incompatible with CONFIG_DEBUG_SLAB: the kernel does not boot.)
Arnd Bergmanne7c52b82018-02-06 15:41:41 -0800114
Andrey Konovalov6a63a632020-12-22 12:01:20 -0800115config KASAN_HW_TAGS
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700116 bool "Hardware Tag-Based KASAN"
Andrey Konovalov6a63a632020-12-22 12:01:20 -0800117 depends on HAVE_ARCH_KASAN_HW_TAGS
118 depends on SLUB
119 help
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700120 Enables Hardware Tag-Based KASAN.
Andrey Konovalov6a63a632020-12-22 12:01:20 -0800121
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700122 Requires GCC 10+ or Clang 12+.
Andrey Konovalov6a63a632020-12-22 12:01:20 -0800123
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700124 Supported only on arm64 CPUs starting from ARMv8.5 and relies on
125 Memory Tagging Extension and Top Byte Ignore.
126
127 Consumes about 1/32nd of available memory.
128
129 May potentially introduce problems related to pointer casting and
130 comparison, as it embeds a tag into the top byte of each pointer.
Andrey Konovalov6a63a632020-12-22 12:01:20 -0800131
Andrey Konovalov2bd926b2018-12-28 00:29:53 -0800132endchoice
133
Andrey Ryabinin0b24bec2015-02-13 14:39:17 -0800134choice
135 prompt "Instrumentation type"
Andrey Konovalov6a63a632020-12-22 12:01:20 -0800136 depends on KASAN_GENERIC || KASAN_SW_TAGS
Andrey Ryabinin0b24bec2015-02-13 14:39:17 -0800137 default KASAN_OUTLINE
138
139config KASAN_OUTLINE
140 bool "Outline instrumentation"
141 help
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700142 Makes the compiler insert function calls that check whether the memory
143 is accessible before each memory access. Slower than KASAN_INLINE, but
144 does not bloat the size of the kernel's .text section so much.
Andrey Ryabinin0b24bec2015-02-13 14:39:17 -0800145
146config KASAN_INLINE
147 bool "Inline instrumentation"
Daniel Axtens158f2552021-06-28 19:40:39 -0700148 depends on !ARCH_DISABLE_KASAN_INLINE
Andrey Ryabinin0b24bec2015-02-13 14:39:17 -0800149 help
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700150 Makes the compiler directly insert memory accessibility checks before
151 each memory access. Faster than KASAN_OUTLINE (gives ~x2 boost for
152 some workloads), but makes the kernel's .text size much bigger.
Andrey Ryabinin0b24bec2015-02-13 14:39:17 -0800153
154endchoice
155
Walter Wu02c58772021-04-16 15:46:00 -0700156config KASAN_STACK
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700157 bool "Stack instrumentation (unsafe)" if CC_IS_CLANG && !COMPILE_TEST
Andrey Konovalov6a63a632020-12-22 12:01:20 -0800158 depends on KASAN_GENERIC || KASAN_SW_TAGS
Daniel Axtens158f2552021-06-28 19:40:39 -0700159 depends on !ARCH_DISABLE_KASAN_INLINE
Walter Wu02c58772021-04-16 15:46:00 -0700160 default y if CC_IS_GCC
Arnd Bergmann6baec882019-02-28 16:21:58 -0800161 help
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700162 Disables stack instrumentation and thus KASAN's ability to detect
163 out-of-bounds bugs in stack variables.
164
165 With Clang, stack instrumentation has a problem that causes excessive
166 stack usage, see https://bugs.llvm.org/show_bug.cgi?id=38809. Thus,
167 with Clang, this option is deemed unsafe.
168
169 This option is always disabled when compile-testing with Clang to
170 avoid cluttering the log with stack overflow warnings.
171
172 With GCC, enabling stack instrumentation is assumed to be safe.
173
174 If the architecture disables inline instrumentation via
175 ARCH_DISABLE_KASAN_INLINE, stack instrumentation gets disabled
176 as well, as it adds inline-style instrumentation that is run
177 unconditionally.
Arnd Bergmann6baec882019-02-28 16:21:58 -0800178
Daniel Axtens3c5c3cf2019-11-30 17:54:50 -0800179config KASAN_VMALLOC
Andrey Konovalovfbefb422022-03-24 18:11:50 -0700180 bool "Check accesses to vmalloc allocations"
181 depends on HAVE_ARCH_KASAN_VMALLOC
Daniel Axtens3c5c3cf2019-11-30 17:54:50 -0800182 help
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700183 Makes KASAN check the validity of accesses to vmalloc allocations.
Daniel Axtens3c5c3cf2019-11-30 17:54:50 -0800184
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700185 With software KASAN modes, all types vmalloc allocations are
186 checked. Enabling this option leads to higher memory usage.
Andrey Konovalovfbefb422022-03-24 18:11:50 -0700187
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700188 With Hardware Tag-Based KASAN, only non-executable VM_ALLOC mappings
189 are checked. There is no additional memory usage.
Daniel Axtens3c5c3cf2019-11-30 17:54:50 -0800190
Patricia Alfonso73228c72020-10-13 16:55:06 -0700191config KASAN_KUNIT_TEST
192 tristate "KUnit-compatible tests of KASAN bug detection capabilities" if !KUNIT_ALL_TESTS
Andrey Konovalov7ce0ea12022-09-27 19:09:09 +0200193 depends on KASAN && KUNIT && TRACEPOINTS
Patricia Alfonso73228c72020-10-13 16:55:06 -0700194 default KUNIT_ALL_TESTS
Andrey Ryabinin3f158012015-02-13 14:39:53 -0800195 help
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700196 A KUnit-based KASAN test suite. Triggers different kinds of
197 out-of-bounds and use-after-free accesses. Useful for testing whether
198 KASAN can detect certain bug types.
Marco Elver7a3767f2020-08-06 23:24:28 -0700199
Patricia Alfonso73228c72020-10-13 16:55:06 -0700200 For more information on KUnit and unit tests in general, please refer
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700201 to the KUnit documentation in Documentation/dev-tools/kunit/.
Patricia Alfonso73228c72020-10-13 16:55:06 -0700202
Andrey Konovalov5d92bdf2021-02-24 12:05:29 -0800203config KASAN_MODULE_TEST
Patricia Alfonso73228c72020-10-13 16:55:06 -0700204 tristate "KUnit-incompatible tests of KASAN bug detection capabilities"
Andrey Konovalovf05842c2021-02-24 12:05:26 -0800205 depends on m && KASAN && !KASAN_HW_TAGS
Patricia Alfonso73228c72020-10-13 16:55:06 -0700206 help
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700207 A part of the KASAN test suite that is not integrated with KUnit.
208 Incompatible with Hardware Tag-Based KASAN.
Patricia Alfonso73228c72020-10-13 16:55:06 -0700209
Marco Elver7a3767f2020-08-06 23:24:28 -0700210endif # KASAN