mirror of https://github.com/pwndbg/pwndbg.git
parent
8b43ac297e
commit
22409202e7
@ -0,0 +1,130 @@
|
||||
import argparse
|
||||
from typing import NamedTuple
|
||||
|
||||
import pwndbg.color.message as M
|
||||
import pwndbg.commands
|
||||
import pwndbg.gdblib.kernel
|
||||
|
||||
|
||||
class Option(NamedTuple):
|
||||
name: str
|
||||
desired: bool = True
|
||||
cmdline_option: str = None
|
||||
|
||||
|
||||
# TODO: Account for commandline params, module params, and sysctls
|
||||
|
||||
_hardening_options = [
|
||||
# Stack overflow protection
|
||||
Option("STACKPROTECTOR"),
|
||||
Option("STACKPROTECTOR_STRONG"),
|
||||
Option("SHADOW_CALL_STACK"),
|
||||
# RWX
|
||||
Option("STRICT_KERNEL_RWX"),
|
||||
Option("STRICT_MODULE_RWX"),
|
||||
Option("DEBUG_WX"),
|
||||
# ASLR
|
||||
Option("RANDOMIZE_BASE"),
|
||||
Option("RANDOMIZE_KSTACK_OFFSET_DEFAULT"),
|
||||
Option("RANDOMIZE_MODULE_REGION_FULL"),
|
||||
Option("KALLSYMS", False),
|
||||
# Memory allocation
|
||||
Option("SLAB_FREELIST_HARDENED"),
|
||||
Option("SLAB_FREELIST_RANDOM"),
|
||||
Option("KFENCE"),
|
||||
# Uninitialized data
|
||||
Option("INIT_ON_ALLOC_DEFAULT_ON"),
|
||||
Option("INIT_STACK_ALL_ZERO"),
|
||||
Option("INIT_ON_FREE_DEFAULT_ON"),
|
||||
# CFI
|
||||
Option("CFI_CLANG"),
|
||||
Option("CFI_PERMISSIVE", False),
|
||||
# Access control
|
||||
Option("SECURITY"),
|
||||
Option("SECURITY_YAMA"),
|
||||
Option("SECURITY_SELINUX_DISABLE", False),
|
||||
Option("SECURITY_SELINUX_BOOTPARAM", False),
|
||||
Option("SECURITY_SELINUX_DEVELOP", False),
|
||||
# Tracing
|
||||
Option("KPROBES", False),
|
||||
Option("FTRACE", False),
|
||||
Option("KPROBE_EVENTS", False),
|
||||
Option("UPROBE_EVENTS", False),
|
||||
Option("GENERIC_TRACER", False),
|
||||
Option("FUNCTION_TRACER", False),
|
||||
Option("STACK_TRACER", False),
|
||||
# /dev/mem
|
||||
Option("STRICT_DEVMEM"),
|
||||
Option("DEVMEM", False),
|
||||
Option("DEVKMEM", False),
|
||||
# debugfs
|
||||
Option("DEBUG_FS", False),
|
||||
Option("PTDUMP_DEBUGFS", False),
|
||||
# Misc
|
||||
Option("BUG"),
|
||||
Option("MODULES", False),
|
||||
Option("USERFAULTFD", False),
|
||||
Option("FORTIFY_SOURCE"),
|
||||
Option("STATIC_USERMODEHELPER"),
|
||||
Option("HARDENED_USERCOPY"),
|
||||
Option("RODATA_FULL_DEFAULT_ENABLED"),
|
||||
Option("RANDSTRUCT_FULL"),
|
||||
Option("TRIM_UNUSED_KSYMS"),
|
||||
Option("SECURITY_DMESG_RESTRICT"),
|
||||
Option("PROC_KCORE", False),
|
||||
Option("PROC_VMCORE", False),
|
||||
Option("COMPAT_VDSO", False),
|
||||
Option("BINFMT_MISC", False),
|
||||
]
|
||||
|
||||
_x86_hardening_options = [
|
||||
Option("X86_SMAP"),
|
||||
Option("IA32_EMULATION", False),
|
||||
Option("X86_X32", False),
|
||||
]
|
||||
|
||||
_arch_hardening_options = {}
|
||||
_arch_hardening_options["i386"] = _x86_hardening_options
|
||||
_arch_hardening_options["x86-64"] = _x86_hardening_options
|
||||
_arch_hardening_options["aarch64"] = [
|
||||
Option("ARM64_PAN"),
|
||||
Option("ARM64_EPAN"),
|
||||
Option("ARM64_SW_TTBR0_PAN"),
|
||||
Option("ARM64_PTR_AUTH"),
|
||||
Option("ARM64_PTR_AUTH_KERNEL"),
|
||||
Option("ARM64_BTI"),
|
||||
Option("ARM64_BTI_KERNEL"),
|
||||
Option("ARM64_MTE"),
|
||||
]
|
||||
|
||||
parser = argparse.ArgumentParser(description="Checks for kernel hardening configuration options")
|
||||
|
||||
|
||||
@pwndbg.commands.ArgparsedCommand(parser)
|
||||
@pwndbg.commands.OnlyWhenQemuKernel
|
||||
@pwndbg.commands.OnlyWithKernelDebugSyms
|
||||
def kchecksec():
|
||||
kconfig = pwndbg.gdblib.kernel.kconfig()
|
||||
|
||||
if len(kconfig) == 0:
|
||||
print(
|
||||
M.warn(
|
||||
"No kernel configuration found, make sure the kernel was built with CONFIG_IKCONFIG"
|
||||
)
|
||||
)
|
||||
return
|
||||
|
||||
cmdline = pwndbg.gdblib.kernel.kcmdline()
|
||||
|
||||
options = _hardening_options + _arch_hardening_options.get(pwndbg.gdblib.arch.name, [])
|
||||
for opt in options:
|
||||
config_name = opt.name
|
||||
val = kconfig.get(config_name)
|
||||
color_func = M.error
|
||||
if (opt.desired and val) or (not opt.desired and not val):
|
||||
color_func = M.success
|
||||
|
||||
if val:
|
||||
print(color_func(f"CONFIG_{config_name} = {val}"))
|
||||
else:
|
||||
print(color_func(f"CONFIG_{config_name} not set"))
|
||||
Loading…
Reference in new issue