# Аrch-independent:
# mitigations=auto,nosmt (nosmt is slow)
# X86:
-# spectre_v2=on
# spec_store_bypass_disable=on
# l1tf=full,force
# l1d_flush=on (a part of the l1tf option)
# when the tool doesn't check the cmdline.
efi_not_set = KconfigCheck('-', '-', 'EFI', 'is not set')
- cc_is_gcc = KconfigCheck('-', '-', 'CC_IS_GCC', 'y')
- cc_is_clang = KconfigCheck('-', '-', 'CC_IS_CLANG', 'y')
+ cc_is_gcc = KconfigCheck('-', '-', 'CC_IS_GCC', 'y') # exists since v4.18
+ cc_is_clang = KconfigCheck('-', '-', 'CC_IS_CLANG', 'y') # exists since v4.18
modules_not_set = KconfigCheck('cut_attack_surface', 'kspp', 'MODULES', 'is not set')
devmem_not_set = KconfigCheck('cut_attack_surface', 'kspp', 'DEVMEM', 'is not set') # refers to LOCKDOWN
if arch in ('X86_64', 'ARM64'):
l += [KconfigCheck('self_protection', 'defconfig', 'VMAP_STACK', 'y')]
if arch in ('X86_64', 'X86_32'):
+ l += [KconfigCheck('self_protection', 'defconfig', 'X86_MCE', 'y')]
+ l += [KconfigCheck('self_protection', 'defconfig', 'X86_MCE_INTEL', 'y')]
+ l += [KconfigCheck('self_protection', 'defconfig', 'X86_MCE_AMD', 'y')]
l += [KconfigCheck('self_protection', 'defconfig', 'MICROCODE', 'y')] # is needed for mitigating CPU bugs
l += [KconfigCheck('self_protection', 'defconfig', 'RETPOLINE', 'y')]
l += [OR(KconfigCheck('self_protection', 'defconfig', 'X86_SMAP', 'y'),
# 'self_protection', 'my'
l += [OR(KconfigCheck('self_protection', 'my', 'RESET_ATTACK_MITIGATION', 'y'),
efi_not_set)] # needs userspace support (systemd)
+ l += [OR(KconfigCheck('self_protection', 'my', 'UBSAN_LOCAL_BOUNDS', 'y'),
+ AND(ubsan_bounds_is_set,
+ cc_is_gcc))]
if arch == 'X86_64':
l += [KconfigCheck('self_protection', 'my', 'SLS', 'y')] # vs CVE-2021-26341 in Straight-Line-Speculation
l += [AND(KconfigCheck('self_protection', 'my', 'AMD_IOMMU_V2', 'y'),
# very complex and not give a 100% guarantee anyway.
# 'self_protection', 'defconfig'
+ l += [CmdlineCheck('self_protection', 'defconfig', 'nosmep', 'is not set')]
+ l += [CmdlineCheck('self_protection', 'defconfig', 'nosmap', 'is not set')]
+ l += [CmdlineCheck('self_protection', 'defconfig', 'nokaslr', 'is not set')]
+ l += [CmdlineCheck('self_protection', 'defconfig', 'nopti', 'is not set')]
+ l += [CmdlineCheck('self_protection', 'defconfig', 'nospectre_v1', 'is not set')]
+ l += [CmdlineCheck('self_protection', 'defconfig', 'nospectre_v2', 'is not set')]
if arch == 'ARM64':
l += [OR(CmdlineCheck('self_protection', 'defconfig', 'rodata', 'full'),
AND(KconfigCheck('self_protection', 'defconfig', 'RODATA_FULL_DEFAULT_ENABLED', 'y'),
AND(KconfigCheck('self_protection', 'kspp', 'IOMMU_DEFAULT_PASSTHROUGH', 'is not set'),
CmdlineCheck('self_protection', 'kspp', 'iommu.passthrough', 'is not set')))]
# The cmdline checks compatible with the kconfig recommendations of the KSPP project...
- l += [CmdlineCheck('self_protection', 'kspp', 'nokaslr', 'is not set')]
l += [OR(CmdlineCheck('self_protection', 'kspp', 'hardened_usercopy', '1'),
AND(KconfigCheck('self_protection', 'kspp', 'HARDENED_USERCOPY', 'y'),
CmdlineCheck('self_protection', 'kspp', 'hardened_usercopy', 'is not set')))]
l += [OR(CmdlineCheck('self_protection', 'kspp', 'slab_common.usercopy_fallback', '0'),
AND(KconfigCheck('self_protection', 'kspp', 'HARDENED_USERCOPY_FALLBACK', 'is not set'),
- CmdlineCheck('self_protection', 'kspp', 'slab_common.usercopy_fallback', 'is not set')))] # ... the end
+ CmdlineCheck('self_protection', 'kspp', 'slab_common.usercopy_fallback', 'is not set')))]
+ # ... the end
if arch in ('X86_64', 'ARM64', 'X86_32'):
l += [OR(CmdlineCheck('self_protection', 'kspp', 'randomize_kstack_offset', '1'),
AND(KconfigCheck('self_protection', 'kspp', 'RANDOMIZE_KSTACK_OFFSET_DEFAULT', 'y'),
CmdlineCheck('self_protection', 'kspp', 'randomize_kstack_offset', 'is not set')))]
if arch in ('X86_64', 'X86_32'):
- l += [CmdlineCheck('self_protection', 'kspp', 'pti', 'on')]
+ l += [AND(CmdlineCheck('self_protection', 'kspp', 'pti', 'on'),
+ CmdlineCheck('self_protection', 'defconfig', 'nopti', 'is not set'))]
# 'self_protection', 'clipos'
l += [CmdlineCheck('self_protection', 'clipos', 'page_alloc.shuffle', '1')]
-
- # 'self_protection', 'my'
- l += [CmdlineCheck('self_protection', 'my', 'nosmep', 'is not set')]
- l += [CmdlineCheck('self_protection', 'my', 'nosmap', 'is not set')]
+ if arch in ('X86_64', 'X86_32'):
+ l += [AND(CmdlineCheck('self_protection', 'clipos', 'spectre_v2', 'on'),
+ CmdlineCheck('self_protection', 'defconfig', 'nospectre_v2', 'is not set'))]
# 'cut_attack_surface', 'kspp'
if arch == 'X86_64':
if option == 'pti':
# See pti_check_boottime_disable() in linux/arch/x86/mm/pti.c
return value
+ if option == 'spectre_v2':
+ # See spectre_v2_parse_cmdline() in linux/arch/x86/kernel/cpu/bugs.c
+ return value
if option == 'debugfs':
# See debugfs_kernel() in fs/debugfs/inode.c
return value