Module Name: src
Committed By: maxv
Date: Fri Apr 3 18:12:39 UTC 2020
Modified Files:
src/sys/arch/amd64/conf: Makefile.amd64
src/sys/kern: subr_asan.c
Log Message:
Add KASAN instrumentation on on-stack VLAs.
To generate a diff of this commit:
cvs rdiff -u -r1.80 -r1.81 src/sys/arch/amd64/conf/Makefile.amd64
cvs rdiff -u -r1.18 -r1.19 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.80 src/sys/arch/amd64/conf/Makefile.amd64:1.81
--- src/sys/arch/amd64/conf/Makefile.amd64:1.80 Thu Nov 14 16:23:52 2019
+++ src/sys/arch/amd64/conf/Makefile.amd64 Fri Apr 3 18:12:39 2020
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.amd64,v 1.80 2019/11/14 16:23:52 maxv Exp $
+# $NetBSD: Makefile.amd64,v 1.81 2020/04/03 18:12:39 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 \
+ --param asan-instrument-allocas=1 \
-fsanitize-address-use-after-scope \
-fasan-shadow-offset=0xDFFF900000000000
.for f in subr_asan.c subr_kcov.c subr_lwp_specificdata.c subr_specificdata.c
Index: src/sys/kern/subr_asan.c
diff -u src/sys/kern/subr_asan.c:1.18 src/sys/kern/subr_asan.c:1.19
--- src/sys/kern/subr_asan.c:1.18 Sat Feb 8 09:05:08 2020
+++ src/sys/kern/subr_asan.c Fri Apr 3 18:12:39 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_asan.c,v 1.18 2020/02/08 09:05:08 maxv Exp $ */
+/* $NetBSD: subr_asan.c,v 1.19 2020/04/03 18:12:39 maxv Exp $ */
/*
* Copyright (c) 2018-2020 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_asan.c,v 1.18 2020/02/08 09:05:08 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_asan.c,v 1.19 2020/04/03 18:12:39 maxv Exp $");
#include <sys/param.h>
#include <sys/device.h>
@@ -53,6 +53,7 @@ __KERNEL_RCSID(0, "$NetBSD: subr_asan.c,
#define KASAN_SHADOW_SCALE_SHIFT 3
#define KASAN_SHADOW_SCALE_SIZE (1UL << KASAN_SHADOW_SCALE_SHIFT)
#define KASAN_SHADOW_MASK (KASAN_SHADOW_SCALE_SIZE - 1)
+#define KASAN_ALLOCA_SCALE_SIZE 32
/* The MD code. */
#include <machine/asan.h>
@@ -1247,3 +1248,34 @@ __asan_unpoison_stack_memory(const void
{
kasan_shadow_Nbyte_markvalid(addr, size);
}
+
+void __asan_alloca_poison(const void *, size_t);
+void __asan_allocas_unpoison(const void *, const void *);
+
+void __asan_alloca_poison(const void *addr, size_t size)
+{
+ const void *l, *r;
+
+ KASSERT((vaddr_t)addr % KASAN_ALLOCA_SCALE_SIZE == 0);
+
+ l = (const uint8_t *)addr - KASAN_ALLOCA_SCALE_SIZE;
+ r = (const uint8_t *)addr + roundup(size, KASAN_ALLOCA_SCALE_SIZE);
+
+ kasan_shadow_Nbyte_fill(l, KASAN_ALLOCA_SCALE_SIZE, KASAN_STACK_LEFT);
+ kasan_mark(addr, size, roundup(size, KASAN_ALLOCA_SCALE_SIZE),
+ KASAN_STACK_MID);
+ kasan_shadow_Nbyte_fill(r, KASAN_ALLOCA_SCALE_SIZE, KASAN_STACK_RIGHT);
+}
+
+void __asan_allocas_unpoison(const void *stkbegin, const void *stkend)
+{
+ size_t size;
+
+ if (__predict_false(!stkbegin))
+ return;
+ if (__predict_false((uintptr_t)stkbegin > (uintptr_t)stkend))
+ return;
+ size = (uintptr_t)stkend - (uintptr_t)stkbegin;
+
+ kasan_shadow_Nbyte_fill(stkbegin, size, 0);
+}