All of lore.kernel.org
 help / color / mirror / Atom feed
* + kasan-emit-different-calls-for-instrumentable-memintrinsics.patch added to mm-hotfixes-unstable branch
@ 2023-02-26  5:03 Andrew Morton
  2023-02-26 10:59 ` Borislav Petkov
  0 siblings, 1 reply; 5+ messages in thread
From: Andrew Morton @ 2023-02-26  5:03 UTC (permalink / raw)
  To: mm-commits, vincenzo.frascino, tglx, ryabinin.a.a, peterz,
	nicolas, ndesaulniers, nathan, naresh.kamboju, mingo, lkft,
	keescook, jakub, glider, dvyukov, dave.hansen, bp, andreyknvl,
	elver, akpm


The patch titled
     Subject: kasan: emit different calls for instrumentable memintrinsics
has been added to the -mm mm-hotfixes-unstable branch.  Its filename is
     kasan-emit-different-calls-for-instrumentable-memintrinsics.patch

This patch will shortly appear at
     https://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new.git/tree/patches/kasan-emit-different-calls-for-instrumentable-memintrinsics.patch

This patch will later appear in the mm-hotfixes-unstable branch at
    git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm

Before you just go and hit "reply", please:
   a) Consider who else should be cc'ed
   b) Prefer to cc a suitable mailing list as well
   c) Ideally: find the original patch on the mailing list and do a
      reply-to-all to that, adding suitable additional cc's

*** Remember to use Documentation/process/submit-checklist.rst when testing your code ***

The -mm tree is included into linux-next via the mm-everything
branch at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
and is updated there every 2-3 working days

------------------------------------------------------
From: Marco Elver <elver@google.com>
Subject: kasan: emit different calls for instrumentable memintrinsics
Date: Fri, 24 Feb 2023 09:59:39 +0100

Clang 15 provides an option to prefix memcpy/memset/memmove calls with
__asan_/__hwasan_ in instrumented functions:
https://reviews.llvm.org/D122724

GCC will add support in future:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108777

Use it to regain KASAN instrumentation of memcpy/memset/memmove on
architectures that require noinstr to be really free from instrumented
mem*() functions (all GENERIC_ENTRY architectures).

Link: https://lkml.kernel.org/r/20230224085942.1791837-1-elver@google.com
Fixes: 69d4c0d32186 ("entry, kasan, x86: Disallow overriding mem*() functions")
Signed-off-by: Marco Elver <elver@google.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Andrey Konovalov <andreyknvl@gmail.com>
Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
Tested-by: Naresh Kamboju <naresh.kamboju@linaro.org>
Cc: Alexander Potapenko <glider@google.com>
Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
Cc: Borislav Petkov (AMD) <bp@alien8.de>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Dmitry Vyukov <dvyukov@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jakub Jelinek <jakub@redhat.com>
Cc: kasan-dev@googlegroups.com
Cc: Kees Cook <keescook@chromium.org>
Cc: Linux Kernel Functional Testing <lkft@linaro.org>
Cc: Nathan Chancellor <nathan@kernel.org> # build only
Cc: Nick Desaulniers <ndesaulniers@google.com>
Cc: Nicolas Schier <nicolas@fjasle.eu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vincenzo Frascino <vincenzo.frascino@arm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---


--- a/mm/kasan/kasan.h~kasan-emit-different-calls-for-instrumentable-memintrinsics
+++ b/mm/kasan/kasan.h
@@ -666,4 +666,8 @@ void __hwasan_storeN_noabort(unsigned long addr, size_t size);
 
 void __hwasan_tag_memory(unsigned long addr, u8 tag, unsigned long size);
 
+void *__hwasan_memset(void *addr, int c, size_t len);
+void *__hwasan_memmove(void *dest, const void *src, size_t len);
+void *__hwasan_memcpy(void *dest, const void *src, size_t len);
+
 #endif /* __MM_KASAN_KASAN_H */
--- a/mm/kasan/shadow.c~kasan-emit-different-calls-for-instrumentable-memintrinsics
+++ b/mm/kasan/shadow.c
@@ -107,6 +107,17 @@ void *__asan_memcpy(void *dest, const void *src, size_t len)
 }
 EXPORT_SYMBOL(__asan_memcpy);
 
+#ifdef CONFIG_KASAN_SW_TAGS
+void *__hwasan_memset(void *addr, int c, size_t len) __alias(__asan_memset);
+EXPORT_SYMBOL(__hwasan_memset);
+#ifdef __HAVE_ARCH_MEMMOVE
+void *__hwasan_memmove(void *dest, const void *src, size_t len) __alias(__asan_memmove);
+EXPORT_SYMBOL(__hwasan_memmove);
+#endif
+void *__hwasan_memcpy(void *dest, const void *src, size_t len) __alias(__asan_memcpy);
+EXPORT_SYMBOL(__hwasan_memcpy);
+#endif
+
 void kasan_poison(const void *addr, size_t size, u8 value, bool init)
 {
 	void *shadow_start, *shadow_end;
--- a/scripts/Makefile.kasan~kasan-emit-different-calls-for-instrumentable-memintrinsics
+++ b/scripts/Makefile.kasan
@@ -38,6 +38,11 @@ endif
 
 CFLAGS_KASAN += $(call cc-param,asan-stack=$(stack_enable))
 
+# Instrument memcpy/memset/memmove calls by using instrumented __asan_mem*()
+# instead. With compilers that don't support this option, compiler-inserted
+# memintrinsics won't be checked by KASAN on GENERIC_ENTRY architectures.
+CFLAGS_KASAN += $(call cc-param,asan-kernel-mem-intrinsic-prefix=1)
+
 endif # CONFIG_KASAN_GENERIC
 
 ifdef CONFIG_KASAN_SW_TAGS
@@ -54,6 +59,9 @@ CFLAGS_KASAN := -fsanitize=kernel-hwaddress \
 		$(call cc-param,hwasan-inline-all-checks=0) \
 		$(instrumentation_flags)
 
+# Instrument memcpy/memset/memmove calls by using instrumented __hwasan_mem*().
+CFLAGS_KASAN += $(call cc-param,hwasan-kernel-mem-intrinsic-prefix=1)
+
 endif # CONFIG_KASAN_SW_TAGS
 
 export CFLAGS_KASAN CFLAGS_KASAN_NOSANITIZE
_

Patches currently in -mm which might be from elver@google.com are

kasan-emit-different-calls-for-instrumentable-memintrinsics.patch
kasan-treat-meminstrinsic-as-builtins-in-uninstrumented-files.patch
kasan-test-fix-test-for-new-meminstrinsic-instrumentation.patch
kasan-x86-dont-rename-memintrinsics-in-uninstrumented-files.patch


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: + kasan-emit-different-calls-for-instrumentable-memintrinsics.patch added to mm-hotfixes-unstable branch
  2023-02-26  5:03 + kasan-emit-different-calls-for-instrumentable-memintrinsics.patch added to mm-hotfixes-unstable branch Andrew Morton
@ 2023-02-26 10:59 ` Borislav Petkov
  2023-02-26 19:41   ` Andrew Morton
  2023-02-27  7:00   ` Marco Elver
  0 siblings, 2 replies; 5+ messages in thread
From: Borislav Petkov @ 2023-02-26 10:59 UTC (permalink / raw)
  To: Andrew Morton
  Cc: mm-commits, vincenzo.frascino, tglx, ryabinin.a.a, peterz,
	nicolas, ndesaulniers, nathan, naresh.kamboju, mingo, lkft,
	keescook, jakub, glider, dvyukov, dave.hansen, andreyknvl, elver

On Sat, Feb 25, 2023 at 09:03:40PM -0800, Andrew Morton wrote:
> --- a/mm/kasan/shadow.c~kasan-emit-different-calls-for-instrumentable-memintrinsics
> +++ b/mm/kasan/shadow.c
> @@ -107,6 +107,17 @@ void *__asan_memcpy(void *dest, const void *src, size_t len)
>  }
>  EXPORT_SYMBOL(__asan_memcpy);
>  
> +#ifdef CONFIG_KASAN_SW_TAGS
> +void *__hwasan_memset(void *addr, int c, size_t len) __alias(__asan_memset);
> +EXPORT_SYMBOL(__hwasan_memset);
> +#ifdef __HAVE_ARCH_MEMMOVE
> +void *__hwasan_memmove(void *dest, const void *src, size_t len) __alias(__asan_memmove);
> +EXPORT_SYMBOL(__hwasan_memmove);
> +#endif
> +void *__hwasan_memcpy(void *dest, const void *src, size_t len) __alias(__asan_memcpy);
> +EXPORT_SYMBOL(__hwasan_memcpy);

Any particular reason those exports are not _GPL?

-- 
Regards/Gruss,
    Boris.

https://people.kernel.org/tglx/notes-about-netiquette

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: + kasan-emit-different-calls-for-instrumentable-memintrinsics.patch added to mm-hotfixes-unstable branch
  2023-02-26 10:59 ` Borislav Petkov
@ 2023-02-26 19:41   ` Andrew Morton
  2023-02-27  0:45     ` Andrey Konovalov
  2023-02-27  7:00   ` Marco Elver
  1 sibling, 1 reply; 5+ messages in thread
From: Andrew Morton @ 2023-02-26 19:41 UTC (permalink / raw)
  To: Borislav Petkov
  Cc: mm-commits, vincenzo.frascino, tglx, ryabinin.a.a, peterz,
	nicolas, ndesaulniers, nathan, naresh.kamboju, mingo, lkft,
	keescook, jakub, glider, dvyukov, dave.hansen, andreyknvl, elver

On Sun, 26 Feb 2023 11:59:55 +0100 Borislav Petkov <bp@alien8.de> wrote:

> On Sat, Feb 25, 2023 at 09:03:40PM -0800, Andrew Morton wrote:
> > --- a/mm/kasan/shadow.c~kasan-emit-different-calls-for-instrumentable-memintrinsics
> > +++ b/mm/kasan/shadow.c
> > @@ -107,6 +107,17 @@ void *__asan_memcpy(void *dest, const void *src, size_t len)
> >  }
> >  EXPORT_SYMBOL(__asan_memcpy);
> >  
> > +#ifdef CONFIG_KASAN_SW_TAGS
> > +void *__hwasan_memset(void *addr, int c, size_t len) __alias(__asan_memset);
> > +EXPORT_SYMBOL(__hwasan_memset);
> > +#ifdef __HAVE_ARCH_MEMMOVE
> > +void *__hwasan_memmove(void *dest, const void *src, size_t len) __alias(__asan_memmove);
> > +EXPORT_SYMBOL(__hwasan_memmove);
> > +#endif
> > +void *__hwasan_memcpy(void *dest, const void *src, size_t len) __alias(__asan_memcpy);
> > +EXPORT_SYMBOL(__hwasan_memcpy);
> 
> Any particular reason those exports are not _GPL?

mm/kasan/ is an exotic blend of both.  Perhaps the maintainers will
take a look at this sometime?

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: + kasan-emit-different-calls-for-instrumentable-memintrinsics.patch added to mm-hotfixes-unstable branch
  2023-02-26 19:41   ` Andrew Morton
@ 2023-02-27  0:45     ` Andrey Konovalov
  0 siblings, 0 replies; 5+ messages in thread
From: Andrey Konovalov @ 2023-02-27  0:45 UTC (permalink / raw)
  To: Andrew Morton, Borislav Petkov
  Cc: mm-commits, vincenzo.frascino, tglx, ryabinin.a.a, peterz,
	nicolas, ndesaulniers, nathan, naresh.kamboju, mingo, lkft,
	keescook, jakub, glider, dvyukov, dave.hansen, elver

On Sun, Feb 26, 2023 at 8:41 PM Andrew Morton <akpm@linux-foundation.org> wrote:
>
> On Sun, 26 Feb 2023 11:59:55 +0100 Borislav Petkov <bp@alien8.de> wrote:
>
> > On Sat, Feb 25, 2023 at 09:03:40PM -0800, Andrew Morton wrote:
> > > --- a/mm/kasan/shadow.c~kasan-emit-different-calls-for-instrumentable-memintrinsics
> > > +++ b/mm/kasan/shadow.c
> > > @@ -107,6 +107,17 @@ void *__asan_memcpy(void *dest, const void *src, size_t len)
> > >  }
> > >  EXPORT_SYMBOL(__asan_memcpy);
> > >
> > > +#ifdef CONFIG_KASAN_SW_TAGS
> > > +void *__hwasan_memset(void *addr, int c, size_t len) __alias(__asan_memset);
> > > +EXPORT_SYMBOL(__hwasan_memset);
> > > +#ifdef __HAVE_ARCH_MEMMOVE
> > > +void *__hwasan_memmove(void *dest, const void *src, size_t len) __alias(__asan_memmove);
> > > +EXPORT_SYMBOL(__hwasan_memmove);
> > > +#endif
> > > +void *__hwasan_memcpy(void *dest, const void *src, size_t len) __alias(__asan_memcpy);
> > > +EXPORT_SYMBOL(__hwasan_memcpy);
> >
> > Any particular reason those exports are not _GPL?

Not using _GPL will allow using KASAN with non-GPL modules AFAIU. I
don't see why this should be forbidden.

> mm/kasan/ is an exotic blend of both.  Perhaps the maintainers will
> take a look at this sometime?

All of the _GPL exports in mm/kasan/ are for symbols required for
KASAN tests. If there was a way to only export them for kasan_test.ko,
we could use that instead. _GPL is used as a best-effort marking.

Everything else is using EXPORT_SYMBOL().

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: + kasan-emit-different-calls-for-instrumentable-memintrinsics.patch added to mm-hotfixes-unstable branch
  2023-02-26 10:59 ` Borislav Petkov
  2023-02-26 19:41   ` Andrew Morton
@ 2023-02-27  7:00   ` Marco Elver
  1 sibling, 0 replies; 5+ messages in thread
From: Marco Elver @ 2023-02-27  7:00 UTC (permalink / raw)
  To: Borislav Petkov
  Cc: Andrew Morton, mm-commits, vincenzo.frascino, tglx, ryabinin.a.a,
	peterz, nicolas, ndesaulniers, nathan, naresh.kamboju, mingo,
	lkft, keescook, jakub, glider, dvyukov, dave.hansen, andreyknvl

On Sun, 26 Feb 2023 at 12:00, Borislav Petkov <bp@alien8.de> wrote:
>
> On Sat, Feb 25, 2023 at 09:03:40PM -0800, Andrew Morton wrote:
> > --- a/mm/kasan/shadow.c~kasan-emit-different-calls-for-instrumentable-memintrinsics
> > +++ b/mm/kasan/shadow.c
> > @@ -107,6 +107,17 @@ void *__asan_memcpy(void *dest, const void *src, size_t len)
> >  }
> >  EXPORT_SYMBOL(__asan_memcpy);
> >
> > +#ifdef CONFIG_KASAN_SW_TAGS
> > +void *__hwasan_memset(void *addr, int c, size_t len) __alias(__asan_memset);
> > +EXPORT_SYMBOL(__hwasan_memset);
> > +#ifdef __HAVE_ARCH_MEMMOVE
> > +void *__hwasan_memmove(void *dest, const void *src, size_t len) __alias(__asan_memmove);
> > +EXPORT_SYMBOL(__hwasan_memmove);
> > +#endif
> > +void *__hwasan_memcpy(void *dest, const void *src, size_t len) __alias(__asan_memcpy);
> > +EXPORT_SYMBOL(__hwasan_memcpy);
>
> Any particular reason those exports are not _GPL?

To match lib/string.c:

$> grep EXPORT_SYMBOL lib/string.c
...
EXPORT_SYMBOL(memset);
...
EXPORT_SYMBOL(memcpy);
EXPORT_SYMBOL(memmove);
...

Note that these __asan/__hwasan calls are generated by the compiler,
in place of the above.

On a more fundamental level, KASAN is low level enough that being
_GPL would probably cause headaches for valid use cases. For example,
so that vendors can use KASAN on their however licensed modules -
wherever those non-GPL modules may be used, precluding use of KASAN
there would make the quality of these things even worse.

Thanks,
-- Marco

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2023-02-27  7:01 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-02-26  5:03 + kasan-emit-different-calls-for-instrumentable-memintrinsics.patch added to mm-hotfixes-unstable branch Andrew Morton
2023-02-26 10:59 ` Borislav Petkov
2023-02-26 19:41   ` Andrew Morton
2023-02-27  0:45     ` Andrey Konovalov
2023-02-27  7:00   ` Marco Elver

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.