17 Oct, 2020

1 commit

  • When the kernel is compiled with Clang, -fsanitize=bounds expands to
    -fsanitize=array-bounds and -fsanitize=local-bounds.

    Enabling -fsanitize=local-bounds with Clang has the unfortunate
    side-effect of inserting traps; this goes back to its original intent,
    which was as a hardening and not a debugging feature [1]. The same
    feature made its way into -fsanitize=bounds, but the traps remained. For
    that reason, -fsanitize=bounds was split into 'array-bounds' and
    'local-bounds' [2].

    Since 'local-bounds' doesn't behave like a normal sanitizer, enable it
    with Clang only if trapping behaviour was requested by
    CONFIG_UBSAN_TRAP=y.

    Add the UBSAN_BOUNDS_LOCAL config to Kconfig.ubsan to enable the
    'local-bounds' option by default when UBSAN_TRAP is enabled.

    [1] http://lists.llvm.org/pipermail/llvm-dev/2012-May/049972.html
    [2] http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20131021/091536.html

    Suggested-by: Marco Elver
    Signed-off-by: George Popescu
    Signed-off-by: Andrew Morton
    Reviewed-by: David Brazdil
    Reviewed-by: Marco Elver
    Cc: Masahiro Yamada
    Cc: Michal Marek
    Cc: Nathan Chancellor
    Cc: Nick Desaulniers
    Cc: Kees Cook
    Cc: Dmitry Vyukov
    Cc: Arnd Bergmann
    Cc: Peter Zijlstra
    Link: https://lkml.kernel.org/r/20200922074330.2549523-1-georgepope@google.com
    Signed-off-by: Linus Torvalds

    George Popescu
     

12 Jun, 2020

1 commit

  • Clang does not allow -fsanitize-coverage=trace-{pc,cmp} together
    with -fsanitize=bounds or with ubsan:

    clang: error: argument unused during compilation: '-fsanitize-coverage=trace-pc' [-Werror,-Wunused-command-line-argument]
    clang: error: argument unused during compilation: '-fsanitize-coverage=trace-cmp' [-Werror,-Wunused-command-line-argument]

    To avoid the warning, check whether clang can handle this correctly or
    disallow ubsan and kcsan when kcov is enabled.

    Signed-off-by: Arnd Bergmann
    Signed-off-by: Marco Elver
    Signed-off-by: Borislav Petkov
    Signed-off-by: Thomas Gleixner
    Acked-by: Marco Elver
    Acked-by: Peter Zijlstra (Intel)
    Link: https://bugs.llvm.org/show_bug.cgi?id=45831
    Link: https://lore.kernel.org/lkml/20200505142341.1096942-1-arnd@arndb.de
    Link: https://lkml.kernel.org/r/20200521142047.169334-2-elver@google.com

    Arnd Bergmann
     

03 Jun, 2020

1 commit

  • Commit 8d58f222e85f ("ubsan: disable UBSAN_ALIGNMENT under
    COMPILE_TEST") tried to fix the pathological results of UBSAN_ALIGNMENT
    with UBSAN_TRAP (which objtool would rightly scream about), but it made
    an assumption about how COMPILE_TEST gets set (it is not set for
    randconfig). As a result, we need a bigger hammer here: just don't
    allow the alignment checks with the trap mode.

    Fixes: 8d58f222e85f ("ubsan: disable UBSAN_ALIGNMENT under COMPILE_TEST")
    Reported-by: Randy Dunlap
    Signed-off-by: Kees Cook
    Signed-off-by: Andrew Morton
    Acked-by: Randy Dunlap
    Cc: Josh Poimboeuf
    Cc: Dmitry Vyukov
    Cc: Elena Petrova
    Link: http://lkml.kernel.org/r/202005291236.000FCB6@keescook
    Link: https://lore.kernel.org/lkml/742521db-1e8c-0d7a-1ed4-a908894fb497@infradead.org/
    Signed-off-by: Linus Torvalds

    Kees Cook
     

08 May, 2020

1 commit

  • The documentation for UBSAN_ALIGNMENT already mentions that it should
    not be used on all*config builds (and for efficient-unaligned-access
    architectures), so just refactor the Kconfig to correctly implement this
    so randconfigs will stop creating insane images that freak out objtool
    under CONFIG_UBSAN_TRAP (due to the false positives producing functions
    that never return, etc).

    Link: http://lkml.kernel.org/r/202005011433.C42EA3E2D@keescook
    Fixes: 0887a7ebc977 ("ubsan: add trap instrumentation option")
    Signed-off-by: Kees Cook
    Reported-by: Randy Dunlap
    Link: https://lore.kernel.org/linux-next/202004231224.D6B3B650@keescook/
    Signed-off-by: Andrew Morton
    Cc: Josh Poimboeuf
    Cc: Stephen Rothwell
    Cc: Peter Zijlstra
    Cc: Andrey Ryabinin
    Signed-off-by: Linus Torvalds

    Kees Cook
     

08 Apr, 2020

2 commits

  • 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] https://github.com/KSPP/linux/issues/6
    [2] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92589

    Suggested-by: Elena Petrova
    Signed-off-by: Kees Cook
    Signed-off-by: Andrew Morton
    Reviewed-by: Andrey Ryabinin
    Acked-by: Dmitry Vyukov
    Cc: Alexander Potapenko
    Cc: Andrey Konovalov
    Cc: Ard Biesheuvel
    Cc: Arnd Bergmann
    Cc: Dan Carpenter
    Cc: "Gustavo A. R. Silva"
    Link: http://lkml.kernel.org/r/20200227193516.32566-3-keescook@chromium.org
    Signed-off-by: Linus Torvalds

    Kees Cook
     
  • Patch series "ubsan: Split out bounds checker", v5.

    This splits out the bounds checker so it can be individually used. This
    is enabled in Android and hopefully for syzbot. Includes LKDTM tests for
    behavioral corner-cases (beyond just the bounds checker), and adjusts
    ubsan and kasan slightly for correct panic handling.

    This patch (of 6):

    The Undefined Behavior Sanitizer can operate in two modes: warning
    reporting mode via lib/ubsan.c handler calls, or trap mode, which uses
    __builtin_trap() as the handler. Using lib/ubsan.c means the kernel image
    is about 5% larger (due to all the debugging text and reporting structures
    to capture details about the warning conditions). Using the trap mode,
    the image size changes are much smaller, though at the loss of the
    "warning only" mode.

    In order to give greater flexibility to system builders that want minimal
    changes to image size and are prepared to deal with kernel code being
    aborted and potentially destabilizing the system, this introduces
    CONFIG_UBSAN_TRAP. The resulting image sizes comparison:

    text data bss dec hex filename
    19533663 6183037 18554956 44271656 2a38828 vmlinux.stock
    19991849 7618513 18874448 46484810 2c54d4a vmlinux.ubsan
    19712181 6284181 18366540 44362902 2a4ec96 vmlinux.ubsan-trap

    CONFIG_UBSAN=y: image +4.8% (text +2.3%, data +18.9%)
    CONFIG_UBSAN_TRAP=y: image +0.2% (text +0.9%, data +1.6%)

    Additionally adjusts the CONFIG_UBSAN Kconfig help for clarity and removes
    the mention of non-existing boot param "ubsan_handle".

    Suggested-by: Elena Petrova
    Signed-off-by: Kees Cook
    Signed-off-by: Andrew Morton
    Acked-by: Dmitry Vyukov
    Cc: Andrey Ryabinin
    Cc: Andrey Konovalov
    Cc: Alexander Potapenko
    Cc: Dan Carpenter
    Cc: "Gustavo A. R. Silva"
    Cc: Arnd Bergmann
    Cc: Ard Biesheuvel
    Link: http://lkml.kernel.org/r/20200227193516.32566-2-keescook@chromium.org
    Signed-off-by: Linus Torvalds

    Kees Cook
     

21 May, 2019

1 commit


08 Mar, 2019

1 commit

  • When booting an allmodconfig kernel, there are a lot of false-positives.
    With a message like this 'UBSAN: Undefined behaviour in...' with a call
    trace that follows.

    UBSAN warnings are a result of enabling noisy CONFIG_UBSAN_ALIGNMENT
    which is disabled by default if HAVE_EFFICIENT_UNALIGNED_ACCESS=y.

    It's noisy even if don't have efficient unaligned access, e.g. people
    often add __cacheline_aligned_in_smp in structs, but forget to align
    allocations of such struct (kmalloc() give 8-byte alignment in worst
    case).

    Rework so that when building a allmodconfig kernel that turns everything
    into '=m' or '=y' will turn off UBSAN_ALIGNMENT.

    [aryabinin@virtuozzo.com: changelog addition]
    Link: http://lkml.kernel.org/r/20181217150326.30933-1-anders.roxell@linaro.org
    Signed-off-by: Anders Roxell
    Suggested-by: Arnd Bergmann
    Acked-by: Andrey Ryabinin
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Anders Roxell
     

11 Aug, 2018

1 commit

  • With gcc-8 fsanitize=null become very noisy. GCC started to complain
    about things like &a->b, where 'a' is NULL pointer. There is no NULL
    dereference, we just calculate address to struct member. It's
    technically undefined behavior so UBSAN is correct to report it. But as
    long as there is no real NULL-dereference, I think, we should be fine.

    -fno-delete-null-pointer-checks compiler flag should protect us from any
    consequences. So let's just no use -fsanitize=null as it's not useful
    for us. If there is a real NULL-deref we will see crash. Even if
    userspace mapped something at NULL (root can do this), with things like
    SMAP should catch the issue.

    Link: http://lkml.kernel.org/r/20180802153209.813-1-aryabinin@virtuozzo.com
    Signed-off-by: Andrey Ryabinin
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Andrey Ryabinin
     

12 Apr, 2018

1 commit

  • This is a test module for UBSAN. It triggers all undefined behaviors
    that linux supports now, and detect them.

    All test-cases have passed by compiling with gcc-5.5.0.

    If use gcc-4.9.x, misaligned, out-of-bounds, object-size-mismatch will not
    be detected. Because gcc-4.9.x doesn't support them.

    Link: http://lkml.kernel.org/r/20180309102247.GA2944@pjb1027-Latitude-E5410
    Signed-off-by: Jinbum Park
    Cc: Andrey Ryabinin
    Cc: Dmitry Vyukov
    Cc: Kees Cook
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Jinbum Park
     

15 Dec, 2016

1 commit


20 Sep, 2016

1 commit

  • Some architectures use a hardware defined structure at address zero.
    Checking for a null pointer will result in many ubsan reports.
    Allow users to disable the null sanitizer.

    Signed-off-by: Christian Borntraeger
    Acked-by: Andrey Ryabinin
    Signed-off-by: Heiko Carstens
    Signed-off-by: Martin Schwidefsky

    Christian Borntraeger
     

23 Mar, 2016

1 commit

  • -fsanitize=* options makes GCC less smart than usual and increase number
    of 'maybe-uninitialized' false-positives. So this patch does two things:

    * Add -Wno-maybe-uninitialized to CFLAGS_UBSAN which will disable all
    such warnings for instrumented files.

    * Remove CONFIG_UBSAN_SANITIZE_ALL from all[yes|mod]config builds. So
    the all[yes|mod]config build goes without -fsanitize=* and still with
    -Wmaybe-uninitialized.

    Signed-off-by: Andrey Ryabinin
    Reported-by: Fengguang Wu
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Andrey Ryabinin
     

12 Feb, 2016

1 commit

  • When enabling UBSAN_SANITIZE_ALL, the kernel image size gets increased
    significantly (~3x). So, it sounds better to have some note in Kconfig.

    And, fixed a typo.

    Signed-off-by: Yang Shi
    Acked-by: Andrey Ryabinin
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Yang Shi
     

21 Jan, 2016

1 commit

  • UBSAN uses compile-time instrumentation to catch undefined behavior
    (UB). Compiler inserts code that perform certain kinds of checks before
    operations that could cause UB. If check fails (i.e. UB detected)
    __ubsan_handle_* function called to print error message.

    So the most of the work is done by compiler. This patch just implements
    ubsan handlers printing errors.

    GCC has this capability since 4.9.x [1] (see -fsanitize=undefined
    option and its suboptions).
    However GCC 5.x has more checkers implemented [2].
    Article [3] has a bit more details about UBSAN in the GCC.

    [1] - https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Debugging-Options.html
    [2] - https://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html
    [3] - http://developerblog.redhat.com/2014/10/16/gcc-undefined-behavior-sanitizer-ubsan/

    Issues which UBSAN has found thus far are:

    Found bugs:

    * out-of-bounds access - 97840cb67ff5 ("netfilter: nfnetlink: fix
    insufficient validation in nfnetlink_bind")

    undefined shifts:

    * d48458d4a768 ("jbd2: use a better hash function for the revoke
    table")

    * 10632008b9e1 ("clockevents: Prevent shift out of bounds")

    * 'x << -1' shift in ext4 -
    http://lkml.kernel.org/r/

    * undefined rol32(0) -
    http://lkml.kernel.org/r/

    * undefined dirty_ratelimit calculation -
    http://lkml.kernel.org/r/

    * undefined roundown_pow_of_two(0) -
    http://lkml.kernel.org/r/

    * [WONTFIX] undefined shift in __bpf_prog_run -
    http://lkml.kernel.org/r/

    WONTFIX here because it should be fixed in bpf program, not in kernel.

    signed overflows:

    * 32a8df4e0b33f ("sched: Fix odd values in effective_load()
    calculations")

    * mul overflow in ntp -
    http://lkml.kernel.org/r/

    * incorrect conversion into rtc_time in rtc_time64_to_tm() -
    http://lkml.kernel.org/r/

    * unvalidated timespec in io_getevents() -
    http://lkml.kernel.org/r/

    * [NOTABUG] signed overflow in ktime_add_safe() -
    http://lkml.kernel.org/r/

    [akpm@linux-foundation.org: fix unused local warning]
    [akpm@linux-foundation.org: fix __int128 build woes]
    Signed-off-by: Andrey Ryabinin
    Cc: Peter Zijlstra
    Cc: Sasha Levin
    Cc: Randy Dunlap
    Cc: Rasmus Villemoes
    Cc: Jonathan Corbet
    Cc: Michal Marek
    Cc: Thomas Gleixner
    Cc: Ingo Molnar
    Cc: "H. Peter Anvin"
    Cc: Yury Gribov
    Cc: Dmitry Vyukov
    Cc: Konstantin Khlebnikov
    Cc: Kostya Serebryany
    Cc: Johannes Berg
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Andrey Ryabinin