| .. | .. |
|---|
| 1 | +# SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | # This config refers to the generic KASAN mode. |
|---|
| 2 | 3 | config HAVE_ARCH_KASAN |
|---|
| 3 | 4 | bool |
|---|
| 4 | 5 | |
|---|
| 5 | 6 | config HAVE_ARCH_KASAN_SW_TAGS |
|---|
| 7 | + bool |
|---|
| 8 | + |
|---|
| 9 | +config HAVE_ARCH_KASAN_HW_TAGS |
|---|
| 10 | + bool |
|---|
| 11 | + |
|---|
| 12 | +config HAVE_ARCH_KASAN_VMALLOC |
|---|
| 6 | 13 | bool |
|---|
| 7 | 14 | |
|---|
| 8 | 15 | config CC_HAS_KASAN_GENERIC |
|---|
| .. | .. |
|---|
| 11 | 18 | config CC_HAS_KASAN_SW_TAGS |
|---|
| 12 | 19 | def_bool $(cc-option, -fsanitize=kernel-hwaddress) |
|---|
| 13 | 20 | |
|---|
| 14 | | -config KASAN |
|---|
| 21 | +# This option is only required for software KASAN modes. |
|---|
| 22 | +# Old GCC versions don't have proper support for no_sanitize_address. |
|---|
| 23 | +# See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89124 for details. |
|---|
| 24 | +config CC_HAS_WORKING_NOSANITIZE_ADDRESS |
|---|
| 25 | + def_bool !CC_IS_GCC || GCC_VERSION >= 80300 |
|---|
| 26 | + |
|---|
| 27 | +menuconfig KASAN |
|---|
| 15 | 28 | bool "KASAN: runtime memory debugger" |
|---|
| 16 | | - depends on (HAVE_ARCH_KASAN && CC_HAS_KASAN_GENERIC) || \ |
|---|
| 17 | | - (HAVE_ARCH_KASAN_SW_TAGS && CC_HAS_KASAN_SW_TAGS) |
|---|
| 29 | + depends on (((HAVE_ARCH_KASAN && CC_HAS_KASAN_GENERIC) || \ |
|---|
| 30 | + (HAVE_ARCH_KASAN_SW_TAGS && CC_HAS_KASAN_SW_TAGS)) && \ |
|---|
| 31 | + CC_HAS_WORKING_NOSANITIZE_ADDRESS) || \ |
|---|
| 32 | + HAVE_ARCH_KASAN_HW_TAGS |
|---|
| 18 | 33 | depends on (SLUB && SYSFS) || (SLAB && !DEBUG_SLAB) |
|---|
| 34 | + select STACKDEPOT |
|---|
| 19 | 35 | help |
|---|
| 20 | 36 | Enables KASAN (KernelAddressSANitizer) - runtime memory debugger, |
|---|
| 21 | 37 | designed to find out-of-bounds accesses and use-after-free bugs. |
|---|
| 22 | 38 | See Documentation/dev-tools/kasan.rst for details. |
|---|
| 23 | 39 | |
|---|
| 40 | +if KASAN |
|---|
| 41 | + |
|---|
| 24 | 42 | choice |
|---|
| 25 | 43 | prompt "KASAN mode" |
|---|
| 26 | | - depends on KASAN |
|---|
| 27 | 44 | default KASAN_GENERIC |
|---|
| 28 | 45 | help |
|---|
| 29 | | - KASAN has two modes: generic KASAN (similar to userspace ASan, |
|---|
| 30 | | - x86_64/arm64/xtensa, enabled with CONFIG_KASAN_GENERIC) and |
|---|
| 31 | | - software tag-based KASAN (a version based on software memory |
|---|
| 32 | | - tagging, arm64 only, similar to userspace HWASan, enabled with |
|---|
| 33 | | - CONFIG_KASAN_SW_TAGS). |
|---|
| 34 | | - Both generic and tag-based KASAN are strictly debugging features. |
|---|
| 46 | + KASAN has three modes: |
|---|
| 47 | + 1. generic KASAN (similar to userspace ASan, |
|---|
| 48 | + x86_64/arm64/xtensa, enabled with CONFIG_KASAN_GENERIC), |
|---|
| 49 | + 2. software tag-based KASAN (arm64 only, based on software |
|---|
| 50 | + memory tagging (similar to userspace HWASan), enabled with |
|---|
| 51 | + CONFIG_KASAN_SW_TAGS), and |
|---|
| 52 | + 3. hardware tag-based KASAN (arm64 only, based on hardware |
|---|
| 53 | + memory tagging, enabled with CONFIG_KASAN_HW_TAGS). |
|---|
| 54 | + |
|---|
| 55 | + All KASAN modes are strictly debugging features. |
|---|
| 56 | + |
|---|
| 57 | + For better error reports enable CONFIG_STACKTRACE. |
|---|
| 35 | 58 | |
|---|
| 36 | 59 | config KASAN_GENERIC |
|---|
| 37 | 60 | bool "Generic mode" |
|---|
| 38 | 61 | depends on HAVE_ARCH_KASAN && CC_HAS_KASAN_GENERIC |
|---|
| 39 | | - depends on (SLUB && SYSFS) || (SLAB && !DEBUG_SLAB) |
|---|
| 62 | + depends on CC_HAS_WORKING_NOSANITIZE_ADDRESS |
|---|
| 40 | 63 | select SLUB_DEBUG if SLUB |
|---|
| 41 | 64 | select CONSTRUCTORS |
|---|
| 42 | | - select STACKDEPOT |
|---|
| 43 | 65 | help |
|---|
| 44 | 66 | Enables generic KASAN mode. |
|---|
| 45 | | - Supported in both GCC and Clang. With GCC it requires version 4.9.2 |
|---|
| 46 | | - or later for basic support and version 5.0 or later for detection of |
|---|
| 47 | | - out-of-bounds accesses for stack and global variables and for inline |
|---|
| 48 | | - instrumentation mode (CONFIG_KASAN_INLINE). With Clang it requires |
|---|
| 49 | | - version 3.7.0 or later and it doesn't support detection of |
|---|
| 50 | | - out-of-bounds accesses for global variables yet. |
|---|
| 67 | + |
|---|
| 68 | + This mode is supported in both GCC and Clang. With GCC it requires |
|---|
| 69 | + version 8.3.0 or later. Any supported Clang version is compatible, |
|---|
| 70 | + but detection of out-of-bounds accesses for global variables is |
|---|
| 71 | + supported only since Clang 11. |
|---|
| 72 | + |
|---|
| 51 | 73 | This mode consumes about 1/8th of available memory at kernel start |
|---|
| 52 | 74 | and introduces an overhead of ~x1.5 for the rest of the allocations. |
|---|
| 53 | 75 | The performance slowdown is ~x3. |
|---|
| 54 | | - For better error detection enable CONFIG_STACKTRACE. |
|---|
| 76 | + |
|---|
| 55 | 77 | Currently CONFIG_KASAN_GENERIC doesn't work with CONFIG_DEBUG_SLAB |
|---|
| 56 | 78 | (the resulting kernel does not boot). |
|---|
| 57 | 79 | |
|---|
| 58 | 80 | config KASAN_SW_TAGS |
|---|
| 59 | 81 | bool "Software tag-based mode" |
|---|
| 60 | 82 | depends on HAVE_ARCH_KASAN_SW_TAGS && CC_HAS_KASAN_SW_TAGS |
|---|
| 61 | | - depends on (SLUB && SYSFS) || (SLAB && !DEBUG_SLAB) |
|---|
| 83 | + depends on CC_HAS_WORKING_NOSANITIZE_ADDRESS |
|---|
| 62 | 84 | select SLUB_DEBUG if SLUB |
|---|
| 63 | 85 | select CONSTRUCTORS |
|---|
| 64 | | - select STACKDEPOT |
|---|
| 65 | 86 | help |
|---|
| 66 | 87 | Enables software tag-based KASAN mode. |
|---|
| 67 | | - This mode requires Top Byte Ignore support by the CPU and therefore |
|---|
| 68 | | - is only supported for arm64. |
|---|
| 69 | | - This mode requires Clang version 7.0.0 or later. |
|---|
| 88 | + |
|---|
| 89 | + This mode require software memory tagging support in the form of |
|---|
| 90 | + HWASan-like compiler instrumentation. |
|---|
| 91 | + |
|---|
| 92 | + Currently this mode is only implemented for arm64 CPUs and relies on |
|---|
| 93 | + Top Byte Ignore. This mode requires Clang. |
|---|
| 94 | + |
|---|
| 70 | 95 | This mode consumes about 1/16th of available memory at kernel start |
|---|
| 71 | 96 | and introduces an overhead of ~20% for the rest of the allocations. |
|---|
| 72 | 97 | This mode may potentially introduce problems relating to pointer |
|---|
| 73 | 98 | casting and comparison, as it embeds tags into the top byte of each |
|---|
| 74 | 99 | pointer. |
|---|
| 75 | | - For better error detection enable CONFIG_STACKTRACE. |
|---|
| 100 | + |
|---|
| 76 | 101 | Currently CONFIG_KASAN_SW_TAGS doesn't work with CONFIG_DEBUG_SLAB |
|---|
| 77 | 102 | (the resulting kernel does not boot). |
|---|
| 103 | + |
|---|
| 104 | +config KASAN_HW_TAGS |
|---|
| 105 | + bool "Hardware tag-based mode" |
|---|
| 106 | + depends on HAVE_ARCH_KASAN_HW_TAGS |
|---|
| 107 | + depends on SLUB |
|---|
| 108 | + help |
|---|
| 109 | + Enables hardware tag-based KASAN mode. |
|---|
| 110 | + |
|---|
| 111 | + This mode requires hardware memory tagging support, and can be used |
|---|
| 112 | + by any architecture that provides it. |
|---|
| 113 | + |
|---|
| 114 | + Currently this mode is only implemented for arm64 CPUs starting from |
|---|
| 115 | + ARMv8.5 and relies on Memory Tagging Extension and Top Byte Ignore. |
|---|
| 78 | 116 | |
|---|
| 79 | 117 | endchoice |
|---|
| 80 | 118 | |
|---|
| 81 | 119 | choice |
|---|
| 82 | 120 | prompt "Instrumentation type" |
|---|
| 83 | | - depends on KASAN |
|---|
| 121 | + depends on KASAN_GENERIC || KASAN_SW_TAGS |
|---|
| 84 | 122 | default KASAN_OUTLINE |
|---|
| 85 | 123 | |
|---|
| 86 | 124 | config KASAN_OUTLINE |
|---|
| .. | .. |
|---|
| 99 | 137 | memory accesses. This is faster than outline (in some workloads |
|---|
| 100 | 138 | it gives about x2 boost over outline instrumentation), but |
|---|
| 101 | 139 | make kernel's .text size much bigger. |
|---|
| 102 | | - For CONFIG_KASAN_GENERIC this requires GCC 5.0 or later. |
|---|
| 103 | 140 | |
|---|
| 104 | 141 | endchoice |
|---|
| 105 | 142 | |
|---|
| 106 | | -config KASAN_STACK_ENABLE |
|---|
| 143 | +config KASAN_STACK |
|---|
| 107 | 144 | bool "Enable stack instrumentation (unsafe)" if CC_IS_CLANG && !COMPILE_TEST |
|---|
| 108 | | - depends on KASAN |
|---|
| 145 | + depends on KASAN_GENERIC || KASAN_SW_TAGS |
|---|
| 146 | + default y if CC_IS_GCC |
|---|
| 109 | 147 | help |
|---|
| 110 | 148 | The LLVM stack address sanitizer has a know problem that |
|---|
| 111 | 149 | causes excessive stack usage in a lot of functions, see |
|---|
| .. | .. |
|---|
| 119 | 157 | CONFIG_COMPILE_TEST. On gcc it is assumed to always be safe |
|---|
| 120 | 158 | to use and enabled by default. |
|---|
| 121 | 159 | |
|---|
| 122 | | -config KASAN_STACK |
|---|
| 123 | | - int |
|---|
| 124 | | - default 1 if KASAN_STACK_ENABLE || CC_IS_GCC |
|---|
| 125 | | - default 0 |
|---|
| 126 | | - |
|---|
| 127 | | -config TEST_KASAN |
|---|
| 128 | | - tristate "Module for testing KASAN for bug detection" |
|---|
| 129 | | - depends on m && KASAN |
|---|
| 160 | +config KASAN_S390_4_LEVEL_PAGING |
|---|
| 161 | + bool "KASan: use 4-level paging" |
|---|
| 162 | + depends on S390 |
|---|
| 130 | 163 | help |
|---|
| 131 | | - This is a test module doing various nasty things like |
|---|
| 132 | | - out of bounds accesses, use after free. It is useful for testing |
|---|
| 164 | + Compiling the kernel with KASan disables automatic 3-level vs |
|---|
| 165 | + 4-level paging selection. 3-level paging is used by default (up |
|---|
| 166 | + to 3TB of RAM with KASan enabled). This options allows to force |
|---|
| 167 | + 4-level paging instead. |
|---|
| 168 | + |
|---|
| 169 | +config KASAN_SW_TAGS_IDENTIFY |
|---|
| 170 | + bool "Enable memory corruption identification" |
|---|
| 171 | + depends on KASAN_SW_TAGS |
|---|
| 172 | + help |
|---|
| 173 | + This option enables best-effort identification of bug type |
|---|
| 174 | + (use-after-free or out-of-bounds) at the cost of increased |
|---|
| 175 | + memory consumption. |
|---|
| 176 | + |
|---|
| 177 | +config KASAN_VMALLOC |
|---|
| 178 | + bool "Back mappings in vmalloc space with real shadow memory" |
|---|
| 179 | + depends on KASAN_GENERIC && HAVE_ARCH_KASAN_VMALLOC |
|---|
| 180 | + help |
|---|
| 181 | + By default, the shadow region for vmalloc space is the read-only |
|---|
| 182 | + zero page. This means that KASAN cannot detect errors involving |
|---|
| 183 | + vmalloc space. |
|---|
| 184 | + |
|---|
| 185 | + Enabling this option will hook in to vmap/vmalloc and back those |
|---|
| 186 | + mappings with real shadow memory allocated on demand. This allows |
|---|
| 187 | + for KASAN to detect more sorts of errors (and to support vmapped |
|---|
| 188 | + stacks), but at the cost of higher memory usage. |
|---|
| 189 | + |
|---|
| 190 | +config KASAN_KUNIT_TEST |
|---|
| 191 | + tristate "KUnit-compatible tests of KASAN bug detection capabilities" if !KUNIT_ALL_TESTS |
|---|
| 192 | + depends on KASAN && KUNIT |
|---|
| 193 | + default KUNIT_ALL_TESTS |
|---|
| 194 | + help |
|---|
| 195 | + This is a KUnit test suite doing various nasty things like |
|---|
| 196 | + out of bounds and use after free accesses. It is useful for testing |
|---|
| 133 | 197 | kernel debugging features like KASAN. |
|---|
| 198 | + |
|---|
| 199 | + For more information on KUnit and unit tests in general, please refer |
|---|
| 200 | + to the KUnit documentation in Documentation/dev-tools/kunit. |
|---|
| 201 | + |
|---|
| 202 | +config KASAN_MODULE_TEST |
|---|
| 203 | + tristate "KUnit-incompatible tests of KASAN bug detection capabilities" |
|---|
| 204 | + depends on m && KASAN && !KASAN_HW_TAGS |
|---|
| 205 | + help |
|---|
| 206 | + This is a part of the KASAN test suite that is incompatible with |
|---|
| 207 | + KUnit. Currently includes tests that do bad copy_from/to_user |
|---|
| 208 | + accesses. |
|---|
| 209 | + |
|---|
| 210 | +endif # KASAN |
|---|