| .. | .. |
|---|
| 1 | +# SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | config ARCH_HAS_UBSAN_SANITIZE_ALL |
|---|
| 2 | 3 | bool |
|---|
| 3 | 4 | |
|---|
| 4 | | -config UBSAN |
|---|
| 5 | +menuconfig UBSAN |
|---|
| 5 | 6 | bool "Undefined behaviour sanity checker" |
|---|
| 6 | 7 | help |
|---|
| 7 | | - This option enables undefined behaviour sanity checker |
|---|
| 8 | + This option enables the Undefined Behaviour sanity checker. |
|---|
| 8 | 9 | Compile-time instrumentation is used to detect various undefined |
|---|
| 9 | | - behaviours in runtime. Various types of checks may be enabled |
|---|
| 10 | | - via boot parameter ubsan_handle |
|---|
| 11 | | - (see: Documentation/dev-tools/ubsan.rst). |
|---|
| 10 | + behaviours at runtime. For more details, see: |
|---|
| 11 | + Documentation/dev-tools/ubsan.rst |
|---|
| 12 | + |
|---|
| 13 | +if UBSAN |
|---|
| 14 | + |
|---|
| 15 | +config UBSAN_TRAP |
|---|
| 16 | + bool "On Sanitizer warnings, abort the running kernel code" |
|---|
| 17 | + depends on !COMPILE_TEST |
|---|
| 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. |
|---|
| 29 | + |
|---|
| 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 | + |
|---|
| 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 | + |
|---|
| 46 | +config UBSAN_BOUNDS |
|---|
| 47 | + bool "Perform array index bounds checking" |
|---|
| 48 | + default UBSAN |
|---|
| 49 | + depends on !UBSAN_KCOV_BROKEN |
|---|
| 50 | + depends on CC_HAS_UBSAN_ARRAY_BOUNDS || CC_HAS_UBSAN_BOUNDS |
|---|
| 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 | + |
|---|
| 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 | + |
|---|
| 72 | +config UBSAN_LOCAL_BOUNDS |
|---|
| 73 | + bool "Perform array local bounds checking" |
|---|
| 74 | + depends on UBSAN_TRAP |
|---|
| 75 | + depends on !UBSAN_KCOV_BROKEN |
|---|
| 76 | + depends on $(cc-option,-fsanitize=local-bounds) |
|---|
| 77 | + help |
|---|
| 78 | + This option enables -fsanitize=local-bounds which traps when an |
|---|
| 79 | + exception/error is detected. Therefore, it may only be enabled |
|---|
| 80 | + with CONFIG_UBSAN_TRAP. |
|---|
| 81 | + |
|---|
| 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 | + |
|---|
| 87 | +config UBSAN_SHIFT |
|---|
| 88 | + bool "Perform checking for bit-shift overflows" |
|---|
| 89 | + default UBSAN |
|---|
| 90 | + depends on $(cc-option,-fsanitize=shift) |
|---|
| 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. |
|---|
| 95 | + |
|---|
| 96 | +config UBSAN_DIV_ZERO |
|---|
| 97 | + bool "Perform checking for integer divide-by-zero" |
|---|
| 98 | + depends on $(cc-option,-fsanitize=integer-divide-by-zero) |
|---|
| 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. |
|---|
| 104 | + |
|---|
| 105 | +config UBSAN_UNREACHABLE |
|---|
| 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 |
|---|
| 110 | + depends on $(cc-option,-fsanitize=unreachable) |
|---|
| 111 | + help |
|---|
| 112 | + This option enables -fsanitize=unreachable which checks for control |
|---|
| 113 | + flow reaching an expected-to-be-unreachable position. |
|---|
| 114 | + |
|---|
| 115 | +config UBSAN_OBJECT_SIZE |
|---|
| 116 | + bool "Perform checking for accesses beyond the end of objects" |
|---|
| 117 | + default UBSAN |
|---|
| 118 | + # gcc hugely expands stack usage with -fsanitize=object-size |
|---|
| 119 | + # https://lore.kernel.org/lkml/CAHk-=wjPasyJrDuwDnpHJS2TuQfExwe=px-SzLeN8GFMAQJPmQ@mail.gmail.com/ |
|---|
| 120 | + depends on !CC_IS_GCC |
|---|
| 121 | + depends on $(cc-option,-fsanitize=object-size) |
|---|
| 122 | + help |
|---|
| 123 | + This option enables -fsanitize=object-size which checks for accesses |
|---|
| 124 | + beyond the end of objects where the optimizer can determine both the |
|---|
| 125 | + object being operated on and its size, usually seen with bad downcasts, |
|---|
| 126 | + or access to struct members from NULL pointers. |
|---|
| 127 | + |
|---|
| 128 | +config UBSAN_BOOL |
|---|
| 129 | + bool "Perform checking for non-boolean values used as boolean" |
|---|
| 130 | + default UBSAN |
|---|
| 131 | + depends on $(cc-option,-fsanitize=bool) |
|---|
| 132 | + help |
|---|
| 133 | + This option enables -fsanitize=bool which checks for boolean values being |
|---|
| 134 | + loaded that are neither 0 nor 1. |
|---|
| 135 | + |
|---|
| 136 | +config UBSAN_ENUM |
|---|
| 137 | + bool "Perform checking for out of bounds enum values" |
|---|
| 138 | + default UBSAN |
|---|
| 139 | + depends on $(cc-option,-fsanitize=enum) |
|---|
| 140 | + help |
|---|
| 141 | + This option enables -fsanitize=enum which checks for values being loaded |
|---|
| 142 | + into an enum that are outside the range of given values for the given enum. |
|---|
| 143 | + |
|---|
| 144 | +config UBSAN_ALIGNMENT |
|---|
| 145 | + bool "Perform checking for misaligned pointer usage" |
|---|
| 146 | + default !HAVE_EFFICIENT_UNALIGNED_ACCESS |
|---|
| 147 | + depends on !UBSAN_TRAP && !COMPILE_TEST |
|---|
| 148 | + depends on $(cc-option,-fsanitize=alignment) |
|---|
| 149 | + help |
|---|
| 150 | + This option enables the check of unaligned memory accesses. |
|---|
| 151 | + Enabling this option on architectures that support unaligned |
|---|
| 152 | + accesses may produce a lot of false positives. |
|---|
| 12 | 153 | |
|---|
| 13 | 154 | config UBSAN_SANITIZE_ALL |
|---|
| 14 | 155 | bool "Enable instrumentation for the entire kernel" |
|---|
| 15 | | - depends on UBSAN |
|---|
| 16 | 156 | depends on ARCH_HAS_UBSAN_SANITIZE_ALL |
|---|
| 17 | | - |
|---|
| 18 | | - # We build with -Wno-maybe-uninitilzed, but we still want to |
|---|
| 19 | | - # use -Wmaybe-uninitilized in allmodconfig builds. |
|---|
| 20 | | - # So dependsy bellow used to disable this option in allmodconfig |
|---|
| 21 | | - depends on !COMPILE_TEST |
|---|
| 22 | 157 | default y |
|---|
| 23 | 158 | help |
|---|
| 24 | 159 | This option activates instrumentation for the entire kernel. |
|---|
| .. | .. |
|---|
| 27 | 162 | Enabling this option will get kernel image size increased |
|---|
| 28 | 163 | significantly. |
|---|
| 29 | 164 | |
|---|
| 30 | | -config UBSAN_ALIGNMENT |
|---|
| 31 | | - bool "Enable checking of pointers alignment" |
|---|
| 32 | | - depends on UBSAN |
|---|
| 33 | | - default y if !HAVE_EFFICIENT_UNALIGNED_ACCESS |
|---|
| 34 | | - help |
|---|
| 35 | | - This option enables detection of unaligned memory accesses. |
|---|
| 36 | | - Enabling this option on architectures that support unaligned |
|---|
| 37 | | - accesses may produce a lot of false positives. |
|---|
| 38 | | - |
|---|
| 39 | 165 | config TEST_UBSAN |
|---|
| 40 | 166 | tristate "Module for testing for undefined behavior detection" |
|---|
| 41 | | - depends on m && UBSAN |
|---|
| 167 | + depends on m |
|---|
| 42 | 168 | help |
|---|
| 43 | 169 | This is a test module for UBSAN. |
|---|
| 44 | 170 | It triggers various undefined behavior, and detect it. |
|---|
| 171 | + |
|---|
| 172 | +endif # if UBSAN |
|---|