blob: e6eda054ab275ffa7b886c2eb4e49e97705f6b54 [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 Babka2a19be62023-10-02 15:43:03 +020040 depends on SYSFS && !SLUB_TINY
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
Vlastimil Babka2a19be62023-10-02 15:43:03 +020081 select SLUB_DEBUG
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 Konovalov2bd926b2018-12-28 00:29:53 -080092config KASAN_SW_TAGS
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -070093 bool "Software Tag-Based KASAN"
Andrey Konovalov2bd926b2018-12-28 00:29:53 -080094 depends on HAVE_ARCH_KASAN_SW_TAGS && CC_HAS_KASAN_SW_TAGS
Marco Elverfa360be2021-09-24 15:43:23 -070095 depends on CC_HAS_WORKING_NOSANITIZE_ADDRESS
Vlastimil Babka2a19be62023-10-02 15:43:03 +020096 select SLUB_DEBUG
Andrey Konovalov6a63a632020-12-22 12:01:20 -080097 select CONSTRUCTORS
Arnd Bergmanne7c52b82018-02-06 15:41:41 -080098 help
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -070099 Enables Software Tag-Based KASAN.
Marco Elverac4766b2020-08-06 23:24:31 -0700100
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700101 Requires GCC 11+ or Clang.
Andrey Konovalov6a63a632020-12-22 12:01:20 -0800102
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700103 Supported only on arm64 CPUs and relies on Top Byte Ignore.
Marco Elverac4766b2020-08-06 23:24:31 -0700104
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700105 Consumes about 1/16th of available memory at kernel start and
106 add an overhead of ~20% for dynamic allocations.
Marco Elverac4766b2020-08-06 23:24:31 -0700107
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700108 May potentially introduce problems related to pointer casting and
109 comparison, as it embeds a tag into the top byte of each pointer.
110
Andrey Konovalov6a63a632020-12-22 12:01:20 -0800111config KASAN_HW_TAGS
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700112 bool "Hardware Tag-Based KASAN"
Andrey Konovalov6a63a632020-12-22 12:01:20 -0800113 depends on HAVE_ARCH_KASAN_HW_TAGS
Andrey Konovalov6a63a632020-12-22 12:01:20 -0800114 help
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700115 Enables Hardware Tag-Based KASAN.
Andrey Konovalov6a63a632020-12-22 12:01:20 -0800116
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700117 Requires GCC 10+ or Clang 12+.
Andrey Konovalov6a63a632020-12-22 12:01:20 -0800118
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700119 Supported only on arm64 CPUs starting from ARMv8.5 and relies on
120 Memory Tagging Extension and Top Byte Ignore.
121
122 Consumes about 1/32nd of available memory.
123
124 May potentially introduce problems related to pointer casting and
125 comparison, as it embeds a tag into the top byte of each pointer.
Andrey Konovalov6a63a632020-12-22 12:01:20 -0800126
Andrey Konovalov2bd926b2018-12-28 00:29:53 -0800127endchoice
128
Andrey Ryabinin0b24bec2015-02-13 14:39:17 -0800129choice
130 prompt "Instrumentation type"
Andrey Konovalov6a63a632020-12-22 12:01:20 -0800131 depends on KASAN_GENERIC || KASAN_SW_TAGS
Paul Heidekrüger83a6fdd2023-11-09 15:51:00 +0000132 default KASAN_INLINE if !ARCH_DISABLE_KASAN_INLINE
Andrey Ryabinin0b24bec2015-02-13 14:39:17 -0800133
134config KASAN_OUTLINE
135 bool "Outline instrumentation"
136 help
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700137 Makes the compiler insert function calls that check whether the memory
138 is accessible before each memory access. Slower than KASAN_INLINE, but
139 does not bloat the size of the kernel's .text section so much.
Andrey Ryabinin0b24bec2015-02-13 14:39:17 -0800140
141config KASAN_INLINE
142 bool "Inline instrumentation"
Daniel Axtens158f2552021-06-28 19:40:39 -0700143 depends on !ARCH_DISABLE_KASAN_INLINE
Andrey Ryabinin0b24bec2015-02-13 14:39:17 -0800144 help
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700145 Makes the compiler directly insert memory accessibility checks before
146 each memory access. Faster than KASAN_OUTLINE (gives ~x2 boost for
147 some workloads), but makes the kernel's .text size much bigger.
Andrey Ryabinin0b24bec2015-02-13 14:39:17 -0800148
149endchoice
150
Walter Wu02c58772021-04-16 15:46:00 -0700151config KASAN_STACK
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700152 bool "Stack instrumentation (unsafe)" if CC_IS_CLANG && !COMPILE_TEST
Andrey Konovalov6a63a632020-12-22 12:01:20 -0800153 depends on KASAN_GENERIC || KASAN_SW_TAGS
Daniel Axtens158f2552021-06-28 19:40:39 -0700154 depends on !ARCH_DISABLE_KASAN_INLINE
Walter Wu02c58772021-04-16 15:46:00 -0700155 default y if CC_IS_GCC
Arnd Bergmann6baec882019-02-28 16:21:58 -0800156 help
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700157 Disables stack instrumentation and thus KASAN's ability to detect
158 out-of-bounds bugs in stack variables.
159
160 With Clang, stack instrumentation has a problem that causes excessive
161 stack usage, see https://bugs.llvm.org/show_bug.cgi?id=38809. Thus,
162 with Clang, this option is deemed unsafe.
163
164 This option is always disabled when compile-testing with Clang to
165 avoid cluttering the log with stack overflow warnings.
166
167 With GCC, enabling stack instrumentation is assumed to be safe.
168
169 If the architecture disables inline instrumentation via
170 ARCH_DISABLE_KASAN_INLINE, stack instrumentation gets disabled
171 as well, as it adds inline-style instrumentation that is run
172 unconditionally.
Arnd Bergmann6baec882019-02-28 16:21:58 -0800173
Daniel Axtens3c5c3cf2019-11-30 17:54:50 -0800174config KASAN_VMALLOC
Andrey Konovalovfbefb422022-03-24 18:11:50 -0700175 bool "Check accesses to vmalloc allocations"
176 depends on HAVE_ARCH_KASAN_VMALLOC
Daniel Axtens3c5c3cf2019-11-30 17:54:50 -0800177 help
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700178 Makes KASAN check the validity of accesses to vmalloc allocations.
Daniel Axtens3c5c3cf2019-11-30 17:54:50 -0800179
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700180 With software KASAN modes, all types vmalloc allocations are
181 checked. Enabling this option leads to higher memory usage.
Andrey Konovalovfbefb422022-03-24 18:11:50 -0700182
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700183 With Hardware Tag-Based KASAN, only non-executable VM_ALLOC mappings
184 are checked. There is no additional memory usage.
Daniel Axtens3c5c3cf2019-11-30 17:54:50 -0800185
Patricia Alfonso73228c72020-10-13 16:55:06 -0700186config KASAN_KUNIT_TEST
187 tristate "KUnit-compatible tests of KASAN bug detection capabilities" if !KUNIT_ALL_TESTS
Andrey Konovalov7ce0ea12022-09-27 19:09:09 +0200188 depends on KASAN && KUNIT && TRACEPOINTS
Patricia Alfonso73228c72020-10-13 16:55:06 -0700189 default KUNIT_ALL_TESTS
Andrey Ryabinin3f158012015-02-13 14:39:53 -0800190 help
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700191 A KUnit-based KASAN test suite. Triggers different kinds of
192 out-of-bounds and use-after-free accesses. Useful for testing whether
193 KASAN can detect certain bug types.
Marco Elver7a3767f2020-08-06 23:24:28 -0700194
Patricia Alfonso73228c72020-10-13 16:55:06 -0700195 For more information on KUnit and unit tests in general, please refer
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700196 to the KUnit documentation in Documentation/dev-tools/kunit/.
Patricia Alfonso73228c72020-10-13 16:55:06 -0700197
Andrey Konovalov5d92bdf2021-02-24 12:05:29 -0800198config KASAN_MODULE_TEST
Patricia Alfonso73228c72020-10-13 16:55:06 -0700199 tristate "KUnit-incompatible tests of KASAN bug detection capabilities"
Andrey Konovalovf05842c2021-02-24 12:05:26 -0800200 depends on m && KASAN && !KASAN_HW_TAGS
Patricia Alfonso73228c72020-10-13 16:55:06 -0700201 help
Andrey Konovalovfe30ddc2022-05-12 20:23:09 -0700202 A part of the KASAN test suite that is not integrated with KUnit.
203 Incompatible with Hardware Tag-Based KASAN.
Patricia Alfonso73228c72020-10-13 16:55:06 -0700204
Juntong Deng5d4c6ac2023-11-27 21:17:31 +0000205config KASAN_EXTRA_INFO
206 bool "Record and report more information"
207 depends on KASAN
208 help
209 Record and report more information to help us find the cause of the
210 bug and to help us correlate the error with other system events.
211
212 Currently, the CPU number and timestamp are additionally
213 recorded for each heap block at allocation and free time, and
214 8 bytes will be added to each metadata structure that records
215 allocation or free information.
216
217 In Generic KASAN, each kmalloc-8 and kmalloc-16 object will add
218 16 bytes of additional memory consumption, and each kmalloc-32
219 object will add 8 bytes of additional memory consumption, not
220 affecting other larger objects.
221
222 In SW_TAGS KASAN and HW_TAGS KASAN, depending on the stack_ring_size
223 boot parameter, it will add 8 * stack_ring_size bytes of additional
224 memory consumption.
225
Marco Elver7a3767f2020-08-06 23:24:28 -0700226endif # KASAN