X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=kconfig_hardened_check%2F__init__.py;h=563091cd77abb9727e8b647fc59847bd1245bcaa;hb=361e571e1926ee172f22f9aad990158e2c03651d;hp=f6bc68c0df2a219ab9ba8d5a77db7e48c950a96a;hpb=0a728e144d4854a8640b387850277a48d3629a46;p=kconfig-hardened-check.git diff --git a/kconfig_hardened_check/__init__.py b/kconfig_hardened_check/__init__.py index f6bc68c..563091c 100644 --- a/kconfig_hardened_check/__init__.py +++ b/kconfig_hardened_check/__init__.py @@ -11,18 +11,18 @@ # # # N.B Hardening command line parameters: -# slub_debug=FZP # slab_nomerge # page_alloc.shuffle=1 # iommu=force (does it help against DMA attacks?) -# page_poison=1 (if enabled) -# init_on_alloc=1 -# init_on_free=1 +# slub_debug=FZ (slow) +# init_on_alloc=1 (since v5.3) +# init_on_free=1 (since v5.3, otherwise slub_debug=P and page_poison=1) # loadpin.enforce=1 +# debugfs=no-mount (or off if possible) # # Mitigations of CPU vulnerabilities: # Аrch-independent: -# mitigations=auto,nosmt +# mitigations=auto,nosmt (nosmt is slow) # X86: # spectre_v2=on # pti=on @@ -321,7 +321,10 @@ def construct_checklist(l, arch): if arch == 'ARM': l += [OptCheck('self_protection', 'defconfig', 'CPU_SW_DOMAIN_PAN', 'y')] l += [OptCheck('self_protection', 'defconfig', 'STACKPROTECTOR_PER_TASK', 'y')] - if arch in ('ARM64', 'ARM'): + if arch == 'ARM64': + l += [OR(OptCheck('self_protection', 'defconfig', 'HARDEN_BRANCH_PREDICTOR', 'y'), + VerCheck((5, 10)))] # HARDEN_BRANCH_PREDICTOR is enabled by default since v5.10 + if arch == 'ARM': l += [OptCheck('self_protection', 'defconfig', 'HARDEN_BRANCH_PREDICTOR', 'y')] # 'self_protection', 'kspp' @@ -399,13 +402,12 @@ def construct_checklist(l, arch): l += [AND(OptCheck('self_protection', 'my', 'UBSAN_BOUNDS', 'y'), OptCheck('self_protection', 'my', 'UBSAN_MISC', 'is not set'), OptCheck('self_protection', 'my', 'UBSAN_TRAP', 'y'))] - l += [OptCheck('self_protection', 'my', 'SLUB_DEBUG_ON', 'y')] # TODO: is it better to set that via kernel cmd? l += [OptCheck('self_protection', 'my', 'RESET_ATTACK_MITIGATION', 'y')] # needs userspace support (systemd) if arch == 'X86_64': l += [AND(OptCheck('self_protection', 'my', 'AMD_IOMMU_V2', 'y'), iommu_support_is_set)] if arch == 'ARM64': - l += [OptCheck('self_protection', 'my', 'SHADOW_CALL_STACK', 'y')] + l += [OptCheck('self_protection', 'my', 'SHADOW_CALL_STACK', 'y')] # maybe it should be alternative to STACKPROTECTOR_STRONG # 'security_policy' if arch in ('X86_64', 'ARM64', 'X86_32'): @@ -525,6 +527,8 @@ def construct_checklist(l, arch): l += [OptCheck('userspace_hardening', 'defconfig', 'INTEGRITY', 'y')] if arch == 'ARM': l += [OptCheck('userspace_hardening', 'my', 'INTEGRITY', 'y')] + if arch == 'ARM64': + l += [OptCheck('userspace_hardening', 'defconfig', 'ARM64_MTE', 'y')] if arch in ('ARM', 'X86_32'): l += [OptCheck('userspace_hardening', 'defconfig', 'VMSPLIT_3G', 'y')] if arch in ('X86_64', 'ARM64'): @@ -601,22 +605,22 @@ def print_checklist(mode, checklist, with_results): def perform_check(opt, parsed_options, kernel_version): - if hasattr(opt, 'opts'): - # prepare ComplexOptCheck - for o in opt.opts: - if hasattr(o, 'opts'): - # Recursion for nested ComplexOptChecks - perform_check(o, parsed_options, kernel_version) - if hasattr(o, 'state'): - o.state = parsed_options.get(o.name, None) - if hasattr(o, 'ver'): - o.ver = kernel_version - else: - # prepare simple check, opt.state is mandatory - if not hasattr(opt, 'state'): - sys.exit('[!] ERROR: bad simple check {}'.format(vars(opt))) - opt.state = parsed_options.get(opt.name, None) - opt.check() + if hasattr(opt, 'opts'): + # prepare ComplexOptCheck + for o in opt.opts: + if hasattr(o, 'opts'): + # Recursion for nested ComplexOptChecks + perform_check(o, parsed_options, kernel_version) + if hasattr(o, 'state'): + o.state = parsed_options.get(o.name, None) + if hasattr(o, 'ver'): + o.ver = kernel_version + else: + # prepare simple check, opt.state is mandatory + if not hasattr(opt, 'state'): + sys.exit('[!] ERROR: bad simple check {}'.format(vars(opt))) + opt.state = parsed_options.get(opt.name, None) + opt.check() def perform_checks(checklist, parsed_options, kernel_version):