Sanitizers for NetBSD # Current status Summary of the current status of sanitizers on a NetBSD host. # What are sanitizers? Sanitizer is a programming tool that detects computer program bugs such as buffer overflows, signed integer overflow, uninitialized memory read etc. Sanitizers are developed in LLVM, and a downstream port exists to GCC. # Types of sanitizers There are various types of sanitizers. A sanitizer is composed of an instrumentation part builtin into a compiler's code generation part. The instrumentation part emitted by a compiler requires a runtime library, that is shipped with compiler-rt. * Undefined Behavior Sanitizer (UBSan) * Undefined Behavior with minimal runtime (UBSan_minimal) * Address Sanitizer (ASan) * Hardware Assisted Address Sanitizer (HWASan) * Thread Sanitizer (TSan) * Memory Sanitizer (MSan) * Efficiency Sanitizer (ESan) * Data Flow Sanitizer (DFSan) * Leak Sanitizer (LSan) Additionally there are the following features shipped together with sanitizers: * profile * SafeStack * Control Flow Integrity * Scudo Hardened Allocator * XRay * libFuzzer * ShadowCallStack The compiler-rt package ships with libBlocksRuntime, builtins etc. As a NetBSD specific extension, there is a micro-UBSan runtime developed and maintained in the NetBSD source code. It is designed to function inside libc (uUBSan - usermode-UBSan) and inside the kernel (kUBSan - kernel-UBSan). # Types of runtimes There are two types of sanitizer runtimes: * dynamically linked ones (default in GCC) * statically linked ones (default in Clang) Base GCC/NetBSD works with the former, upstream HEAD version of LLVM/NetBSD works with the latter. Both compilers should support both of them, but the other options (GCC/NetBSD & static runtime, LLVM/NetBSD & dynamic runtime) are to be done. # Sanitizers in NetBSD Sanitizers in NetBSD are shipped with the following options: * together with the toolchain with the default compiler runtime (default), * together with the MKSANITIZER option (build the userland with the default compiler sanitizer), * together with the MKLIBCSANITIZER option (build the userland with a homegrown sanitizer runtime), * together with the NetBSD kernel (build the kernel with a homegrown kernel sanitizer runtime). MKSANITIZER blog entry: MKLIBCSANITIZER and kernel sanitizer blog entry: # Support in NetBSD Currently the main focus is with LLVM and GCC. Generic TODO: * switch syscall(2)/__syscall(2) to libc calls * upstream local patches / rebase to newly developed support in LLVM available in GCC 8.x and newer * develop missing interceptors such as fts(3) (mostly MSan-centric) * FILE and DIR sanitization (needed by at least: ESan, MSan) * improve the framework for ioctl(2) database and handle special cases when a part of a struct can be uninitialized and passed to the kernel (MSan) * finish StopTheWorld() and upstream to LLVM * port to !x86 * fixes with the signal code * pkgsrc integration * finish the support of float128 for Clang/LLVM/libstdc++/libgcc * LLVM fixes for shared (dlopen(3)-powered) runtime * fix other bugs. ## GCC The GCC compiler assumed the version in distribution. ### GCC with the default runtime Name | NetBSD status ----------|--------------------------------- UBSan | mostly works with all ports ASan | mostly works with amd64 and i386 LSan | might work with amd64 and i386 ### GCC with MKSANITIZER Untested. ### GCC with MKLIBCSANITIZER Name | NetBSD status ----------|--------------------------------- UBSan | works with micro-UBSan ### GCC with kernel sanitizers Name | NetBSD status ----------|--------------------------------- UBSan | works with micro-UBSan ## LLVM The LLVM support is available only with the HEAD version of the toolchain and not shipped in the base distribution. ### LLVM with the default runtime Name | NetBSD status ----------|--------------------------------- UBSan | mostly works with all LLVM ports ASan | mostly works with amd64 and i386 MSan | mostly works with amd64 TSan | mostly works with amd64 ### LLVM with MKSANITIZER Name | NetBSD status ----------|--------------------------------- UBSan | mostly works with all LLVM ports ASan | mostly works with amd64 and i386 ### LLVM with MKLIBCSANITIZER Name | NetBSD status ----------|--------------------------------- UBSan | works with micro-UBSan ### LLVM with kernel sanitizers Name | NetBSD status ----------|--------------------------------- UBSan | works with micro-UBSan