Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
kernel-hardening-checker
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
fact-depend
kernel-hardening-checker
Commits
5336858f
Commit
5336858f
authored
Jul 20, 2018
by
Alexander Popov
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'arch-changes-from-anthraxx'
parents
987a7f63
ff20d4b5
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
174 additions
and
170 deletions
+174
-170
kconfig-hardened-check.py
kconfig-hardened-check.py
+174
-170
No files found.
kconfig-hardened-check.py
View file @
5336858f
...
...
@@ -17,201 +17,204 @@
# kernel.kptr_restrict=1
import
sys
from
collections
import
namedtuple
from
argparse
import
ArgumentParser
from
collections
import
OrderedDict
import
re
debug_mode
=
False
# set it to True to print the unknown options from the config
error_count
=
0
opt_list
=
[]
Opt
=
namedtuple
(
'Opt'
,
[
'name'
,
'state'
,
'decision'
,
'reason'
])
def
construct_opt_list
():
opt_list
.
append
([
Opt
(
'BUG'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'PAGE_TABLE_ISOLATION'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'RETPOLINE'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'X86_64'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'STRICT_KERNEL_RWX'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'STRICT_MODULE_RWX'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'DEBUG_WX'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'RANDOMIZE_BASE'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'RANDOMIZE_MEMORY'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'CC_STACKPROTECTOR'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'CC_STACKPROTECTOR_STRONG'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'VMAP_STACK'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'THREAD_INFO_IN_TASK'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'SCHED_STACK_END_CHECK'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'SLUB_DEBUG'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'SLAB_FREELIST_HARDENED'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'SLAB_FREELIST_RANDOM'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'HARDENED_USERCOPY'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'FORTIFY_SOURCE'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'MODULE_SIG'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'MODULE_SIG_ALL'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'MODULE_SIG_SHA512'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'SYN_COOKIES'
,
'y'
,
'ubuntu18'
,
'self_protection'
),
''
])
# another reason?
opt_list
.
append
([
Opt
(
'DEFAULT_MMAP_MIN_ADDR'
,
'65536'
,
'ubuntu18'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'BUG_ON_DATA_CORRUPTION'
,
'y'
,
'kspp'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'PAGE_POISONING'
,
'y'
,
'kspp'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'GCC_PLUGINS'
,
'y'
,
'kspp'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'GCC_PLUGIN_RANDSTRUCT'
,
'y'
,
'kspp'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'GCC_PLUGIN_STRUCTLEAK'
,
'y'
,
'kspp'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'GCC_PLUGIN_STRUCTLEAK_BYREF_ALL'
,
'y'
,
'kspp'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'GCC_PLUGIN_LATENT_ENTROPY'
,
'y'
,
'kspp'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'REFCOUNT_FULL'
,
'y'
,
'kspp'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'DEBUG_LIST'
,
'y'
,
'kspp'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'DEBUG_SG'
,
'y'
,
'kspp'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'DEBUG_CREDENTIALS'
,
'y'
,
'kspp'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'DEBUG_NOTIFIERS'
,
'y'
,
'kspp'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'MODULE_SIG_FORCE'
,
'y'
,
'kspp'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'HARDENED_USERCOPY_FALLBACK'
,
'is not set'
,
'kspp'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'GCC_PLUGIN_STACKLEAK'
,
'y'
,
'my'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'SLUB_DEBUG_ON'
,
'y'
,
'my'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'SECURITY_DMESG_RESTRICT'
,
'y'
,
'my'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'STATIC_USERMODEHELPER'
,
'y'
,
'my'
,
'self_protection'
),
''
])
# breaks systemd?
opt_list
.
append
([
Opt
(
'PAGE_POISONING_NO_SANITY'
,
'is not set'
,
'my'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'PAGE_POISONING_ZERO'
,
'is not set'
,
'my'
,
'self_protection'
),
''
])
opt_list
.
append
([
Opt
(
'SECURITY'
,
'y'
,
'ubuntu18'
,
'security_policy'
),
''
])
opt_list
.
append
([
Opt
(
'SECURITY_YAMA'
,
'y'
,
'ubuntu18'
,
'security_policy'
),
''
])
opt_list
.
append
([
Opt
(
'SECURITY_SELINUX_DISABLE'
,
'is not set'
,
'ubuntu18'
,
'security_policy'
),
''
])
opt_list
.
append
([
Opt
(
'SECCOMP'
,
'y'
,
'ubuntu18'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'SECCOMP_FILTER'
,
'y'
,
'ubuntu18'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'STRICT_DEVMEM'
,
'y'
,
'ubuntu18'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'ACPI_CUSTOM_METHOD'
,
'is not set'
,
'ubuntu18'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'COMPAT_BRK'
,
'is not set'
,
'ubuntu18'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'DEVKMEM'
,
'is not set'
,
'ubuntu18'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'COMPAT_VDSO'
,
'is not set'
,
'ubuntu18'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'X86_PTDUMP'
,
'is not set'
,
'ubuntu18'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'ZSMALLOC_STAT'
,
'is not set'
,
'ubuntu18'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'PAGE_OWNER'
,
'is not set'
,
'ubuntu18'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'DEBUG_KMEMLEAK'
,
'is not set'
,
'ubuntu18'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'IO_STRICT_DEVMEM'
,
'y'
,
'kspp'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'LEGACY_VSYSCALL_NONE'
,
'y'
,
'kspp'
,
'cut_attack_surface'
),
''
])
# 'vsyscall=none'
opt_list
.
append
([
Opt
(
'BINFMT_MISC'
,
'is not set'
,
'kspp'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'INET_DIAG'
,
'is not set'
,
'kspp'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'KEXEC'
,
'is not set'
,
'kspp'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'PROC_KCORE'
,
'is not set'
,
'kspp'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'LEGACY_PTYS'
,
'is not set'
,
'kspp'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'IA32_EMULATION'
,
'is not set'
,
'kspp'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'X86_X32'
,
'is not set'
,
'kspp'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'MODIFY_LDT_SYSCALL'
,
'is not set'
,
'kspp'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'HIBERNATION'
,
'is not set'
,
'kspp'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'KPROBES'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'UPROBES'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'GENERIC_TRACER'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'PROC_VMCORE'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'PROC_PAGE_MONITOR'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'USELIB'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'CHECKPOINT_RESTORE'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'USERFAULTFD'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'HWPOISON_INJECT'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'MEM_SOFT_DIRTY'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'DEVPORT'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'DEBUG_FS'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'NOTIFIER_ERROR_INJECTION'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'KEXEC_FILE'
,
'is not set'
,
'my'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'LIVEPATCH'
,
'is not set'
,
'my'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'USER_NS'
,
'is not set'
,
'my'
,
'cut_attack_surface'
),
''
])
# user.max_user_namespaces=0
opt_list
.
append
([
Opt
(
'IP_DCCP'
,
'is not set'
,
'my'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'IP_SCTP'
,
'is not set'
,
'my'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'FTRACE'
,
'is not set'
,
'my'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'PROFILING'
,
'is not set'
,
'my'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'BPF_JIT'
,
'is not set'
,
'my'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'BPF_SYSCALL'
,
'is not set'
,
'my'
,
'cut_attack_surface'
),
''
])
opt_list
.
append
([
Opt
(
'ARCH_MMAP_RND_BITS'
,
'32'
,
'my'
,
'userspace_protection'
),
''
])
opt_list
.
append
([
Opt
(
'LKDTM'
,
'm'
,
'my'
,
'feature_test'
),
''
])
def
print_opt_list
():
checklist
=
[]
class
OptCheck
:
def
__init__
(
self
,
name
,
expected
,
decision
,
reason
):
self
.
name
=
name
self
.
expected
=
expected
self
.
decision
=
decision
self
.
reason
=
reason
self
.
state
=
None
self
.
result
=
None
def
check
(
self
):
if
self
.
expected
==
self
.
state
:
self
.
result
=
'OK'
elif
self
.
state
is
None
:
if
self
.
expected
==
'is not set'
:
self
.
result
=
'OK: not found'
else
:
self
.
result
=
'FAIL: not found'
else
:
self
.
result
=
'FAIL: "'
+
self
.
state
+
'"'
def
__repr__
(
self
):
return
'{} = {}'
.
format
(
self
.
name
,
self
.
state
)
def
construct_opt_checks
():
checklist
.
append
(
OptCheck
(
'BUG'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'PAGE_TABLE_ISOLATION'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'RETPOLINE'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'X86_64'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'STRICT_KERNEL_RWX'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'STRICT_MODULE_RWX'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'DEBUG_WX'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'RANDOMIZE_BASE'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'RANDOMIZE_MEMORY'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'CC_STACKPROTECTOR'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'CC_STACKPROTECTOR_STRONG'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'VMAP_STACK'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'THREAD_INFO_IN_TASK'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'SCHED_STACK_END_CHECK'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'SLUB_DEBUG'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'SLAB_FREELIST_HARDENED'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'SLAB_FREELIST_RANDOM'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'HARDENED_USERCOPY'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'FORTIFY_SOURCE'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'MODULE_SIG'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'MODULE_SIG_ALL'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'MODULE_SIG_SHA512'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'SYN_COOKIES'
,
'y'
,
'ubuntu18'
,
'self_protection'
))
# another reason?
checklist
.
append
(
OptCheck
(
'DEFAULT_MMAP_MIN_ADDR'
,
'65536'
,
'ubuntu18'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'BUG_ON_DATA_CORRUPTION'
,
'y'
,
'kspp'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'PAGE_POISONING'
,
'y'
,
'kspp'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'GCC_PLUGINS'
,
'y'
,
'kspp'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'GCC_PLUGIN_RANDSTRUCT'
,
'y'
,
'kspp'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'GCC_PLUGIN_STRUCTLEAK'
,
'y'
,
'kspp'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'GCC_PLUGIN_STRUCTLEAK_BYREF_ALL'
,
'y'
,
'kspp'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'GCC_PLUGIN_LATENT_ENTROPY'
,
'y'
,
'kspp'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'REFCOUNT_FULL'
,
'y'
,
'kspp'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'DEBUG_LIST'
,
'y'
,
'kspp'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'DEBUG_SG'
,
'y'
,
'kspp'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'DEBUG_CREDENTIALS'
,
'y'
,
'kspp'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'DEBUG_NOTIFIERS'
,
'y'
,
'kspp'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'MODULE_SIG_FORCE'
,
'y'
,
'kspp'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'HARDENED_USERCOPY_FALLBACK'
,
'is not set'
,
'kspp'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'GCC_PLUGIN_STACKLEAK'
,
'y'
,
'my'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'SLUB_DEBUG_ON'
,
'y'
,
'my'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'SECURITY_DMESG_RESTRICT'
,
'y'
,
'my'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'STATIC_USERMODEHELPER'
,
'y'
,
'my'
,
'self_protection'
))
# breaks systemd?
checklist
.
append
(
OptCheck
(
'PAGE_POISONING_NO_SANITY'
,
'is not set'
,
'my'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'PAGE_POISONING_ZERO'
,
'is not set'
,
'my'
,
'self_protection'
))
checklist
.
append
(
OptCheck
(
'SECURITY'
,
'y'
,
'ubuntu18'
,
'security_policy'
))
checklist
.
append
(
OptCheck
(
'SECURITY_YAMA'
,
'y'
,
'ubuntu18'
,
'security_policy'
))
checklist
.
append
(
OptCheck
(
'SECURITY_SELINUX_DISABLE'
,
'is not set'
,
'ubuntu18'
,
'security_policy'
))
checklist
.
append
(
OptCheck
(
'SECCOMP'
,
'y'
,
'ubuntu18'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'SECCOMP_FILTER'
,
'y'
,
'ubuntu18'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'STRICT_DEVMEM'
,
'y'
,
'ubuntu18'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'ACPI_CUSTOM_METHOD'
,
'is not set'
,
'ubuntu18'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'COMPAT_BRK'
,
'is not set'
,
'ubuntu18'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'DEVKMEM'
,
'is not set'
,
'ubuntu18'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'COMPAT_VDSO'
,
'is not set'
,
'ubuntu18'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'X86_PTDUMP'
,
'is not set'
,
'ubuntu18'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'ZSMALLOC_STAT'
,
'is not set'
,
'ubuntu18'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'PAGE_OWNER'
,
'is not set'
,
'ubuntu18'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'DEBUG_KMEMLEAK'
,
'is not set'
,
'ubuntu18'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'IO_STRICT_DEVMEM'
,
'y'
,
'kspp'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'LEGACY_VSYSCALL_NONE'
,
'y'
,
'kspp'
,
'cut_attack_surface'
))
# 'vsyscall=none'
checklist
.
append
(
OptCheck
(
'BINFMT_MISC'
,
'is not set'
,
'kspp'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'INET_DIAG'
,
'is not set'
,
'kspp'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'KEXEC'
,
'is not set'
,
'kspp'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'PROC_KCORE'
,
'is not set'
,
'kspp'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'LEGACY_PTYS'
,
'is not set'
,
'kspp'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'IA32_EMULATION'
,
'is not set'
,
'kspp'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'X86_X32'
,
'is not set'
,
'kspp'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'MODIFY_LDT_SYSCALL'
,
'is not set'
,
'kspp'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'HIBERNATION'
,
'is not set'
,
'kspp'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'KPROBES'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'UPROBES'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'GENERIC_TRACER'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'PROC_VMCORE'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'PROC_PAGE_MONITOR'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'USELIB'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'CHECKPOINT_RESTORE'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'USERFAULTFD'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'HWPOISON_INJECT'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'MEM_SOFT_DIRTY'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'DEVPORT'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'DEBUG_FS'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'NOTIFIER_ERROR_INJECTION'
,
'is not set'
,
'grsecurity'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'KEXEC_FILE'
,
'is not set'
,
'my'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'LIVEPATCH'
,
'is not set'
,
'my'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'USER_NS'
,
'is not set'
,
'my'
,
'cut_attack_surface'
))
# user.max_user_namespaces=0
checklist
.
append
(
OptCheck
(
'IP_DCCP'
,
'is not set'
,
'my'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'IP_SCTP'
,
'is not set'
,
'my'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'FTRACE'
,
'is not set'
,
'my'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'PROFILING'
,
'is not set'
,
'my'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'BPF_JIT'
,
'is not set'
,
'my'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'BPF_SYSCALL'
,
'is not set'
,
'my'
,
'cut_attack_surface'
))
checklist
.
append
(
OptCheck
(
'ARCH_MMAP_RND_BITS'
,
'32'
,
'my'
,
'userspace_protection'
))
checklist
.
append
(
OptCheck
(
'LKDTM'
,
'm'
,
'my'
,
'feature_test'
))
def
print_opt_checks
():
print
(
'[+] Printing kernel hardening preferences...'
)
print
(
' {:<39}|{:^13}|{:^10}|{:^20}'
.
format
(
'option name'
,
'desired val'
,
'decision'
,
'reason'
))
print
(
' ======================================================================================'
)
for
o
in
opt_
list
:
print
(
' CONFIG_{:<32}|{:^13}|{:^10}|{:^20}'
.
format
(
o
[
0
]
.
name
,
o
[
0
]
.
state
,
o
[
0
]
.
decision
,
o
[
0
]
.
reason
))
for
o
pt
in
check
list
:
print
(
' CONFIG_{:<32}|{:^13}|{:^10}|{:^20}'
.
format
(
o
pt
.
name
,
opt
.
expected
,
opt
.
decision
,
opt
.
reason
))
print
()
def
print_check_results
():
global
error_count
print
(
' {:<39}|{:^13}|{:^10}|{:^20}||{:^20}'
.
format
(
'option name'
,
'desired val'
,
'decision'
,
'reason'
,
'check result'
))
print
(
' ==========================================================================================================='
)
for
o
in
opt_list
:
if
o
[
1
]
==
''
:
if
o
[
0
]
.
state
==
'is not set'
:
o
[
1
]
=
'OK: not found'
else
:
error_count
+=
1
o
[
1
]
=
'FAIL: not found'
print
(
' CONFIG_{:<32}|{:^13}|{:^10}|{:^20}||{:^20}'
.
format
(
o
[
0
]
.
name
,
o
[
0
]
.
state
,
o
[
0
]
.
decision
,
o
[
0
]
.
reason
,
o
[
1
]))
for
opt
in
checklist
:
print
(
' CONFIG_{:<32}|{:^13}|{:^10}|{:^20}||{:^20}'
.
format
(
opt
.
name
,
opt
.
expected
,
opt
.
decision
,
opt
.
reason
,
opt
.
result
))
print
()
def
check_state
(
option
):
global
error_count
found
=
False
for
o
in
opt_list
:
if
option
[
0
]
==
o
[
0
]
.
name
:
found
=
True
if
o
[
1
]
!=
''
:
sys
.
exit
(
'[!] BUG: CONFIG_{} was found more than once'
.
format
(
o
[
0
]
.
name
))
if
option
[
1
]
==
o
[
0
]
.
state
:
o
[
1
]
=
'OK'
else
:
o
[
1
]
=
'FAIL: "'
+
option
[
1
]
+
'"'
error_count
+=
1
if
not
found
and
debug_mode
:
print
(
"DEBUG: dunno about option {} "
.
format
(
option
))
def
get_option_state
(
options
,
name
):
return
options
[
name
]
if
name
in
options
else
None
def
check_on
(
line
):
if
line
[:
7
]
!=
'CONFIG_'
:
sys
.
exit
(
'[!] BUG: bad enabled config option "{}"'
.
format
(
line
))
line_parts
=
line
[
7
:]
.
split
(
'='
)
check_state
(
line_parts
)
def
perform_checks
(
parsed_options
):
for
opt
in
checklist
:
opt
.
state
=
get_option_state
(
parsed_options
,
opt
.
name
)
opt
.
check
()
def
check_off
(
line
):
if
line
[:
9
]
!=
'# CONFIG_'
:
sys
.
exit
(
'[!] BUG: bad disabled config option "{}"'
.
format
(
line
))
def
check_config_file
(
fname
):
with
open
(
fname
,
'r'
)
as
f
:
parsed_options
=
OrderedDict
()
opt_is_on
=
re
.
compile
(
"CONFIG_[a-zA-Z0-9_]*=[a-zA-Z0-9_
\"
]*"
)
opt_is_off
=
re
.
compile
(
"# CONFIG_[a-zA-Z0-9_]* is not set"
)
line_parts
=
line
[
9
:]
.
split
(
' '
,
1
)
print
(
'[+] Checking "{}" against hardening preferences...'
.
format
(
fname
))
for
line
in
f
.
readlines
():
line
=
line
.
strip
()
option
=
None
value
=
None
if
line_parts
[
1
]
!=
'is not set'
:
sys
.
exit
(
'[!] BUG: bad disabled config option "{}"'
.
format
(
line
))
if
opt_is_on
.
match
(
line
):
option
,
value
=
line
[
7
:]
.
split
(
'='
,
1
)
elif
opt_is_off
.
match
(
line
):
option
,
value
=
line
[
9
:]
.
split
(
' '
,
1
)
if
value
!=
'is not set'
:
sys
.
exit
(
'[!] ERROR: bad disabled config option "{}"'
.
format
(
line
))
check_state
(
line_parts
)
if
option
in
parsed_options
:
sys
.
exit
(
'[!] ERROR: config option "{}" exists multiple times'
.
format
(
line
))
if
option
is
not
None
:
parsed_options
[
option
]
=
value
def
check_config_file
(
fname
):
f
=
open
(
fname
,
'r'
)
perform_checks
(
parsed_options
)
print
(
'[+] Checking "{}" against hardening preferences...'
.
format
(
fname
))
for
line
in
f
:
opt_is_on
=
re
.
compile
(
"CONFIG_[a-zA-Z0-9_]*=[a-zA-Z0-9_
\"
]*"
)
opt_is_off
=
re
.
compile
(
"# CONFIG_[a-zA-Z0-9_]* is not set"
)
if
opt_is_on
.
match
(
line
):
check_on
(
line
[:
-
1
])
# drop newline
if
opt_is_off
.
match
(
line
):
check_off
(
line
[:
-
1
])
# ditto
if
debug_mode
:
known_options
=
[
opt
.
name
for
opt
in
checklist
]
for
option
,
value
in
parsed_options
.
items
():
if
option
not
in
known_options
:
print
(
"DEBUG: dunno about option {} ({})"
.
format
(
option
,
value
))
print_check_results
()
f
.
close
()
print_check_results
()
if
__name__
==
'__main__'
:
...
...
@@ -221,10 +224,10 @@ if __name__ == '__main__':
parser
.
add_argument
(
'--debug'
,
action
=
'store_true'
,
help
=
'enable internal debug mode'
)
args
=
parser
.
parse_args
()
construct_opt_
list
()
construct_opt_
checks
()
if
args
.
print
:
print_opt_
list
()
print_opt_
checks
()
sys
.
exit
(
0
)
if
args
.
debug
:
...
...
@@ -232,6 +235,7 @@ if __name__ == '__main__':
if
args
.
config
:
check_config_file
(
args
.
config
)
error_count
=
len
(
list
(
filter
(
lambda
opt
:
opt
.
result
.
startswith
(
'FAIL'
),
checklist
)))
if
error_count
==
0
:
print
(
'[+] config check is PASSED'
)
sys
.
exit
(
0
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment