Skip to content

Commit

Permalink
FROMLIST: ubsan: Split "bounds" checker from other options
Browse files Browse the repository at this point in the history
In order to do kernel builds with the bounds checker individually
available, introduce CONFIG_UBSAN_BOUNDS, with the remaining options
under CONFIG_UBSAN_MISC.

For example, using this, we can start to expand the coverage syzkaller is
providing. Right now, all of UBSan is disabled for syzbot builds because
taken as a whole, it is too noisy. This will let us focus on one feature
at a time.

For the bounds checker specifically, this provides a mechanism to
eliminate an entire class of array overflows with close to zero
performance overhead (I cannot measure a difference). In my (mostly)
defconfig, enabling bounds checking adds ~4200 checks to the kernel.
Performance changes are in the noise, likely due to the branch predictors
optimizing for the non-fail path.

Some notes on the bounds checker:

- it does not instrument {mem,str}*()-family functions, it only
  instruments direct indexed accesses (e.g. "foo[i]"). Dealing with
  the {mem,str}*()-family functions is a work-in-progress around
  CONFIG_FORTIFY_SOURCE[1].

- it ignores flexible array members, including the very old single
  byte (e.g. "int foo[1];") declarations. (Note that GCC's
  implementation appears to ignore _all_ trailing arrays, but Clang only
  ignores empty, 0, and 1 byte arrays[2].)

[1] KSPP/linux#6
[2] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92589

Bug: 136249967
Link: https://lore.kernel.org/kernel-hardening/[email protected]/
Suggested-by: Elena Petrova <[email protected]>
Signed-off-by: Kees Cook <[email protected]>
Reviewed-by: Andrey Ryabinin <[email protected]>
Signed-off-by: Elena Petrova <[email protected]>
Change-Id: I1f79faea7386af1bc50faaf8b399ea6448611d5a
Signed-off-by: UtsavBalar1231 <[email protected]>
  • Loading branch information
kees authored and UtsavBalar1231 committed Mar 24, 2020
1 parent 53b6955 commit 5759099
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 1 deletion.
19 changes: 19 additions & 0 deletions lib/Kconfig.ubsan
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,25 @@ config UBSAN_TRAP
can just issue a trap. This reduces the kernel size overhead but
turns all warnings into full thread-killing exceptions.

config UBSAN_BOUNDS
bool "Perform array bounds checking"
depends on UBSAN
default UBSAN
help
This option enables detection of direct out of bounds array
accesses, where the array size is known at compile time. Note
that this does not protect character array overflows due to
bad calls to the {str,mem}*cpy() family of functions.

config UBSAN_MISC
bool "Enable all other Undefined Behavior sanity checks"
depends on UBSAN
default UBSAN
help
This option enables all sanity checks that don't have their
own Kconfig options. Disable this if you only want to have
individually selected checks.

config UBSAN_SANITIZE_ALL
bool "Enable instrumentation for the entire kernel"
depends on UBSAN
Expand Down
7 changes: 6 additions & 1 deletion scripts/Makefile.ubsan
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,20 @@ ifdef CONFIG_UBSAN_ALIGNMENT
CFLAGS_UBSAN += $(call cc-option, -fsanitize=alignment)
endif

ifdef CONFIG_UBSAN_BOUNDS
CFLAGS_UBSAN += $(call cc-option, -fsanitize=bounds)
endif

ifdef CONFIG_UBSAN_MISC
CFLAGS_UBSAN += $(call cc-option, -fsanitize=shift)
CFLAGS_UBSAN += $(call cc-option, -fsanitize=integer-divide-by-zero)
CFLAGS_UBSAN += $(call cc-option, -fsanitize=unreachable)
CFLAGS_UBSAN += $(call cc-option, -fsanitize=vla-bound)
CFLAGS_UBSAN += $(call cc-option, -fsanitize=signed-integer-overflow)
CFLAGS_UBSAN += $(call cc-option, -fsanitize=bounds)
CFLAGS_UBSAN += $(call cc-option, -fsanitize=object-size)
CFLAGS_UBSAN += $(call cc-option, -fsanitize=bool)
CFLAGS_UBSAN += $(call cc-option, -fsanitize=enum)
endif

ifdef CONFIG_UBSAN_TRAP
CFLAGS_UBSAN += $(call cc-option, -fsanitize-undefined-trap-on-error)
Expand Down

0 comments on commit 5759099

Please sign in to comment.