Module Name: src
Committed By: maxv
Date: Sun Feb 24 08:02:45 UTC 2019
Modified Files:
src/sys/arch/amd64/conf: Makefile.amd64
src/sys/kern: subr_asan.c
Log Message:
Add support for use-after-scope detection in KASAN. It is available since
GCC7, and we have GCC7 by default now.
Slightly reorder the code, and remove a duplicated KASSERT too.
Tested on amd64-KASAN. Not yet enabled on aarch64-KASAN, but it should
work as-is.
To generate a diff of this commit:
cvs rdiff -u -r1.75 -r1.76 src/sys/arch/amd64/conf/Makefile.amd64
cvs rdiff -u -r1.3 -r1.4 src/sys/kern/subr_asan.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/amd64/conf/Makefile.amd64
diff -u src/sys/arch/amd64/conf/Makefile.amd64:1.75 src/sys/arch/amd64/conf/Makefile.amd64:1.76
--- src/sys/arch/amd64/conf/Makefile.amd64:1.75 Wed Oct 31 06:26:25 2018
+++ src/sys/arch/amd64/conf/Makefile.amd64 Sun Feb 24 08:02:45 2019
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.amd64,v 1.75 2018/10/31 06:26:25 maxv Exp $
+# $NetBSD: Makefile.amd64,v 1.76 2019/02/24 08:02:45 maxv Exp $
# Makefile for NetBSD
#
@@ -52,6 +52,7 @@ CFLAGS+= -mindirect-branch-register
.if ${KASAN:U0} > 0 && ${HAVE_GCC:U0} > 0
KASANFLAGS= -fsanitize=kernel-address \
--param asan-globals=1 --param asan-stack=1 \
+ -fsanitize-address-use-after-scope \
-fasan-shadow-offset=0xDFFF900000000000
.for f in subr_asan.c
KASANFLAGS.${f}= # empty
Index: src/sys/kern/subr_asan.c
diff -u src/sys/kern/subr_asan.c:1.3 src/sys/kern/subr_asan.c:1.4
--- src/sys/kern/subr_asan.c:1.3 Wed Feb 13 14:55:29 2019
+++ src/sys/kern/subr_asan.c Sun Feb 24 08:02:45 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_asan.c,v 1.3 2019/02/13 14:55:29 kamil Exp $ */
+/* $NetBSD: subr_asan.c,v 1.4 2019/02/24 08:02:45 maxv Exp $ */
/*
* Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_asan.c,v 1.3 2019/02/13 14:55:29 kamil Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_asan.c,v 1.4 2019/02/24 08:02:45 maxv Exp $");
#include <sys/param.h>
#include <sys/device.h>
@@ -182,6 +182,16 @@ kasan_shadow_1byte_markvalid(unsigned lo
}
static __always_inline void
+kasan_shadow_Nbyte_markvalid(const void *addr, size_t size)
+{
+ size_t i;
+
+ for (i = 0; i < size; i++) {
+ kasan_shadow_1byte_markvalid((unsigned long)addr+i);
+ }
+}
+
+static __always_inline void
kasan_shadow_Nbyte_fill(const void *addr, size_t size, uint8_t val)
{
void *shad;
@@ -210,16 +220,10 @@ kasan_add_redzone(size_t *size)
static void
kasan_markmem(const void *addr, size_t size, bool valid)
{
- size_t i;
-
KASSERT((vaddr_t)addr % KASAN_SHADOW_SCALE_SIZE == 0);
-
if (valid) {
- for (i = 0; i < size; i++) {
- kasan_shadow_1byte_markvalid((unsigned long)addr+i);
- }
+ kasan_shadow_Nbyte_markvalid(addr, size);
} else {
- KASSERT(size % KASAN_SHADOW_SCALE_SIZE == 0);
kasan_shadow_Nbyte_fill(addr, size, KASAN_MEMORY_REDZONE);
}
}
@@ -537,3 +541,17 @@ ASAN_SET_SHADOW(f2);
ASAN_SET_SHADOW(f3);
ASAN_SET_SHADOW(f5);
ASAN_SET_SHADOW(f8);
+
+void __asan_poison_stack_memory(const void *, size_t);
+void __asan_unpoison_stack_memory(const void *, size_t);
+
+void __asan_poison_stack_memory(const void *addr, size_t size)
+{
+ size = roundup(size, KASAN_SHADOW_SCALE_SIZE);
+ kasan_shadow_Nbyte_fill(addr, size, KASAN_USE_AFTER_SCOPE);
+}
+
+void __asan_unpoison_stack_memory(const void *addr, size_t size)
+{
+ kasan_shadow_Nbyte_markvalid(addr, size);
+}