Document the changes of vm.unprivileged_userfaultfd in v5.11
[kconfig-hardened-check.git] / kconfig_hardened_check / __init__.py
index ebd0e0517b5b389a2df6fcbf94d71e5f0b07869c..e1b5a5e82b5ee3bb87914a5337ba1b459d45087e 100644 (file)
@@ -2,7 +2,7 @@
 
 #
 # This tool helps me to check the Linux kernel Kconfig option list
-# against my hardening preferences for X86_64, ARM64, X86_32, and ARM.
+# against my security hardening preferences for X86_64, ARM64, X86_32, and ARM.
 # Let the computers do their job!
 #
 # Author: Alexander Popov <alex.popov@linux.com>
@@ -46,6 +46,8 @@
 #    net.core.bpf_jit_harden=2
 #
 #    vm.unprivileged_userfaultfd=0
+#        (at first, it disabled unprivileged userfaultfd,
+#         and since v5.11 it enables unprivileged userfaultfd for user-mode only)
 #
 #    dev.tty.ldisc_autoload=0
 #    fs.protected_symlinks=1
@@ -358,7 +360,12 @@ def construct_checklist(l, arch):
     l += [OR(OptCheck('self_protection', 'kspp', 'INIT_STACK_ALL_ZERO', 'y'),
              OptCheck('self_protection', 'kspp', 'GCC_PLUGIN_STRUCTLEAK_BYREF_ALL', 'y'))]
     l += [OR(OptCheck('self_protection', 'kspp', 'INIT_ON_FREE_DEFAULT_ON', 'y'),
-             OptCheck('self_protection', 'kspp', 'PAGE_POISONING_ZERO', 'y'))] # before v5.3
+             OptCheck('self_protection', 'kspp', 'PAGE_POISONING_ZERO', 'y'))]
+             # CONFIG_INIT_ON_FREE_DEFAULT_ON was added in v5.3.
+             # CONFIG_PAGE_POISONING_ZERO was removed in v5.11.
+             # Starting from v5.11 CONFIG_PAGE_POISONING unconditionally checks
+             # the 0xAA poison pattern on allocation.
+             # That brings higher performance penalty.
     if arch in ('X86_64', 'ARM64', 'X86_32'):
         stackleak_is_set = OptCheck('self_protection', 'kspp', 'GCC_PLUGIN_STACKLEAK', 'y')
         l += [stackleak_is_set]
@@ -663,10 +670,10 @@ def main():
     report_modes = ['verbose', 'json', 'show_ok', 'show_fail']
     supported_archs = ['X86_64', 'X86_32', 'ARM64', 'ARM']
     parser = ArgumentParser(prog='kconfig-hardened-check',
-                            description='Checks the hardening options in the Linux kernel config')
+                            description='A tool for checking the security hardening options of the Linux kernel')
     parser.add_argument('--version', action='version', version='%(prog)s ' + __version__)
     parser.add_argument('-p', '--print', choices=supported_archs,
-                        help='print hardening preferences for selected architecture')
+                        help='print security hardening preferences for the selected architecture')
     parser.add_argument('-c', '--config',
                         help='check the kernel config file against these preferences')
     parser.add_argument('-m', '--mode', choices=report_modes,
@@ -714,7 +721,7 @@ def main():
         arch = args.print
         construct_checklist(config_checklist, arch)
         if mode != 'json':
-            print('[+] Printing kernel hardening preferences for {}...'.format(arch))
+            print('[+] Printing kernel security hardening preferences for {}...'.format(arch))
         print_checklist(mode, config_checklist, False)
         sys.exit(0)