# Аrch-independent:
# X86:
# l1d_flush=on (a part of the l1tf option)
-# tsx=off
# ARM64:
# kpti=on
-# ssbd=force-on
-#
-# Should NOT be set:
-# sysrq_always_enabled
-# arm64.nobti
-# arm64.nopauth
-# arm64.nomte
#
# Hardware tag-based KASAN with arm64 Memory Tagging Extension (MTE):
# kasan=on
if self.expected == 'is not off':
if self.state == 'off':
self.result = 'FAIL: is off'
+ if self.state == '0':
+ self.result = 'FAIL: is off, "0"'
elif self.state is None:
self.result = 'FAIL: is off, not found'
else:
self.result = 'FAIL: {} is not "{}"'.format(opt.name, opt.expected)
elif opt.result == 'FAIL: is not present':
self.result = 'FAIL: {} is not present'.format(opt.name)
- elif opt.result == 'FAIL: is off':
+ elif opt.result == 'FAIL: is off' or opt.result == 'FAIL: is off, "0"':
self.result = 'FAIL: {} is off'.format(opt.name)
elif opt.result == 'FAIL: is off, not found':
self.result = 'FAIL: {} is off, not found'.format(opt.name)
if arch in ('X86_64', 'ARM64', 'X86_32'):
l += [OR(KconfigCheck('cut_attack_surface', 'defconfig', 'STRICT_DEVMEM', 'y'),
devmem_not_set)] # refers to LOCKDOWN
+ if arch in ('X86_64', 'X86_32'):
+ l += [KconfigCheck('cut_attack_surface', 'defconfig', 'X86_INTEL_TSX_MODE_OFF', 'y')] # tsx=off
# 'cut_attack_surface', 'kspp'
l += [KconfigCheck('cut_attack_surface', 'kspp', 'SECURITY_DMESG_RESTRICT', 'y')]
l += [KconfigCheck('cut_attack_surface', 'clipos', 'EFI_CUSTOM_SSDT_OVERLAYS', 'is not set')]
l += [KconfigCheck('cut_attack_surface', 'clipos', 'COREDUMP', 'is not set')] # cut userspace attack surface
# l += [KconfigCheck('cut_attack_surface', 'clipos', 'IKCONFIG', 'is not set')] # no, IKCONFIG is needed for this check :)
- if arch in ('X86_64', 'X86_32'):
- l += [KconfigCheck('cut_attack_surface', 'clipos', 'X86_INTEL_TSX_MODE_OFF', 'y')] # tsx=off
# 'cut_attack_surface', 'lockdown'
l += [KconfigCheck('cut_attack_surface', 'lockdown', 'EFI_TEST', 'is not set')] # refers to LOCKDOWN
l += [CmdlineCheck('self_protection', 'defconfig', 'nospectre_v1', 'is not set')]
l += [CmdlineCheck('self_protection', 'defconfig', 'nospectre_v2', 'is not set')]
l += [CmdlineCheck('self_protection', 'defconfig', 'nospec_store_bypass_disable', 'is not set')]
+ l += [CmdlineCheck('self_protection', 'defconfig', 'arm64.nobti', 'is not set')]
+ l += [CmdlineCheck('self_protection', 'defconfig', 'arm64.nopauth', 'is not set')]
+ l += [CmdlineCheck('self_protection', 'defconfig', 'arm64.nomte', 'is not set')]
l += [OR(CmdlineCheck('self_protection', 'defconfig', 'mitigations', 'is not off'),
CmdlineCheck('self_protection', 'defconfig', 'mitigations', 'is not set'))]
l += [OR(CmdlineCheck('self_protection', 'defconfig', 'spectre_v2', 'is not off'),
l += [OR(CmdlineCheck('self_protection', 'defconfig', 'retbleed', 'is not off'),
CmdlineCheck('self_protection', 'defconfig', 'retbleed', 'is not set'))]
if arch == 'ARM64':
+ l += [OR(CmdlineCheck('self_protection', 'defconfig', 'ssbd', 'kernel'),
+ CmdlineCheck('self_protection', 'my', 'ssbd', 'force-on'),
+ CmdlineCheck('self_protection', 'defconfig', 'ssbd', 'is not set'))]
l += [OR(CmdlineCheck('self_protection', 'defconfig', 'rodata', 'full'),
AND(KconfigCheck('self_protection', 'defconfig', 'RODATA_FULL_DEFAULT_ENABLED', 'y'),
CmdlineCheck('self_protection', 'defconfig', 'rodata', 'is not set')))]
# 'self_protection', 'clipos'
l += [CmdlineCheck('self_protection', 'clipos', 'page_alloc.shuffle', '1')]
+ # 'cut_attack_surface', 'defconfig'
+ if arch in ('X86_64', 'X86_32'):
+ l += [OR(CmdlineCheck('cut_attack_surface', 'defconfig', 'tsx', 'off'),
+ AND(KconfigCheck('cut_attack_surface', 'defconfig', 'X86_INTEL_TSX_MODE_OFF', 'y'),
+ CmdlineCheck('cut_attack_surface', 'defconfig', 'tsx', 'is not set')))]
+
# 'cut_attack_surface', 'kspp'
if arch == 'X86_64':
l += [OR(CmdlineCheck('cut_attack_surface', 'kspp', 'vsyscall', 'none'),
l += [OR(CmdlineCheck('cut_attack_surface', 'grsec', 'debugfs', 'off'),
KconfigCheck('cut_attack_surface', 'grsec', 'DEBUG_FS', 'is not set'))] # ... the end
+ # 'cut_attack_surface', 'my'
+ l += [CmdlineCheck('cut_attack_surface', 'my', 'sysrq_always_enabled', 'is not set')]
def print_unknown_options(checklist, parsed_options):
known_options = []
if option == 'retbleed':
# See retbleed_parse_cmdline() in arch/x86/kernel/cpu/bugs.c
return value
+ if option == 'tsx':
+ # See tsx_init() in arch/x86/kernel/cpu/tsx.c
+ return value
# Implement a limited part of the kstrtobool() logic
if value in ('1', 'on', 'On', 'ON', 'y', 'Y', 'yes', 'Yes', 'YES'):