From de79b0baa12d7528a11d4b830fed698b7290df01 Mon Sep 17 00:00:00 2001 From: Thurston Dang Date: Thu, 27 Apr 2023 22:05:46 +0000 Subject: [PATCH] [hwasan] Enable common syscall interceptors This adds the sanitizer_common syscall hooks to HWASan and also defines the COMMON_SYSCALL_PRE_{READ/WRITE}_RANGE macros. Differential Revision: https://reviews.llvm.org/D149386 --- compiler-rt/lib/hwasan/hwasan_interceptors.cpp | 17 +++++++++++ .../test/hwasan/TestCases/Linux/syscalls.cpp | 33 ++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 compiler-rt/test/hwasan/TestCases/Linux/syscalls.cpp diff --git a/compiler-rt/lib/hwasan/hwasan_interceptors.cpp b/compiler-rt/lib/hwasan/hwasan_interceptors.cpp index 06f4eecd..67edba4 100644 --- a/compiler-rt/lib/hwasan/hwasan_interceptors.cpp +++ b/compiler-rt/lib/hwasan/hwasan_interceptors.cpp @@ -15,6 +15,7 @@ //===----------------------------------------------------------------------===// #include "hwasan.h" +#include "hwasan_checks.h" #include "hwasan_thread.h" #include "interception/interception.h" #include "sanitizer_common/sanitizer_linux.h" @@ -40,6 +41,22 @@ static void *HwasanThreadStartFunc(void *arg) { return A.callback(A.param); } +# define COMMON_SYSCALL_PRE_READ_RANGE(p, s) __hwasan_loadN((uptr)p, (uptr)s) +# define COMMON_SYSCALL_PRE_WRITE_RANGE(p, s) \ + __hwasan_storeN((uptr)p, (uptr)s) +# define COMMON_SYSCALL_POST_READ_RANGE(p, s) \ + do { \ + (void)(p); \ + (void)(s); \ + } while (false) +# define COMMON_SYSCALL_POST_WRITE_RANGE(p, s) \ + do { \ + (void)(p); \ + (void)(s); \ + } while (false) +# include "sanitizer_common/sanitizer_common_syscalls.inc" +# include "sanitizer_common/sanitizer_syscalls_netbsd.inc" + INTERCEPTOR(int, pthread_create, void *th, void *attr, void *(*callback)(void*), void * param) { EnsureMainThreadIDIsCorrect(); diff --git a/compiler-rt/test/hwasan/TestCases/Linux/syscalls.cpp b/compiler-rt/test/hwasan/TestCases/Linux/syscalls.cpp new file mode 100644 index 0000000..d7bc34e --- /dev/null +++ b/compiler-rt/test/hwasan/TestCases/Linux/syscalls.cpp @@ -0,0 +1,33 @@ +// RUN: %clangxx_hwasan -O0 %s -o %t && not %env_hwasan_opts=symbolize=0 %run %t 2>&1 | FileCheck %s +// RUN: %clangxx_hwasan -O3 %s -o %t && not %env_hwasan_opts=symbolize=0 %run %t 2>&1 | FileCheck %s + +// UNSUPPORTED: android + +#include +#include +#include +#include +#include +#include + +#include +#include + +/* Test the presence of __sanitizer_syscall_ in the tool runtime, and general + sanity of their behaviour. */ + +int main(int argc, char *argv[]) { + // lit.cfg.py currently sets 'disable_allocator_tagging=1' + __hwasan_enable_allocator_tagging(); + + char *buf = (char *)malloc(1000); + assert(buf != NULL); + + __sanitizer_syscall_pre_recvmsg(0, buf - 1, 0); + // CHECK: HWAddressSanitizer: tag-mismatch on address [[PTR:0x[a-f0-9]+]] + // CHECK: Cause: heap-buffer-overflow + // CHECK: [[PTR]] is located 1 bytes before a 1000-byte region + + free(buf); + return 0; +} -- 2.7.4