-
For each memory location KernelMemorySanitizer maintains two types of
metadata:1. The so-called shadow of that location - а byte:byte mapping describing
whether or not individual bits of memory are initialized (shadow is 0)
or not (shadow is 1).
2. The origins of that location - а 4-byte:4-byte mapping containing
4-byte IDs of the stack traces where uninitialized values were
created.Each struct page now contains pointers to two struct pages holding KMSAN
metadata (shadow and origins) for the original struct page. Utility
routines in mm/kmsan/core.c and mm/kmsan/shadow.c handle the metadata
creation, addressing, copying and checking. mm/kmsan/report.c performs
error reporting in the cases an uninitialized value is used in a way that
leads to undefined behavior.KMSAN compiler instrumentation is responsible for tracking the metadata
along with the kernel memory. mm/kmsan/instrumentation.c provides the
implementation for instrumentation hooks that are called from files
compiled with -fsanitize=kernel-memory.To aid parameter passing (also done at instrumentation level), each
task_struct now contains a struct kmsan_task_state used to track the
metadata of function parameters and return values for that task.Finally, this patch provides CONFIG_KMSAN that enables KMSAN, and declares
CFLAGS_KMSAN, which are applied to files compiled with KMSAN. The
KMSAN_SANITIZE:=n Makefile directive can be used to completely disable
KMSAN instrumentation for certain files.Similarly, KMSAN_ENABLE_CHECKS:=n disables KMSAN checks and makes newly
created stack memory initialized.Users can also use functions from include/linux/kmsan-checks.h to mark
certain memory regions as uninitialized or initialized (this is called
"poisoning" and "unpoisoning") or check that a particular region is
initialized.Link: https://lkml.kernel.org/r/20220915150417.722975-12-glider@google.com
Signed-off-by: Alexander Potapenko
Acked-by: Marco Elver
Cc: Alexander Viro
Cc: Alexei Starovoitov
Cc: Andrey Konovalov
Cc: Andrey Konovalov
Cc: Andy Lutomirski
Cc: Arnd Bergmann
Cc: Borislav Petkov
Cc: Christoph Hellwig
Cc: Christoph Lameter
Cc: David Rientjes
Cc: Dmitry Vyukov
Cc: Eric Biggers
Cc: Eric Biggers
Cc: Eric Dumazet
Cc: Greg Kroah-Hartman
Cc: Herbert Xu
Cc: Ilya Leoshkevich
Cc: Ingo Molnar
Cc: Jens Axboe
Cc: Joonsoo Kim
Cc: Kees Cook
Cc: Mark Rutland
Cc: Matthew Wilcox
Cc: Michael S. Tsirkin
Cc: Pekka Enberg
Cc: Peter Zijlstra
Cc: Petr Mladek
Cc: Stephen Rothwell
Cc: Steven Rostedt
Cc: Thomas Gleixner
Cc: Vasily Gorbik
Cc: Vegard Nossum
Cc: Vlastimil Babka
Signed-off-by: Andrew Morton