Description
Description
I'm not sure if there's a dedicated repository for the kernel used on the SecureDrop servers anymore, so let me know where to put this. But this is a continuation of some prior updates I recommended to the configuration you're using to build. Thanks to a new tool from @a13xp0p0v called kconfig-hardened-check, we no longer have to manually watch changelogs, etc. for when security features and new config flags land in mainline (for those who are unaware, the KSPP has been porting a lot of grsecurity/PaX-inspired features into Linux proper). A brief chat I had with Spender a long time ago confirmed that these generally don't conflict or interfere with grsec.
As this article by @nettrino describes, Linux distributions are hit and miss and many are not taking advantage of the features.
The first obstacle is that you're still on 4.4, so that will narrow the modifications we can make to the config since much of this work landed with 4.14. We'd have to figure out which are available, which are too new, and perform enough testing and quality assurance of the new kernel.
In any event, as a launching-off point, I'm pasting the output of the kconfig-hardened-check script against the current SecureDrop kernel config.
[+] Detected architecture: X86_64
[+] Checking "config-4.4.167-grsec" against hardening preferences...
option name | desired val | decision | reason || check result
===================================================================================================================
CONFIG_BUG | y |defconfig | self_protection || OK
CONFIG_STRICT_KERNEL_RWX | y |defconfig | self_protection ||CONFIG_DEBUG_RODATA: OK ("y")
CONFIG_STACKPROTECTOR_STRONG | y |defconfig | self_protection || FAIL: not found
CONFIG_SLUB_DEBUG | y |defconfig | self_protection || OK
CONFIG_STRICT_MODULE_RWX | y |defconfig | self_protection || FAIL: not found
CONFIG_PAGE_TABLE_ISOLATION | y |defconfig | self_protection || FAIL: not found
CONFIG_RANDOMIZE_MEMORY | y |defconfig | self_protection || FAIL: not found
CONFIG_RANDOMIZE_BASE | y |defconfig | self_protection || FAIL: not found
CONFIG_RETPOLINE | y |defconfig | self_protection || OK
CONFIG_X86_SMAP | y |defconfig | self_protection || OK
CONFIG_X86_INTEL_UMIP | y |defconfig | self_protection || FAIL: not found
CONFIG_SYN_COOKIES | y |defconfig | self_protection || OK
CONFIG_VMAP_STACK | y |defconfig | self_protection || FAIL: not found
CONFIG_THREAD_INFO_IN_TASK | y |defconfig | self_protection || FAIL: not found
CONFIG_BUG_ON_DATA_CORRUPTION | y | kspp | self_protection || FAIL: not found
CONFIG_DEBUG_WX | y | kspp | self_protection || FAIL: "is not set"
CONFIG_SCHED_STACK_END_CHECK | y | kspp | self_protection || FAIL: "is not set"
CONFIG_PAGE_POISONING | y | kspp | self_protection || FAIL: not found
CONFIG_SLAB_FREELIST_HARDENED | y | kspp | self_protection || FAIL: not found
CONFIG_SLAB_FREELIST_RANDOM | y | kspp | self_protection || FAIL: not found
CONFIG_HARDENED_USERCOPY | y | kspp | self_protection || FAIL: not found
CONFIG_HARDENED_USERCOPY_FALLBACK | is not set | kspp | self_protection || OK: not found
CONFIG_FORTIFY_SOURCE | y | kspp | self_protection || FAIL: not found
CONFIG_GCC_PLUGINS | y | kspp | self_protection || OK
CONFIG_GCC_PLUGIN_RANDSTRUCT | y | kspp | self_protection || FAIL: not found
CONFIG_GCC_PLUGIN_STRUCTLEAK | y | kspp | self_protection || FAIL: not found
CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL | y | kspp | self_protection || FAIL: not found
CONFIG_GCC_PLUGIN_LATENT_ENTROPY | y | kspp | self_protection || FAIL: not found
CONFIG_DEBUG_LIST | y | kspp | self_protection || OK
CONFIG_DEBUG_SG | y | kspp | self_protection || FAIL: "is not set"
CONFIG_DEBUG_CREDENTIALS | y | kspp | self_protection || FAIL: "is not set"
CONFIG_DEBUG_NOTIFIERS | y | kspp | self_protection || FAIL: "is not set"
CONFIG_MODULE_SIG | y | kspp | self_protection || OK
CONFIG_MODULE_SIG_ALL | y | kspp | self_protection || OK
CONFIG_MODULE_SIG_SHA512 | y | kspp | self_protection || OK
CONFIG_MODULE_SIG_FORCE | y | kspp | self_protection || FAIL: "is not set"
CONFIG_DEFAULT_MMAP_MIN_ADDR | 65536 | kspp | self_protection || OK
CONFIG_REFCOUNT_FULL | y | kspp | self_protection || FAIL: not found
CONFIG_GCC_PLUGIN_STACKLEAK | y | my | self_protection || FAIL: not found
CONFIG_LOCK_DOWN_KERNEL | y | my | self_protection || FAIL: not found
CONFIG_SLUB_DEBUG_ON | y | my | self_protection || FAIL: "is not set"
CONFIG_SECURITY_DMESG_RESTRICT | y | my | self_protection || FAIL: "is not set"
CONFIG_STATIC_USERMODEHELPER | y | my | self_protection || FAIL: not found
CONFIG_SECURITY_LOADPIN | y | my | self_protection || FAIL: not found
CONFIG_PAGE_POISONING_NO_SANITY | is not set | my | self_protection || OK: not found
CONFIG_PAGE_POISONING_ZERO | is not set | my | self_protection || OK: not found
CONFIG_SLAB_MERGE_DEFAULT | is not set | my | self_protection || OK: not found
CONFIG_SECURITY | y |defconfig | security_policy || OK
CONFIG_SECURITY_YAMA | y | kspp | security_policy || FAIL: not found
CONFIG_SECURITY_SELINUX_DISABLE | is not set | kspp | security_policy || FAIL: "y"
CONFIG_SECCOMP | y |defconfig | cut_attack_surface || OK
CONFIG_SECCOMP_FILTER | y |defconfig | cut_attack_surface || OK
CONFIG_STRICT_DEVMEM | y |defconfig | cut_attack_surface || OK
CONFIG_IO_STRICT_DEVMEM | y | kspp | cut_attack_surface || FAIL: not found
CONFIG_ACPI_CUSTOM_METHOD | is not set | kspp | cut_attack_surface || OK: not found
CONFIG_COMPAT_BRK | is not set | kspp | cut_attack_surface || OK
CONFIG_DEVKMEM | is not set | kspp | cut_attack_surface || OK: not found
CONFIG_COMPAT_VDSO | is not set | kspp | cut_attack_surface || OK: not found
CONFIG_BINFMT_MISC | is not set | kspp | cut_attack_surface || FAIL: "m"
CONFIG_INET_DIAG | is not set | kspp | cut_attack_surface || FAIL: "m"
CONFIG_KEXEC | is not set | kspp | cut_attack_surface || OK: not found
CONFIG_PROC_KCORE | is not set | kspp | cut_attack_surface || OK: not found
CONFIG_LEGACY_PTYS | is not set | kspp | cut_attack_surface || FAIL: "y"
CONFIG_HIBERNATION | is not set | kspp | cut_attack_surface || OK: not found
CONFIG_LEGACY_VSYSCALL_NONE | y | kspp | cut_attack_surface || FAIL: "is not set"
CONFIG_IA32_EMULATION | is not set | kspp | cut_attack_surface || FAIL: "y"
CONFIG_X86_X32 | is not set | kspp | cut_attack_surface || FAIL: "y"
CONFIG_MODIFY_LDT_SYSCALL | is not set | kspp | cut_attack_surface || FAIL: "y"
CONFIG_X86_PTDUMP | is not set |grsecurity| cut_attack_surface || OK: not found
CONFIG_ZSMALLOC_STAT | is not set |grsecurity| cut_attack_surface || OK: not found
CONFIG_PAGE_OWNER | is not set |grsecurity| cut_attack_surface || OK: not found
CONFIG_DEBUG_KMEMLEAK | is not set |grsecurity| cut_attack_surface || OK: not found
CONFIG_BINFMT_AOUT | is not set |grsecurity| cut_attack_surface || OK: not found
CONFIG_KPROBES | is not set |grsecurity| cut_attack_surface || FAIL: "y"
CONFIG_UPROBES | is not set |grsecurity| cut_attack_surface || OK
CONFIG_GENERIC_TRACER | is not set |grsecurity| cut_attack_surface || OK: not found
CONFIG_PROC_VMCORE | is not set |grsecurity| cut_attack_surface || OK: not found
CONFIG_PROC_PAGE_MONITOR | is not set |grsecurity| cut_attack_surface || OK: not found
CONFIG_USELIB | is not set |grsecurity| cut_attack_surface || OK: not found
CONFIG_CHECKPOINT_RESTORE | is not set |grsecurity| cut_attack_surface || OK: not found
CONFIG_USERFAULTFD | is not set |grsecurity| cut_attack_surface || OK
CONFIG_HWPOISON_INJECT | is not set |grsecurity| cut_attack_surface || OK: not found
CONFIG_MEM_SOFT_DIRTY | is not set |grsecurity| cut_attack_surface || OK: not found
CONFIG_DEVPORT | is not set |grsecurity| cut_attack_surface || OK: not found
CONFIG_DEBUG_FS | is not set |grsecurity| cut_attack_surface || OK: not found
CONFIG_NOTIFIER_ERROR_INJECTION | is not set |grsecurity| cut_attack_surface || OK: not found
CONFIG_ACPI_TABLE_UPGRADE | is not set | lockdown | cut_attack_surface || OK: not found
CONFIG_ACPI_APEI_EINJ | is not set | lockdown | cut_attack_surface || OK: not found
CONFIG_PROFILING | is not set | lockdown | cut_attack_surface || FAIL: "y"
CONFIG_BPF_SYSCALL | is not set | lockdown | cut_attack_surface || OK
CONFIG_MMIOTRACE_TEST | is not set | lockdown | cut_attack_surface || OK: not found
CONFIG_MMIOTRACE | is not set | my | cut_attack_surface || OK: not found
CONFIG_KEXEC_FILE | is not set | my | cut_attack_surface || OK
CONFIG_LIVEPATCH | is not set | my | cut_attack_surface || OK: not found
CONFIG_USER_NS | is not set | my | cut_attack_surface || FAIL: "y"
CONFIG_IP_DCCP | is not set | my | cut_attack_surface || FAIL: "m"
CONFIG_IP_SCTP | is not set | my | cut_attack_surface || FAIL: "m"
CONFIG_FTRACE | is not set | my | cut_attack_surface || OK: not found
CONFIG_BPF_JIT | is not set | my | cut_attack_surface || FAIL: "y"
CONFIG_ARCH_MMAP_RND_BITS | 32 | my |userspace_protection|| FAIL: not found
[-] config check is NOT PASSED: 48 errors```