Skip to content

Commit

Permalink
kasan: remove use after scope bugs detection.
Browse files Browse the repository at this point in the history
Use after scope bugs detector seems to be almost entirely useless for
the linux kernel.  It exists over two years, but I've seen only one
valid bug so far [1].  And the bug was fixed before it has been
reported.  There were some other use-after-scope reports, but they were
false-positives due to different reasons like incompatibility with
structleak plugin.

This feature significantly increases stack usage, especially with GCC <
9 version, and causes a 32K stack overflow.  It probably adds
performance penalty too.

Given all that, let's remove use-after-scope detector entirely.

While preparing this patch I've noticed that we mistakenly enable
use-after-scope detection for clang compiler regardless of
CONFIG_KASAN_EXTRA setting.  This is also fixed now.

[1] http://lkml.kernel.org/r/<[email protected]>

Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Andrey Ryabinin <[email protected]>
Acked-by: Will Deacon <[email protected]>		[arm64]
Cc: Qian Cai <[email protected]>
Cc: Alexander Potapenko <[email protected]>
Cc: Dmitry Vyukov <[email protected]>
Cc: Catalin Marinas <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
aryabinin authored and torvalds committed Mar 6, 2019
1 parent 46612b7 commit 7771bdb
Show file tree
Hide file tree
Showing 9 changed files with 0 additions and 73 deletions.
4 changes: 0 additions & 4 deletions arch/arm64/include/asm/memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,7 @@
*/
#ifdef CONFIG_KASAN
#define KASAN_SHADOW_SIZE (UL(1) << (VA_BITS - KASAN_SHADOW_SCALE_SHIFT))
#ifdef CONFIG_KASAN_EXTRA
#define KASAN_THREAD_SHIFT 2
#else
#define KASAN_THREAD_SHIFT 1
#endif /* CONFIG_KASAN_EXTRA */
#else
#define KASAN_SHADOW_SIZE (0)
#define KASAN_THREAD_SHIFT 0
Expand Down
1 change: 0 additions & 1 deletion lib/Kconfig.debug
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,6 @@ config ENABLE_MUST_CHECK
config FRAME_WARN
int "Warn for stack frames larger than (needs gcc 4.4)"
range 0 8192
default 3072 if KASAN_EXTRA
default 2048 if GCC_PLUGIN_LATENT_ENTROPY
default 1280 if (!64BIT && PARISC)
default 1024 if (!64BIT && !PARISC)
Expand Down
10 changes: 0 additions & 10 deletions lib/Kconfig.kasan
Original file line number Diff line number Diff line change
Expand Up @@ -78,16 +78,6 @@ config KASAN_SW_TAGS

endchoice

config KASAN_EXTRA
bool "KASAN: extra checks"
depends on KASAN_GENERIC && DEBUG_KERNEL && !COMPILE_TEST
help
This enables further checks in generic KASAN, for now it only
includes the address-use-after-scope check that can lead to
excessive kernel stack usage, frame size warnings and longer
compile time.
See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81715

choice
prompt "Instrumentation type"
depends on KASAN
Expand Down
24 changes: 0 additions & 24 deletions lib/test_kasan.c
Original file line number Diff line number Diff line change
Expand Up @@ -480,29 +480,6 @@ static noinline void __init copy_user_test(void)
kfree(kmem);
}

static noinline void __init use_after_scope_test(void)
{
volatile char *volatile p;

pr_info("use-after-scope on int\n");
{
int local = 0;

p = (char *)&local;
}
p[0] = 1;
p[3] = 1;

pr_info("use-after-scope on array\n");
{
char local[1024] = {0};

p = local;
}
p[0] = 1;
p[1023] = 1;
}

static noinline void __init kasan_alloca_oob_left(void)
{
volatile int i = 10;
Expand Down Expand Up @@ -682,7 +659,6 @@ static int __init kmalloc_tests_init(void)
kasan_alloca_oob_right();
ksize_unpoisons_memory();
copy_user_test();
use_after_scope_test();
kmem_cache_double_free();
kmem_cache_invalid_free();
kasan_memchr();
Expand Down
19 changes: 0 additions & 19 deletions mm/kasan/generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -275,25 +275,6 @@ EXPORT_SYMBOL(__asan_storeN_noabort);
void __asan_handle_no_return(void) {}
EXPORT_SYMBOL(__asan_handle_no_return);

/* Emitted by compiler to poison large objects when they go out of scope. */
void __asan_poison_stack_memory(const void *addr, size_t size)
{
/*
* Addr is KASAN_SHADOW_SCALE_SIZE-aligned and the object is surrounded
* by redzones, so we simply round up size to simplify logic.
*/
kasan_poison_shadow(addr, round_up(size, KASAN_SHADOW_SCALE_SIZE),
KASAN_USE_AFTER_SCOPE);
}
EXPORT_SYMBOL(__asan_poison_stack_memory);

/* Emitted by compiler to unpoison large objects when they go into scope. */
void __asan_unpoison_stack_memory(const void *addr, size_t size)
{
kasan_unpoison_shadow(addr, size);
}
EXPORT_SYMBOL(__asan_unpoison_stack_memory);

/* Emitted by compiler to poison alloca()ed objects. */
void __asan_alloca_poison(unsigned long addr, size_t size)
{
Expand Down
3 changes: 0 additions & 3 deletions mm/kasan/generic_report.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,6 @@ static const char *get_shadow_bug_type(struct kasan_access_info *info)
case KASAN_KMALLOC_FREE:
bug_type = "use-after-free";
break;
case KASAN_USE_AFTER_SCOPE:
bug_type = "use-after-scope";
break;
case KASAN_ALLOCA_LEFT:
case KASAN_ALLOCA_RIGHT:
bug_type = "alloca-out-of-bounds";
Expand Down
3 changes: 0 additions & 3 deletions mm/kasan/kasan.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
#define KASAN_STACK_MID 0xF2
#define KASAN_STACK_RIGHT 0xF3
#define KASAN_STACK_PARTIAL 0xF4
#define KASAN_USE_AFTER_SCOPE 0xF8

/*
* alloca redzone shadow values
Expand Down Expand Up @@ -187,8 +186,6 @@ void __asan_unregister_globals(struct kasan_global *globals, size_t size);
void __asan_loadN(unsigned long addr, size_t size);
void __asan_storeN(unsigned long addr, size_t size);
void __asan_handle_no_return(void);
void __asan_poison_stack_memory(const void *addr, size_t size);
void __asan_unpoison_stack_memory(const void *addr, size_t size);
void __asan_alloca_poison(unsigned long addr, size_t size);
void __asan_allocas_unpoison(const void *stack_top, const void *stack_bottom);

Expand Down
5 changes: 0 additions & 5 deletions scripts/Makefile.kasan
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,9 @@ else
$(call cc-param,asan-globals=1) \
$(call cc-param,asan-instrumentation-with-call-threshold=$(call_threshold)) \
$(call cc-param,asan-stack=$(CONFIG_KASAN_STACK)) \
$(call cc-param,asan-use-after-scope=1) \
$(call cc-param,asan-instrument-allocas=1)
endif

ifdef CONFIG_KASAN_EXTRA
CFLAGS_KASAN += $(call cc-option, -fsanitize-address-use-after-scope)
endif

endif # CONFIG_KASAN_GENERIC

ifdef CONFIG_KASAN_SW_TAGS
Expand Down
4 changes: 0 additions & 4 deletions scripts/gcc-plugins/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,6 @@ config GCC_PLUGIN_LATENT_ENTROPY

config GCC_PLUGIN_STRUCTLEAK
bool "Force initialization of variables containing userspace addresses"
# Currently STRUCTLEAK inserts initialization out of live scope of
# variables from KASAN point of view. This leads to KASAN false
# positive reports. Prohibit this combination for now.
depends on !KASAN_EXTRA
help
This plugin zero-initializes any structures containing a
__user attribute. This can prevent some classes of information
Expand Down

0 comments on commit 7771bdb

Please sign in to comment.