Thomas Gleixner | ec8f24b | 2019-05-19 13:07:45 +0100 | [diff] [blame] | 1 | # SPDX-License-Identifier: GPL-2.0-only |
Andrey Ryabinin | c6d3085 | 2016-01-20 15:00:55 -0800 | [diff] [blame] | 2 | config ARCH_HAS_UBSAN_SANITIZE_ALL |
| 3 | bool |
| 4 | |
Kees Cook | 277a108 | 2020-04-06 20:12:31 -0700 | [diff] [blame] | 5 | menuconfig UBSAN |
Andrey Ryabinin | c6d3085 | 2016-01-20 15:00:55 -0800 | [diff] [blame] | 6 | bool "Undefined behaviour sanity checker" |
| 7 | help |
Kees Cook | 0887a7e | 2020-04-06 20:12:27 -0700 | [diff] [blame] | 8 | This option enables the Undefined Behaviour sanity checker. |
Andrey Ryabinin | c6d3085 | 2016-01-20 15:00:55 -0800 | [diff] [blame] | 9 | Compile-time instrumentation is used to detect various undefined |
Kees Cook | 0887a7e | 2020-04-06 20:12:27 -0700 | [diff] [blame] | 10 | behaviours at runtime. For more details, see: |
| 11 | Documentation/dev-tools/ubsan.rst |
| 12 | |
Kees Cook | 277a108 | 2020-04-06 20:12:31 -0700 | [diff] [blame] | 13 | if UBSAN |
| 14 | |
Kees Cook | 0887a7e | 2020-04-06 20:12:27 -0700 | [diff] [blame] | 15 | config UBSAN_TRAP |
| 16 | bool "On Sanitizer warnings, abort the running kernel code" |
Kees Cook | 7979137 | 2020-12-15 20:46:31 -0800 | [diff] [blame] | 17 | depends on !COMPILE_TEST |
Kees Cook | 0887a7e | 2020-04-06 20:12:27 -0700 | [diff] [blame] | 18 | depends on $(cc-option, -fsanitize-undefined-trap-on-error) |
| 19 | help |
| 20 | Building kernels with Sanitizer features enabled tends to grow |
| 21 | the kernel size by around 5%, due to adding all the debugging |
| 22 | text on failure paths. To avoid this, Sanitizer instrumentation |
| 23 | can just issue a trap. This reduces the kernel size overhead but |
| 24 | turns all warnings (including potentially harmless conditions) |
| 25 | into full exceptions that abort the running kernel code |
| 26 | (regardless of context, locks held, etc), which may destabilize |
| 27 | the system. For some system builders this is an acceptable |
| 28 | trade-off. |
Andrey Ryabinin | c6d3085 | 2016-01-20 15:00:55 -0800 | [diff] [blame] | 29 | |
Arnd Bergmann | ea91a1d | 2020-05-21 16:20:37 +0200 | [diff] [blame] | 30 | config UBSAN_KCOV_BROKEN |
| 31 | def_bool KCOV && CC_HAS_SANCOV_TRACE_PC |
| 32 | depends on CC_IS_CLANG |
| 33 | depends on !$(cc-option,-Werror=unused-command-line-argument -fsanitize=bounds -fsanitize-coverage=trace-pc) |
| 34 | help |
| 35 | Some versions of clang support either UBSAN or KCOV but not the |
| 36 | combination of the two. |
| 37 | See https://bugs.llvm.org/show_bug.cgi?id=45831 for the status |
| 38 | in newer releases. |
| 39 | |
Kees Cook | cdf8a76 | 2020-12-15 20:46:24 -0800 | [diff] [blame] | 40 | config CC_HAS_UBSAN_BOUNDS |
| 41 | def_bool $(cc-option,-fsanitize=bounds) |
| 42 | |
| 43 | config CC_HAS_UBSAN_ARRAY_BOUNDS |
| 44 | def_bool $(cc-option,-fsanitize=array-bounds) |
| 45 | |
Kees Cook | 277a108 | 2020-04-06 20:12:31 -0700 | [diff] [blame] | 46 | config UBSAN_BOUNDS |
| 47 | bool "Perform array index bounds checking" |
| 48 | default UBSAN |
Arnd Bergmann | ea91a1d | 2020-05-21 16:20:37 +0200 | [diff] [blame] | 49 | depends on !UBSAN_KCOV_BROKEN |
Kees Cook | cdf8a76 | 2020-12-15 20:46:24 -0800 | [diff] [blame] | 50 | depends on CC_HAS_UBSAN_ARRAY_BOUNDS || CC_HAS_UBSAN_BOUNDS |
Kees Cook | 277a108 | 2020-04-06 20:12:31 -0700 | [diff] [blame] | 51 | help |
| 52 | This option enables detection of directly indexed out of bounds |
| 53 | array accesses, where the array size is known at compile time. |
| 54 | Note that this does not protect array overflows via bad calls |
| 55 | to the {str,mem}*cpy() family of functions (that is addressed |
| 56 | by CONFIG_FORTIFY_SOURCE). |
| 57 | |
Kees Cook | cdf8a76 | 2020-12-15 20:46:24 -0800 | [diff] [blame] | 58 | config UBSAN_ONLY_BOUNDS |
| 59 | def_bool CC_HAS_UBSAN_BOUNDS && !CC_HAS_UBSAN_ARRAY_BOUNDS |
| 60 | depends on UBSAN_BOUNDS |
| 61 | help |
| 62 | This is a weird case: Clang's -fsanitize=bounds includes |
| 63 | -fsanitize=local-bounds, but it's trapping-only, so for |
| 64 | Clang, we must use -fsanitize=array-bounds when we want |
| 65 | traditional array bounds checking enabled. For GCC, we |
| 66 | want -fsanitize=bounds. |
| 67 | |
| 68 | config UBSAN_ARRAY_BOUNDS |
| 69 | def_bool CC_HAS_UBSAN_ARRAY_BOUNDS |
| 70 | depends on UBSAN_BOUNDS |
| 71 | |
George Popescu | 6a6155f | 2020-10-15 20:13:38 -0700 | [diff] [blame] | 72 | config UBSAN_LOCAL_BOUNDS |
| 73 | bool "Perform array local bounds checking" |
| 74 | depends on UBSAN_TRAP |
George Popescu | 6a6155f | 2020-10-15 20:13:38 -0700 | [diff] [blame] | 75 | depends on !UBSAN_KCOV_BROKEN |
Kees Cook | cdf8a76 | 2020-12-15 20:46:24 -0800 | [diff] [blame] | 76 | depends on $(cc-option,-fsanitize=local-bounds) |
George Popescu | 6a6155f | 2020-10-15 20:13:38 -0700 | [diff] [blame] | 77 | help |
| 78 | This option enables -fsanitize=local-bounds which traps when an |
Kees Cook | cdf8a76 | 2020-12-15 20:46:24 -0800 | [diff] [blame] | 79 | exception/error is detected. Therefore, it may only be enabled |
| 80 | with CONFIG_UBSAN_TRAP. |
| 81 | |
George Popescu | 6a6155f | 2020-10-15 20:13:38 -0700 | [diff] [blame] | 82 | Enabling this option detects errors due to accesses through a |
| 83 | pointer that is derived from an object of a statically-known size, |
| 84 | where an added offset (which may not be known statically) is |
| 85 | out-of-bounds. |
| 86 | |
Kees Cook | cdf8a76 | 2020-12-15 20:46:24 -0800 | [diff] [blame] | 87 | config UBSAN_SHIFT |
Kees Cook | c637693 | 2020-12-15 20:46:39 -0800 | [diff] [blame^] | 88 | bool "Perform checking for bit-shift overflows" |
| 89 | default UBSAN |
Kees Cook | cdf8a76 | 2020-12-15 20:46:24 -0800 | [diff] [blame] | 90 | depends on $(cc-option,-fsanitize=shift) |
Kees Cook | c637693 | 2020-12-15 20:46:39 -0800 | [diff] [blame^] | 91 | help |
| 92 | This option enables -fsanitize=shift which checks for bit-shift |
| 93 | operations that overflow to the left or go switch to negative |
| 94 | for signed types. |
Kees Cook | cdf8a76 | 2020-12-15 20:46:24 -0800 | [diff] [blame] | 95 | |
| 96 | config UBSAN_DIV_ZERO |
Kees Cook | c637693 | 2020-12-15 20:46:39 -0800 | [diff] [blame^] | 97 | bool "Perform checking for integer divide-by-zero" |
Kees Cook | cdf8a76 | 2020-12-15 20:46:24 -0800 | [diff] [blame] | 98 | depends on $(cc-option,-fsanitize=integer-divide-by-zero) |
Kees Cook | c637693 | 2020-12-15 20:46:39 -0800 | [diff] [blame^] | 99 | help |
| 100 | This option enables -fsanitize=integer-divide-by-zero which checks |
| 101 | for integer division by zero. This is effectively redundant with the |
| 102 | kernel's existing exception handling, though it can provide greater |
| 103 | debugging information under CONFIG_UBSAN_REPORT_FULL. |
Kees Cook | cdf8a76 | 2020-12-15 20:46:24 -0800 | [diff] [blame] | 104 | |
| 105 | config UBSAN_UNREACHABLE |
Kees Cook | c637693 | 2020-12-15 20:46:39 -0800 | [diff] [blame^] | 106 | bool "Perform checking for unreachable code" |
| 107 | # objtool already handles unreachable checking and gets angry about |
| 108 | # seeing UBSan instrumentation located in unreachable places. |
| 109 | depends on !STACK_VALIDATION |
Kees Cook | cdf8a76 | 2020-12-15 20:46:24 -0800 | [diff] [blame] | 110 | depends on $(cc-option,-fsanitize=unreachable) |
Kees Cook | c637693 | 2020-12-15 20:46:39 -0800 | [diff] [blame^] | 111 | help |
| 112 | This option enables -fsanitize=unreachable which checks for control |
| 113 | flow reaching an expected-to-be-unreachable position. |
Kees Cook | cdf8a76 | 2020-12-15 20:46:24 -0800 | [diff] [blame] | 114 | |
| 115 | config UBSAN_SIGNED_OVERFLOW |
Kees Cook | c637693 | 2020-12-15 20:46:39 -0800 | [diff] [blame^] | 116 | bool "Perform checking for signed arithmetic overflow" |
| 117 | default UBSAN |
Kees Cook | cdf8a76 | 2020-12-15 20:46:24 -0800 | [diff] [blame] | 118 | depends on $(cc-option,-fsanitize=signed-integer-overflow) |
Kees Cook | c637693 | 2020-12-15 20:46:39 -0800 | [diff] [blame^] | 119 | help |
| 120 | This option enables -fsanitize=signed-integer-overflow which checks |
| 121 | for overflow of any arithmetic operations with signed integers. |
Kees Cook | cdf8a76 | 2020-12-15 20:46:24 -0800 | [diff] [blame] | 122 | |
| 123 | config UBSAN_UNSIGNED_OVERFLOW |
Kees Cook | c637693 | 2020-12-15 20:46:39 -0800 | [diff] [blame^] | 124 | bool "Perform checking for unsigned arithmetic overflow" |
Kees Cook | cdf8a76 | 2020-12-15 20:46:24 -0800 | [diff] [blame] | 125 | depends on $(cc-option,-fsanitize=unsigned-integer-overflow) |
Kees Cook | c637693 | 2020-12-15 20:46:39 -0800 | [diff] [blame^] | 126 | help |
| 127 | This option enables -fsanitize=unsigned-integer-overflow which checks |
| 128 | for overflow of any arithmetic operations with unsigned integers. This |
| 129 | currently causes x86 to fail to boot. |
Kees Cook | cdf8a76 | 2020-12-15 20:46:24 -0800 | [diff] [blame] | 130 | |
| 131 | config UBSAN_OBJECT_SIZE |
Kees Cook | c637693 | 2020-12-15 20:46:39 -0800 | [diff] [blame^] | 132 | bool "Perform checking for accesses beyond the end of objects" |
| 133 | default UBSAN |
Kees Cook | 61e0349 | 2020-12-15 20:46:28 -0800 | [diff] [blame] | 134 | # gcc hugely expands stack usage with -fsanitize=object-size |
| 135 | # https://lore.kernel.org/lkml/CAHk-=wjPasyJrDuwDnpHJS2TuQfExwe=px-SzLeN8GFMAQJPmQ@mail.gmail.com/ |
| 136 | depends on !CC_IS_GCC |
Kees Cook | cdf8a76 | 2020-12-15 20:46:24 -0800 | [diff] [blame] | 137 | depends on $(cc-option,-fsanitize=object-size) |
Kees Cook | c637693 | 2020-12-15 20:46:39 -0800 | [diff] [blame^] | 138 | help |
| 139 | This option enables -fsanitize=object-size which checks for accesses |
| 140 | beyond the end of objects where the optimizer can determine both the |
| 141 | object being operated on and its size, usually seen with bad downcasts, |
| 142 | or access to struct members from NULL pointers. |
Kees Cook | cdf8a76 | 2020-12-15 20:46:24 -0800 | [diff] [blame] | 143 | |
| 144 | config UBSAN_BOOL |
Kees Cook | c637693 | 2020-12-15 20:46:39 -0800 | [diff] [blame^] | 145 | bool "Perform checking for non-boolean values used as boolean" |
| 146 | default UBSAN |
Kees Cook | cdf8a76 | 2020-12-15 20:46:24 -0800 | [diff] [blame] | 147 | depends on $(cc-option,-fsanitize=bool) |
Kees Cook | c637693 | 2020-12-15 20:46:39 -0800 | [diff] [blame^] | 148 | help |
| 149 | This option enables -fsanitize=bool which checks for boolean values being |
| 150 | loaded that are neither 0 nor 1. |
Kees Cook | cdf8a76 | 2020-12-15 20:46:24 -0800 | [diff] [blame] | 151 | |
| 152 | config UBSAN_ENUM |
Kees Cook | c637693 | 2020-12-15 20:46:39 -0800 | [diff] [blame^] | 153 | bool "Perform checking for out of bounds enum values" |
| 154 | default UBSAN |
Kees Cook | cdf8a76 | 2020-12-15 20:46:24 -0800 | [diff] [blame] | 155 | depends on $(cc-option,-fsanitize=enum) |
Kees Cook | c637693 | 2020-12-15 20:46:39 -0800 | [diff] [blame^] | 156 | help |
| 157 | This option enables -fsanitize=enum which checks for values being loaded |
| 158 | into an enum that are outside the range of given values for the given enum. |
| 159 | |
| 160 | config UBSAN_ALIGNMENT |
| 161 | bool "Perform checking for misaligned pointer usage" |
| 162 | default !HAVE_EFFICIENT_UNALIGNED_ACCESS |
| 163 | depends on !UBSAN_TRAP && !COMPILE_TEST |
| 164 | depends on $(cc-option,-fsanitize=alignment) |
| 165 | help |
| 166 | This option enables the check of unaligned memory accesses. |
| 167 | Enabling this option on architectures that support unaligned |
| 168 | accesses may produce a lot of false positives. |
Kees Cook | cdf8a76 | 2020-12-15 20:46:24 -0800 | [diff] [blame] | 169 | |
Andrey Ryabinin | c6d3085 | 2016-01-20 15:00:55 -0800 | [diff] [blame] | 170 | config UBSAN_SANITIZE_ALL |
| 171 | bool "Enable instrumentation for the entire kernel" |
Andrey Ryabinin | c6d3085 | 2016-01-20 15:00:55 -0800 | [diff] [blame] | 172 | depends on ARCH_HAS_UBSAN_SANITIZE_ALL |
| 173 | default y |
| 174 | help |
| 175 | This option activates instrumentation for the entire kernel. |
| 176 | If you don't enable this option, you have to explicitly specify |
| 177 | UBSAN_SANITIZE := y for the files/directories you want to check for UB. |
Yang Shi | 7707535 | 2016-02-11 16:12:55 -0800 | [diff] [blame] | 178 | Enabling this option will get kernel image size increased |
| 179 | significantly. |
Andrey Ryabinin | c6d3085 | 2016-01-20 15:00:55 -0800 | [diff] [blame] | 180 | |
Jinbum Park | 854686f | 2018-04-10 16:32:58 -0700 | [diff] [blame] | 181 | config TEST_UBSAN |
| 182 | tristate "Module for testing for undefined behavior detection" |
Kees Cook | 277a108 | 2020-04-06 20:12:31 -0700 | [diff] [blame] | 183 | depends on m |
Jinbum Park | 854686f | 2018-04-10 16:32:58 -0700 | [diff] [blame] | 184 | help |
| 185 | This is a test module for UBSAN. |
| 186 | It triggers various undefined behavior, and detect it. |
Kees Cook | 277a108 | 2020-04-06 20:12:31 -0700 | [diff] [blame] | 187 | |
| 188 | endif # if UBSAN |