== Security :toc: right NOTE: The page is Work In Progress This page documents security aspects of Nim and best practices. Security features in the language: * No pointer arithmetic * http://nim-lang.org/docs/manual.html#taint-mode[Taint mode] * The http://nim-lang.org/docs/manual.html#effect-system[Effect system] can be used for security * Nim attempts to generate C code that does not rely on unsecure function/patterns (e.g. unchecked strcpy) * The language encourage using immutable and const values * Type conversions are memory-safe * Low-level memory access allows mlock (TODO: add example) and memory wipe (TODO: add example) * http://nim-lang.org/docs/manual.html#types-memory-regions[Memory regions] TODO === Compiling with GCC on Linux Nim attempts to generate C code that does not rely on unsecure function/patterns. As such, some of the options listed below might be less useful than when building pure-C applications. All the following options enabled together: [source,bash] ---- --passC:"-fPIE -Wformat -Wformat-security -D_FORTIFY_SOURCE=2 -O1 -fstack-protector-all" --passL:"-fPIE -pie -z relro -z now" ---- Same entries for nim.cfg: [source,ini] ---- gcc.options.always = "-w -D_FORTIFY_SOURCE=2 -O1 -Wformat -Wformat-security -fPIE -fstack-protector-all" gcc.options.linker = "-ldl -fPIE -pie -z relro -z now" ---- ==== Stack protector Terminate execution when the stack is being overwritten [source,bash] ---- nim c --passC:"-fstack-protector-all" ---- ==== Protect againt fixed-size buffer overflow [source,bash] ---- nim c --passC:"-D_FORTIFY_SOURCE=2 -O1" ---- ==== Warn on unsecure prinf usage [source,bash] ---- nim c --passC:"-Wformat -Wformat-security" ---- ==== Position independent executable Enable ASLR [source,bash] ---- nim c --passC:"-fPIE" --passL:"-fPIE -pie" ---- ==== Full RELRO Resolve dynamic symbols at startup and flag the GOT as read-only. [source,bash] ---- nim c --passL:"-z relro -z now" ---- === Resources https://wiki.debian.org/Hardening