X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=kconfig_hardened_check%2F__init__.py;h=9400d26c59d5e18bdd5adebc9c6fab77190c1606;hb=416f4a96f3b31f6734f105b1466a57e18b365ab3;hp=5afecb838f47eb07c10577134d5db7e3e135525e;hpb=e13e1c6216d05c56cef13930a6c6fd7ab2c1c67b;p=kconfig-hardened-check.git diff --git a/kconfig_hardened_check/__init__.py b/kconfig_hardened_check/__init__.py index 5afecb8..9400d26 100644 --- a/kconfig_hardened_check/__init__.py +++ b/kconfig_hardened_check/__init__.py @@ -103,10 +103,6 @@ class OptCheck: else: self.result = 'FAIL: "' + self.state + '"' - if self.result.startswith('OK'): - return True - return False - def table_print(self, _mode, with_results): print('{:<40}|{:^7}|{:^12}|{:^10}|{:^18}'.format(self.name, self.type, self.expected, self.decision, self.reason), end='') if with_results: @@ -142,15 +138,14 @@ class VersionCheck: def check(self): if self.ver[0] > self.ver_expected[0]: self.result = 'OK: version >= ' + str(self.ver_expected[0]) + '.' + str(self.ver_expected[1]) - return True + return if self.ver[0] < self.ver_expected[0]: self.result = 'FAIL: version < ' + str(self.ver_expected[0]) + '.' + str(self.ver_expected[1]) - return False + return if self.ver[1] >= self.ver_expected[1]: self.result = 'OK: version >= ' + str(self.ver_expected[0]) + '.' + str(self.ver_expected[1]) - return True + return self.result = 'FAIL: version < ' + str(self.ver_expected[0]) + '.' + str(self.ver_expected[1]) - return False def table_print(self, _mode, with_results): ver_req = 'kernel version >= ' + str(self.ver_expected[0]) + '.' + str(self.ver_expected[1]) @@ -172,9 +167,8 @@ class PresenceCheck: def check(self): if self.state is None: self.result = 'FAIL: not present' - return False + return self.result = 'OK: is present' - return True def table_print(self, _mode, with_results): print('{:<91}'.format(self.name + ' is present'), end='') @@ -239,22 +233,19 @@ class OR(ComplexOptCheck): # Use cases: # OR(, ) # OR(, ) - def check(self): if not self.opts: sys.exit('[!] ERROR: invalid OR check') - for i, opt in enumerate(self.opts): - ret = opt.check() - if ret: + opt.check() + if opt.result.startswith('OK'): if opt.result == 'OK' and i != 0: # Simple OK is not enough for additional checks, add more info: self.result = 'OK: {} "{}"'.format(opt.name, opt.expected) else: self.result = opt.result - return True + return self.result = self.opts[0].result - return False class AND(ComplexOptCheck): @@ -263,14 +254,13 @@ class AND(ComplexOptCheck): # AND(, ) # Suboption is not checked if checking of the main_option is failed. # AND(, ) - def check(self): for i, opt in reversed(list(enumerate(self.opts))): - ret = opt.check() + opt.check() if i == 0: self.result = opt.result - return ret - if not ret: + return + if not opt.result.startswith('OK'): # This FAIL is caused by additional checks, # and not by the main option that this AND-check is about. # Describe the reason of the FAIL. @@ -281,8 +271,7 @@ class AND(ComplexOptCheck): else: # This FAIL message is self-explaining. self.result = opt.result - return False - + return sys.exit('[!] ERROR: invalid AND check') @@ -375,10 +364,12 @@ def add_kconfig_checks(l, arch): l += [KconfigCheck('self_protection', 'defconfig', 'ARM64_BTI_KERNEL', 'y')] l += [OR(KconfigCheck('self_protection', 'defconfig', 'HARDEN_BRANCH_PREDICTOR', 'y'), VersionCheck((5, 10)))] # HARDEN_BRANCH_PREDICTOR is enabled by default since v5.10 + l += [KconfigCheck('self_protection', 'defconfig', 'MITIGATE_SPECTRE_BRANCH_HISTORY', 'y')] l += [KconfigCheck('self_protection', 'defconfig', 'ARM64_MTE', 'y')] if arch == 'ARM': l += [KconfigCheck('self_protection', 'defconfig', 'CPU_SW_DOMAIN_PAN', 'y')] l += [KconfigCheck('self_protection', 'defconfig', 'HARDEN_BRANCH_PREDICTOR', 'y')] + l += [KconfigCheck('self_protection', 'defconfig', 'HARDEN_BRANCH_HISTORY', 'y')] # 'self_protection', 'kspp' l += [KconfigCheck('self_protection', 'kspp', 'SECURITY_DMESG_RESTRICT', 'y')] @@ -439,8 +430,9 @@ def add_kconfig_checks(l, arch): # 'self_protection', 'maintainer' ubsan_bounds_is_set = KconfigCheck('self_protection', 'maintainer', 'UBSAN_BOUNDS', 'y') # only array index bounds checking l += [ubsan_bounds_is_set] # recommended by Kees Cook in /issues/53 - l += [AND(KconfigCheck('self_protection', 'maintainer', 'UBSAN_SANITIZE_ALL', 'y'), - ubsan_bounds_is_set)] # recommended by Kees Cook in /issues/53 + if arch in ('X86_64', 'ARM64', 'X86_32'): # ARCH_HAS_UBSAN_SANITIZE_ALL is not enabled for ARM + l += [AND(KconfigCheck('self_protection', 'maintainer', 'UBSAN_SANITIZE_ALL', 'y'), + ubsan_bounds_is_set)] # recommended by Kees Cook in /issues/53 l += [AND(KconfigCheck('self_protection', 'maintainer', 'UBSAN_TRAP', 'y'), ubsan_bounds_is_set)] # recommended by Kees Cook in /issues/53 @@ -770,8 +762,6 @@ def parse_kconfig_file(parsed_options, fname): if option: parsed_options[option] = value - return parsed_options - def main(): # Report modes: