1 # kernel-hardening-checker
3 __(formerly kconfig-hardened-check)__<br /><br />
4 [![functional test](https://github.com/a13xp0p0v/kernel-hardening-checker/workflows/functional%20test/badge.svg)](https://github.com/a13xp0p0v/kernel-hardening-checker/actions/workflows/functional_test.yml)
5 [![functional test coverage](https://codecov.io/gh/a13xp0p0v/kernel-hardening-checker/graph/badge.svg?flag=functional_test)](https://app.codecov.io/gh/a13xp0p0v/kernel-hardening-checker?flags%5B0%5D=functional_test)<br />
6 [![engine unit-test](https://github.com/a13xp0p0v/kernel-hardening-checker/workflows/engine%20unit-test/badge.svg)](https://github.com/a13xp0p0v/kernel-hardening-checker/actions/workflows/engine_unit-test.yml)
7 [![unit-test coverage](https://codecov.io/gh/a13xp0p0v/kernel-hardening-checker/graph/badge.svg?flag=engine_unit-test)](https://app.codecov.io/gh/a13xp0p0v/kernel-hardening-checker?flags%5B0%5D=engine_unit-test)<br />
8 [![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/a13xp0p0v/kernel-hardening-checker?label=release)](https://github.com/a13xp0p0v/kernel-hardening-checker/tags)
12 There are plenty of security hardening options for the Linux kernel. A lot of them are
13 not enabled by the major distros. We have to enable these options ourselves to
14 make our systems more secure.
16 But nobody likes checking configs manually. So let the computers do their job!
18 __kernel-hardening-checker__ (formerly __kconfig-hardened-check__) is a tool for checking the security hardening options of the Linux kernel. It supports checking:
20 - Kconfig options (compile-time)
21 - Kernel cmdline arguments (boot-time)
22 - Sysctl parameters (runtime)
24 The security hardening recommendations are based on:
26 - [KSPP recommended settings][1]
27 - [CLIP OS kernel configuration][2]
28 - Last public [grsecurity][3] patch (options which they disable)
29 - [SECURITY_LOCKDOWN_LSM][5] patchset
30 - [Direct feedback from the Linux kernel maintainers][23]
32 I also created the [__Linux Kernel Defence Map__][4], which is a graphical representation of the
33 relationships between security hardening features and the corresponding vulnerability classes
34 or exploitation techniques.
36 __Attention!__ Changing Linux kernel security parameters may also affect system performance
37 and functionality of userspace software. So for choosing these parameters, consider
38 the threat model of your Linux-based information system and perform thorough testing
39 of its typical workload.
43 - Main at GitHub <https://github.com/a13xp0p0v/kernel-hardening-checker>
44 - Mirror at Codeberg: <https://codeberg.org/a13xp0p0v/kernel-hardening-checker>
45 - Mirror at GitFlic: <https://gitflic.ru/project/a13xp0p0v/kernel-hardening-checker>
47 ## Supported microarchitectures
54 TODO: RISC-V (issue [#56][22])
58 You can install the package:
61 pip install git+https://github.com/a13xp0p0v/kernel-hardening-checker
64 or simply run `./bin/kernel-hardening-checker` from the cloned repository.
66 Some Linux distributions also provide `kernel-hardening-checker` as a package.
70 usage: kernel-hardening-checker [-h] [--version] [-m {verbose,json,show_ok,show_fail}]
71 [-c CONFIG] [-l CMDLINE] [-s SYSCTL] [-v KERNEL_VERSION]
72 [-p {X86_64,X86_32,ARM64,ARM}]
73 [-g {X86_64,X86_32,ARM64,ARM}]
75 A tool for checking the security hardening options of the Linux kernel
78 -h, --help show this help message and exit
79 --version show program's version number and exit
80 -m {verbose,json,show_ok,show_fail}, --mode {verbose,json,show_ok,show_fail}
81 choose the report mode
82 -c CONFIG, --config CONFIG
83 check the security hardening options in the kernel Kconfig file
84 (also supports *.gz files)
85 -l CMDLINE, --cmdline CMDLINE
86 check the security hardening options in the kernel cmdline file
87 (contents of /proc/cmdline)
88 -s SYSCTL, --sysctl SYSCTL
89 check the security hardening options in the sysctl output file
90 (`sudo sysctl -a > file`)
91 -v KERNEL_VERSION, --kernel-version KERNEL_VERSION
92 extract the version from the kernel version file (contents of
94 -p {X86_64,X86_32,ARM64,ARM}, --print {X86_64,X86_32,ARM64,ARM}
95 print the security hardening recommendations for the selected
97 -g {X86_64,X86_32,ARM64,ARM}, --generate {X86_64,X86_32,ARM64,ARM}
98 generate a Kconfig fragment with the security hardening options
99 for the selected microarchitecture
104 - no `-m` argument for the default output mode (see the example below)
105 - `-m verbose` for printing additional info:
106 - config options without a corresponding check
107 - internals of complex checks with AND/OR, like this:
109 -------------------------------------------------------------------------------------------
111 CONFIG_STRICT_DEVMEM |kconfig| y |defconfig |cut_attack_surface
112 CONFIG_DEVMEM |kconfig| is not set | kspp |cut_attack_surface
113 -------------------------------------------------------------------------------------------
115 - `-m show_fail` for showing only the failed checks
116 - `-m show_ok` for showing only the successful checks
117 - `-m json` for printing the results in JSON format (for combining `kernel-hardening-checker` with other tools)
119 ## Example output for `Ubuntu 22.04` kernel configuration
121 $ ./bin/kernel-hardening-checker -c kernel_hardening_checker/config_files/distros/ubuntu-22.04.config -l /proc/cmdline -s kernel_hardening_checker/config_files/distros/example_sysctls.txt
122 [+] Kconfig file to check: kernel_hardening_checker/config_files/distros/ubuntu-22.04.config
123 [+] Kernel cmdline file to check: /proc/cmdline
124 [+] Sysctl output file to check: kernel_hardening_checker/config_files/distros/example_sysctls.txt
125 [+] Detected microarchitecture: X86_64
126 [+] Detected kernel version: (5, 15, 0)
127 [+] Detected compiler: GCC 110200
128 =========================================================================================================================
129 option_name | type |desired_val | decision | reason | check_result
130 =========================================================================================================================
131 CONFIG_BUG |kconfig| y |defconfig | self_protection | OK
132 CONFIG_SLUB_DEBUG |kconfig| y |defconfig | self_protection | OK
133 CONFIG_THREAD_INFO_IN_TASK |kconfig| y |defconfig | self_protection | OK
134 CONFIG_IOMMU_SUPPORT |kconfig| y |defconfig | self_protection | OK
135 CONFIG_STACKPROTECTOR |kconfig| y |defconfig | self_protection | OK
136 CONFIG_STACKPROTECTOR_STRONG |kconfig| y |defconfig | self_protection | OK
137 CONFIG_STRICT_KERNEL_RWX |kconfig| y |defconfig | self_protection | OK
138 CONFIG_STRICT_MODULE_RWX |kconfig| y |defconfig | self_protection | OK
139 CONFIG_REFCOUNT_FULL |kconfig| y |defconfig | self_protection | OK: version >= (5, 4, 208)
140 CONFIG_INIT_STACK_ALL_ZERO |kconfig| y |defconfig | self_protection | FAIL: is not found
141 CONFIG_RANDOMIZE_BASE |kconfig| y |defconfig | self_protection | OK
142 CONFIG_VMAP_STACK |kconfig| y |defconfig | self_protection | OK
143 CONFIG_SPECULATION_MITIGATIONS |kconfig| y |defconfig | self_protection | FAIL: is not found
144 CONFIG_DEBUG_WX |kconfig| y |defconfig | self_protection | OK
145 CONFIG_WERROR |kconfig| y |defconfig | self_protection | FAIL: "is not set"
146 CONFIG_X86_MCE |kconfig| y |defconfig | self_protection | OK
147 CONFIG_X86_MCE_INTEL |kconfig| y |defconfig | self_protection | OK
148 CONFIG_X86_MCE_AMD |kconfig| y |defconfig | self_protection | OK
149 CONFIG_RETPOLINE |kconfig| y |defconfig | self_protection | OK
150 CONFIG_SYN_COOKIES |kconfig| y |defconfig | self_protection | OK
151 CONFIG_MICROCODE |kconfig| y |defconfig | self_protection | OK
152 CONFIG_MICROCODE_INTEL |kconfig| y |defconfig | self_protection | OK
153 CONFIG_MICROCODE_AMD |kconfig| y |defconfig | self_protection | OK
154 CONFIG_X86_SMAP |kconfig| y |defconfig | self_protection | OK
155 CONFIG_X86_UMIP |kconfig| y |defconfig | self_protection | OK
156 CONFIG_PAGE_TABLE_ISOLATION |kconfig| y |defconfig | self_protection | OK
157 CONFIG_RANDOMIZE_MEMORY |kconfig| y |defconfig | self_protection | OK
158 CONFIG_X86_KERNEL_IBT |kconfig| y |defconfig | self_protection | FAIL: is not found
159 CONFIG_CPU_SRSO |kconfig| y |defconfig | self_protection | FAIL: is not found
160 CONFIG_INTEL_IOMMU |kconfig| y |defconfig | self_protection | OK
161 CONFIG_AMD_IOMMU |kconfig| y |defconfig | self_protection | OK
162 CONFIG_BUG_ON_DATA_CORRUPTION |kconfig| y | kspp | self_protection | FAIL: "is not set"
163 CONFIG_SLAB_FREELIST_HARDENED |kconfig| y | kspp | self_protection | OK
164 CONFIG_SLAB_FREELIST_RANDOM |kconfig| y | kspp | self_protection | OK
165 CONFIG_SHUFFLE_PAGE_ALLOCATOR |kconfig| y | kspp | self_protection | OK
166 CONFIG_FORTIFY_SOURCE |kconfig| y | kspp | self_protection | OK
167 CONFIG_DEBUG_LIST |kconfig| y | kspp | self_protection | FAIL: "is not set"
168 CONFIG_DEBUG_VIRTUAL |kconfig| y | kspp | self_protection | FAIL: "is not set"
169 CONFIG_DEBUG_SG |kconfig| y | kspp | self_protection | FAIL: "is not set"
170 CONFIG_INIT_ON_ALLOC_DEFAULT_ON |kconfig| y | kspp | self_protection | OK
171 CONFIG_STATIC_USERMODEHELPER |kconfig| y | kspp | self_protection | FAIL: "is not set"
172 CONFIG_SCHED_CORE |kconfig| y | kspp | self_protection | OK
173 CONFIG_SECURITY_LOCKDOWN_LSM |kconfig| y | kspp | self_protection | OK
174 CONFIG_SECURITY_LOCKDOWN_LSM_EARLY |kconfig| y | kspp | self_protection | OK
175 CONFIG_LOCK_DOWN_KERNEL_FORCE_CONFIDENTIALITY|kconfig| y | kspp | self_protection | FAIL: "is not set"
176 CONFIG_DEBUG_CREDENTIALS |kconfig| y | kspp | self_protection | FAIL: "is not set"
177 CONFIG_DEBUG_NOTIFIERS |kconfig| y | kspp | self_protection | FAIL: "is not set"
178 CONFIG_SCHED_STACK_END_CHECK |kconfig| y | kspp | self_protection | OK
179 CONFIG_KFENCE |kconfig| y | kspp | self_protection | OK
180 CONFIG_KFENCE_SAMPLE_INTERVAL |kconfig| is not off |a13xp0p0v | self_protection | FAIL: is off, "0"
181 CONFIG_RANDSTRUCT_FULL |kconfig| y | kspp | self_protection | FAIL: is not found
182 CONFIG_RANDSTRUCT_PERFORMANCE |kconfig| is not set | kspp | self_protection | FAIL: CONFIG_RANDSTRUCT_FULL is not "y"
183 CONFIG_HARDENED_USERCOPY |kconfig| y | kspp | self_protection | OK
184 CONFIG_HARDENED_USERCOPY_FALLBACK |kconfig| is not set | kspp | self_protection | OK
185 CONFIG_HARDENED_USERCOPY_PAGESPAN |kconfig| is not set | kspp | self_protection | OK
186 CONFIG_GCC_PLUGIN_LATENT_ENTROPY |kconfig| y | kspp | self_protection | FAIL: is not found
187 CONFIG_MODULE_SIG |kconfig| y | kspp | self_protection | OK
188 CONFIG_MODULE_SIG_ALL |kconfig| y | kspp | self_protection | OK
189 CONFIG_MODULE_SIG_SHA512 |kconfig| y | kspp | self_protection | OK
190 CONFIG_MODULE_SIG_FORCE |kconfig| y | kspp | self_protection | FAIL: "is not set"
191 CONFIG_INIT_ON_FREE_DEFAULT_ON |kconfig| y | kspp | self_protection | FAIL: "is not set"
192 CONFIG_EFI_DISABLE_PCI_DMA |kconfig| y | kspp | self_protection | FAIL: "is not set"
193 CONFIG_RESET_ATTACK_MITIGATION |kconfig| y | kspp | self_protection | OK
194 CONFIG_UBSAN_BOUNDS |kconfig| y | kspp | self_protection | OK
195 CONFIG_UBSAN_LOCAL_BOUNDS |kconfig| y | kspp | self_protection | OK: CONFIG_UBSAN_BOUNDS is "y"
196 CONFIG_UBSAN_TRAP |kconfig| y | kspp | self_protection | FAIL: CONFIG_UBSAN_ENUM is not "is not set"
197 CONFIG_UBSAN_SANITIZE_ALL |kconfig| y | kspp | self_protection | OK
198 CONFIG_GCC_PLUGIN_STACKLEAK |kconfig| y | kspp | self_protection | FAIL: is not found
199 CONFIG_STACKLEAK_METRICS |kconfig| is not set | kspp | self_protection | FAIL: CONFIG_GCC_PLUGIN_STACKLEAK is not "y"
200 CONFIG_STACKLEAK_RUNTIME_DISABLE |kconfig| is not set | kspp | self_protection | FAIL: CONFIG_GCC_PLUGIN_STACKLEAK is not "y"
201 CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT |kconfig| y | kspp | self_protection | OK
202 CONFIG_CFI_CLANG |kconfig| y | kspp | self_protection | FAIL: CONFIG_CC_IS_CLANG is not "y"
203 CONFIG_CFI_PERMISSIVE |kconfig| is not set | kspp | self_protection | FAIL: CONFIG_CC_IS_CLANG is not "y"
204 CONFIG_HW_RANDOM_TPM |kconfig| y | kspp | self_protection | OK
205 CONFIG_DEFAULT_MMAP_MIN_ADDR |kconfig| 65536 | kspp | self_protection | OK
206 CONFIG_IOMMU_DEFAULT_DMA_STRICT |kconfig| y | kspp | self_protection | FAIL: "is not set"
207 CONFIG_IOMMU_DEFAULT_PASSTHROUGH |kconfig| is not set | kspp | self_protection | OK
208 CONFIG_INTEL_IOMMU_DEFAULT_ON |kconfig| y | kspp | self_protection | OK
209 CONFIG_SLS |kconfig| y | kspp | self_protection | FAIL: is not found
210 CONFIG_INTEL_IOMMU_SVM |kconfig| y | kspp | self_protection | OK
211 CONFIG_AMD_IOMMU_V2 |kconfig| y | kspp | self_protection | FAIL: "m"
212 CONFIG_SLAB_MERGE_DEFAULT |kconfig| is not set | clipos | self_protection | FAIL: "y"
213 CONFIG_LIST_HARDENED |kconfig| y |a13xp0p0v | self_protection | FAIL: is not found
214 CONFIG_RANDOM_KMALLOC_CACHES |kconfig| y |a13xp0p0v | self_protection | FAIL: is not found
215 CONFIG_SECURITY |kconfig| y |defconfig | security_policy | OK
216 CONFIG_SECURITY_YAMA |kconfig| y | kspp | security_policy | OK
217 CONFIG_SECURITY_LANDLOCK |kconfig| y | kspp | security_policy | OK
218 CONFIG_SECURITY_SELINUX_DISABLE |kconfig| is not set | kspp | security_policy | OK
219 CONFIG_SECURITY_SELINUX_BOOTPARAM |kconfig| is not set | kspp | security_policy | FAIL: "y"
220 CONFIG_SECURITY_SELINUX_DEVELOP |kconfig| is not set | kspp | security_policy | FAIL: "y"
221 CONFIG_SECURITY_WRITABLE_HOOKS |kconfig| is not set | kspp | security_policy | OK: is not found
222 CONFIG_SECURITY_SELINUX_DEBUG |kconfig| is not set |a13xp0p0v | security_policy | OK: is not found
223 CONFIG_SECURITY_SELINUX |kconfig| y |a13xp0p0v | security_policy | OK
224 CONFIG_SECCOMP |kconfig| y |defconfig |cut_attack_surface| OK
225 CONFIG_SECCOMP_FILTER |kconfig| y |defconfig |cut_attack_surface| OK
226 CONFIG_BPF_UNPRIV_DEFAULT_OFF |kconfig| y |defconfig |cut_attack_surface| OK
227 CONFIG_STRICT_DEVMEM |kconfig| y |defconfig |cut_attack_surface| OK
228 CONFIG_X86_INTEL_TSX_MODE_OFF |kconfig| y |defconfig |cut_attack_surface| OK
229 CONFIG_SECURITY_DMESG_RESTRICT |kconfig| y | kspp |cut_attack_surface| OK
230 CONFIG_ACPI_CUSTOM_METHOD |kconfig| is not set | kspp |cut_attack_surface| OK
231 CONFIG_COMPAT_BRK |kconfig| is not set | kspp |cut_attack_surface| OK
232 CONFIG_DEVKMEM |kconfig| is not set | kspp |cut_attack_surface| OK: is not found
233 CONFIG_BINFMT_MISC |kconfig| is not set | kspp |cut_attack_surface| FAIL: "m"
234 CONFIG_INET_DIAG |kconfig| is not set | kspp |cut_attack_surface| FAIL: "m"
235 CONFIG_KEXEC |kconfig| is not set | kspp |cut_attack_surface| FAIL: "y"
236 CONFIG_PROC_KCORE |kconfig| is not set | kspp |cut_attack_surface| FAIL: "y"
237 CONFIG_LEGACY_PTYS |kconfig| is not set | kspp |cut_attack_surface| FAIL: "y"
238 CONFIG_HIBERNATION |kconfig| is not set | kspp |cut_attack_surface| FAIL: "y"
239 CONFIG_COMPAT |kconfig| is not set | kspp |cut_attack_surface| FAIL: "y"
240 CONFIG_IA32_EMULATION |kconfig| is not set | kspp |cut_attack_surface| FAIL: "y"
241 CONFIG_X86_X32 |kconfig| is not set | kspp |cut_attack_surface| FAIL: "y"
242 CONFIG_X86_X32_ABI |kconfig| is not set | kspp |cut_attack_surface| OK: is not found
243 CONFIG_MODIFY_LDT_SYSCALL |kconfig| is not set | kspp |cut_attack_surface| FAIL: "y"
244 CONFIG_OABI_COMPAT |kconfig| is not set | kspp |cut_attack_surface| OK: is not found
245 CONFIG_X86_MSR |kconfig| is not set | kspp |cut_attack_surface| FAIL: "m"
246 CONFIG_LEGACY_TIOCSTI |kconfig| is not set | kspp |cut_attack_surface| OK: is not found
247 CONFIG_MODULES |kconfig| is not set | kspp |cut_attack_surface| FAIL: "y"
248 CONFIG_DEVMEM |kconfig| is not set | kspp |cut_attack_surface| FAIL: "y"
249 CONFIG_IO_STRICT_DEVMEM |kconfig| y | kspp |cut_attack_surface| FAIL: "is not set"
250 CONFIG_LDISC_AUTOLOAD |kconfig| is not set | kspp |cut_attack_surface| FAIL: "y"
251 CONFIG_COMPAT_VDSO |kconfig| is not set | kspp |cut_attack_surface| OK
252 CONFIG_X86_VSYSCALL_EMULATION |kconfig| is not set | kspp |cut_attack_surface| FAIL: "y"
253 CONFIG_ZSMALLOC_STAT |kconfig| is not set | grsec |cut_attack_surface| OK
254 CONFIG_PAGE_OWNER |kconfig| is not set | grsec |cut_attack_surface| OK
255 CONFIG_DEBUG_KMEMLEAK |kconfig| is not set | grsec |cut_attack_surface| OK
256 CONFIG_BINFMT_AOUT |kconfig| is not set | grsec |cut_attack_surface| OK: is not found
257 CONFIG_KPROBE_EVENTS |kconfig| is not set | grsec |cut_attack_surface| FAIL: "y"
258 CONFIG_UPROBE_EVENTS |kconfig| is not set | grsec |cut_attack_surface| FAIL: "y"
259 CONFIG_GENERIC_TRACER |kconfig| is not set | grsec |cut_attack_surface| FAIL: "y"
260 CONFIG_FUNCTION_TRACER |kconfig| is not set | grsec |cut_attack_surface| FAIL: "y"
261 CONFIG_STACK_TRACER |kconfig| is not set | grsec |cut_attack_surface| FAIL: "y"
262 CONFIG_HIST_TRIGGERS |kconfig| is not set | grsec |cut_attack_surface| FAIL: "y"
263 CONFIG_BLK_DEV_IO_TRACE |kconfig| is not set | grsec |cut_attack_surface| FAIL: "y"
264 CONFIG_PROC_VMCORE |kconfig| is not set | grsec |cut_attack_surface| FAIL: "y"
265 CONFIG_PROC_PAGE_MONITOR |kconfig| is not set | grsec |cut_attack_surface| FAIL: "y"
266 CONFIG_USELIB |kconfig| is not set | grsec |cut_attack_surface| FAIL: "y"
267 CONFIG_CHECKPOINT_RESTORE |kconfig| is not set | grsec |cut_attack_surface| FAIL: "y"
268 CONFIG_USERFAULTFD |kconfig| is not set | grsec |cut_attack_surface| FAIL: "y"
269 CONFIG_HWPOISON_INJECT |kconfig| is not set | grsec |cut_attack_surface| FAIL: "m"
270 CONFIG_MEM_SOFT_DIRTY |kconfig| is not set | grsec |cut_attack_surface| FAIL: "y"
271 CONFIG_DEVPORT |kconfig| is not set | grsec |cut_attack_surface| FAIL: "y"
272 CONFIG_DEBUG_FS |kconfig| is not set | grsec |cut_attack_surface| FAIL: "y"
273 CONFIG_NOTIFIER_ERROR_INJECTION |kconfig| is not set | grsec |cut_attack_surface| FAIL: "m"
274 CONFIG_FAIL_FUTEX |kconfig| is not set | grsec |cut_attack_surface| OK: is not found
275 CONFIG_PUNIT_ATOM_DEBUG |kconfig| is not set | grsec |cut_attack_surface| FAIL: "m"
276 CONFIG_ACPI_CONFIGFS |kconfig| is not set | grsec |cut_attack_surface| FAIL: "m"
277 CONFIG_EDAC_DEBUG |kconfig| is not set | grsec |cut_attack_surface| OK
278 CONFIG_DRM_I915_DEBUG |kconfig| is not set | grsec |cut_attack_surface| OK
279 CONFIG_BCACHE_CLOSURES_DEBUG |kconfig| is not set | grsec |cut_attack_surface| OK
280 CONFIG_DVB_C8SECTPFE |kconfig| is not set | grsec |cut_attack_surface| OK: is not found
281 CONFIG_MTD_SLRAM |kconfig| is not set | grsec |cut_attack_surface| FAIL: "m"
282 CONFIG_MTD_PHRAM |kconfig| is not set | grsec |cut_attack_surface| FAIL: "m"
283 CONFIG_IO_URING |kconfig| is not set | grsec |cut_attack_surface| FAIL: "y"
284 CONFIG_KCMP |kconfig| is not set | grsec |cut_attack_surface| FAIL: "y"
285 CONFIG_RSEQ |kconfig| is not set | grsec |cut_attack_surface| FAIL: "y"
286 CONFIG_LATENCYTOP |kconfig| is not set | grsec |cut_attack_surface| OK
287 CONFIG_KCOV |kconfig| is not set | grsec |cut_attack_surface| OK
288 CONFIG_PROVIDE_OHCI1394_DMA_INIT |kconfig| is not set | grsec |cut_attack_surface| OK
289 CONFIG_SUNRPC_DEBUG |kconfig| is not set | grsec |cut_attack_surface| FAIL: "y"
290 CONFIG_PTDUMP_DEBUGFS |kconfig| is not set | grsec |cut_attack_surface| OK
291 CONFIG_DRM_LEGACY |kconfig| is not set |maintainer|cut_attack_surface| OK
292 CONFIG_FB |kconfig| is not set |maintainer|cut_attack_surface| FAIL: "y"
293 CONFIG_VT |kconfig| is not set |maintainer|cut_attack_surface| FAIL: "y"
294 CONFIG_BLK_DEV_FD |kconfig| is not set |maintainer|cut_attack_surface| FAIL: "m"
295 CONFIG_BLK_DEV_FD_RAWCMD |kconfig| is not set |maintainer|cut_attack_surface| OK: is not found
296 CONFIG_NOUVEAU_LEGACY_CTX_SUPPORT |kconfig| is not set |maintainer|cut_attack_surface| OK
297 CONFIG_STAGING |kconfig| is not set | clipos |cut_attack_surface| FAIL: "y"
298 CONFIG_KSM |kconfig| is not set | clipos |cut_attack_surface| FAIL: "y"
299 CONFIG_KALLSYMS |kconfig| is not set | clipos |cut_attack_surface| FAIL: "y"
300 CONFIG_MAGIC_SYSRQ |kconfig| is not set | clipos |cut_attack_surface| FAIL: "y"
301 CONFIG_KEXEC_FILE |kconfig| is not set | clipos |cut_attack_surface| FAIL: "y"
302 CONFIG_USER_NS |kconfig| is not set | clipos |cut_attack_surface| FAIL: "y"
303 CONFIG_X86_CPUID |kconfig| is not set | clipos |cut_attack_surface| FAIL: "m"
304 CONFIG_X86_IOPL_IOPERM |kconfig| is not set | clipos |cut_attack_surface| FAIL: "y"
305 CONFIG_ACPI_TABLE_UPGRADE |kconfig| is not set | clipos |cut_attack_surface| FAIL: "y"
306 CONFIG_EFI_CUSTOM_SSDT_OVERLAYS |kconfig| is not set | clipos |cut_attack_surface| FAIL: "y"
307 CONFIG_AIO |kconfig| is not set | clipos |cut_attack_surface| FAIL: "y"
308 CONFIG_EFI_TEST |kconfig| is not set | lockdown |cut_attack_surface| FAIL: "m"
309 CONFIG_MMIOTRACE_TEST |kconfig| is not set | lockdown |cut_attack_surface| OK
310 CONFIG_KPROBES |kconfig| is not set | lockdown |cut_attack_surface| FAIL: "y"
311 CONFIG_BPF_SYSCALL |kconfig| is not set | lockdown |cut_attack_surface| FAIL: "y"
312 CONFIG_MMIOTRACE |kconfig| is not set |a13xp0p0v |cut_attack_surface| FAIL: "y"
313 CONFIG_LIVEPATCH |kconfig| is not set |a13xp0p0v |cut_attack_surface| FAIL: "y"
314 CONFIG_IP_DCCP |kconfig| is not set |a13xp0p0v |cut_attack_surface| FAIL: "m"
315 CONFIG_IP_SCTP |kconfig| is not set |a13xp0p0v |cut_attack_surface| FAIL: "m"
316 CONFIG_FTRACE |kconfig| is not set |a13xp0p0v |cut_attack_surface| FAIL: "y"
317 CONFIG_VIDEO_VIVID |kconfig| is not set |a13xp0p0v |cut_attack_surface| FAIL: "m"
318 CONFIG_INPUT_EVBUG |kconfig| is not set |a13xp0p0v |cut_attack_surface| FAIL: "m"
319 CONFIG_KGDB |kconfig| is not set |a13xp0p0v |cut_attack_surface| FAIL: "y"
320 CONFIG_CORESIGHT |kconfig| is not set |a13xp0p0v |cut_attack_surface| OK: is not found
321 CONFIG_XFS_SUPPORT_V4 |kconfig| is not set |a13xp0p0v |cut_attack_surface| FAIL: "y"
322 CONFIG_TRIM_UNUSED_KSYMS |kconfig| y |a13xp0p0v |cut_attack_surface| FAIL: "is not set"
323 CONFIG_MODULE_FORCE_LOAD |kconfig| is not set |a13xp0p0v |cut_attack_surface| OK
324 CONFIG_COREDUMP |kconfig| is not set | clipos | harden_userspace | FAIL: "y"
325 CONFIG_ARCH_MMAP_RND_BITS |kconfig| 32 |a13xp0p0v | harden_userspace | FAIL: "28"
326 nosmep |cmdline| is not set |defconfig | self_protection | OK: is not found
327 nosmap |cmdline| is not set |defconfig | self_protection | OK: is not found
328 nokaslr |cmdline| is not set |defconfig | self_protection | OK: is not found
329 nopti |cmdline| is not set |defconfig | self_protection | OK: is not found
330 nospectre_v1 |cmdline| is not set |defconfig | self_protection | OK: is not found
331 nospectre_v2 |cmdline| is not set |defconfig | self_protection | OK: is not found
332 nospectre_bhb |cmdline| is not set |defconfig | self_protection | OK: is not found
333 nospec_store_bypass_disable |cmdline| is not set |defconfig | self_protection | OK: is not found
334 dis_ucode_ldr |cmdline| is not set |defconfig | self_protection | OK: is not found
335 arm64.nobti |cmdline| is not set |defconfig | self_protection | OK: is not found
336 arm64.nopauth |cmdline| is not set |defconfig | self_protection | OK: is not found
337 arm64.nomte |cmdline| is not set |defconfig | self_protection | OK: is not found
338 spectre_v2 |cmdline| is not off |defconfig | self_protection | FAIL: is off, not found
339 spectre_v2_user |cmdline| is not off |defconfig | self_protection | FAIL: is off, not found
340 spec_store_bypass_disable |cmdline| is not off |defconfig | self_protection | FAIL: is off, not found
341 l1tf |cmdline| is not off |defconfig | self_protection | FAIL: is off, not found
342 mds |cmdline| is not off |defconfig | self_protection | FAIL: is off, not found
343 tsx_async_abort |cmdline| is not off |defconfig | self_protection | FAIL: is off, not found
344 srbds |cmdline| is not off |defconfig | self_protection | FAIL: is off, not found
345 mmio_stale_data |cmdline| is not off |defconfig | self_protection | FAIL: is off, not found
346 retbleed |cmdline| is not off |defconfig | self_protection | FAIL: is off, not found
347 spec_rstack_overflow |cmdline| is not off |defconfig | self_protection | FAIL: is off, not found
348 gather_data_sampling |cmdline| is not off |defconfig | self_protection | FAIL: is off, not found
349 rodata |cmdline| on |defconfig | self_protection | OK: rodata is not found
350 mitigations |cmdline| auto,nosmt | kspp | self_protection | FAIL: is not found
351 slab_merge |cmdline| is not set | kspp | self_protection | OK: is not found
352 slub_merge |cmdline| is not set | kspp | self_protection | OK: is not found
353 page_alloc.shuffle |cmdline| 1 | kspp | self_protection | FAIL: is not found
354 slab_nomerge |cmdline| is present | kspp | self_protection | FAIL: is not present
355 init_on_alloc |cmdline| 1 | kspp | self_protection | OK: CONFIG_INIT_ON_ALLOC_DEFAULT_ON is "y"
356 init_on_free |cmdline| 1 | kspp | self_protection | FAIL: is not found
357 hardened_usercopy |cmdline| 1 | kspp | self_protection | OK: CONFIG_HARDENED_USERCOPY is "y"
358 slab_common.usercopy_fallback |cmdline| is not set | kspp | self_protection | OK: is not found
359 iommu.strict |cmdline| 1 | kspp | self_protection | FAIL: is not found
360 iommu.passthrough |cmdline| 0 | kspp | self_protection | OK: CONFIG_IOMMU_DEFAULT_PASSTHROUGH is "is not set"
361 randomize_kstack_offset |cmdline| 1 | kspp | self_protection | OK: CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is "y"
362 pti |cmdline| on | kspp | self_protection | FAIL: is not found
363 iommu |cmdline| force | clipos | self_protection | FAIL: is not found
364 kfence.sample_interval |cmdline| is not off |a13xp0p0v | self_protection | FAIL: is off, not found
365 tsx |cmdline| off |defconfig |cut_attack_surface| OK: CONFIG_X86_INTEL_TSX_MODE_OFF is "y"
366 nosmt |cmdline| is present | kspp |cut_attack_surface| FAIL: is not present
367 vsyscall |cmdline| none | kspp |cut_attack_surface| FAIL: is not found
368 vdso32 |cmdline| 0 | kspp |cut_attack_surface| OK: CONFIG_COMPAT_VDSO is "is not set"
369 debugfs |cmdline| off | grsec |cut_attack_surface| FAIL: is not found
370 sysrq_always_enabled |cmdline| is not set |a13xp0p0v |cut_attack_surface| OK: is not found
371 ia32_emulation |cmdline| 0 |a13xp0p0v |cut_attack_surface| FAIL: is not found
372 norandmaps |cmdline| is not set |defconfig | harden_userspace | OK: is not found
373 net.core.bpf_jit_harden |sysctl | 2 | kspp | self_protection | FAIL: "0"
374 kernel.dmesg_restrict |sysctl | 1 | kspp |cut_attack_surface| OK
375 kernel.perf_event_paranoid |sysctl | 3 | kspp |cut_attack_surface| FAIL: "4"
376 kernel.kexec_load_disabled |sysctl | 1 | kspp |cut_attack_surface| FAIL: "0"
377 user.max_user_namespaces |sysctl | 0 | kspp |cut_attack_surface| FAIL: "31231"
378 dev.tty.ldisc_autoload |sysctl | 0 | kspp |cut_attack_surface| FAIL: "1"
379 kernel.unprivileged_bpf_disabled |sysctl | 1 | kspp |cut_attack_surface| FAIL: "2"
380 kernel.kptr_restrict |sysctl | 2 | kspp |cut_attack_surface| FAIL: "1"
381 dev.tty.legacy_tiocsti |sysctl | 0 | kspp |cut_attack_surface| FAIL: is not found
382 vm.unprivileged_userfaultfd |sysctl | 0 | kspp |cut_attack_surface| OK
383 kernel.modules_disabled |sysctl | 1 | clipos |cut_attack_surface| FAIL: "0"
384 fs.protected_symlinks |sysctl | 1 | kspp | harden_userspace | OK
385 fs.protected_hardlinks |sysctl | 1 | kspp | harden_userspace | OK
386 fs.protected_fifos |sysctl | 2 | kspp | harden_userspace | FAIL: "1"
387 fs.protected_regular |sysctl | 2 | kspp | harden_userspace | OK
388 fs.suid_dumpable |sysctl | 0 | kspp | harden_userspace | FAIL: "2"
389 kernel.randomize_va_space |sysctl | 2 | kspp | harden_userspace | OK
390 kernel.yama.ptrace_scope |sysctl | 3 | kspp | harden_userspace | FAIL: "1"
392 [+] Config check is finished: 'OK' - 121 / 'FAIL' - 139
395 ## Generating a Kconfig fragment with the security hardening options
397 With the `-g` argument, the tool generates a Kconfig fragment with the security hardening options for the selected microarchitecture.
399 This Kconfig fragment can be merged with the existing Linux kernel config:
401 $ ./bin/kernel-hardening-checker -g X86_64 > /tmp/fragment
403 $ ./scripts/kconfig/merge_config.sh .config /tmp/fragment
404 Using .config as base
405 Merging /tmp/fragment
406 Value of CONFIG_BUG_ON_DATA_CORRUPTION is redefined by fragment /tmp/fragment:
407 Previous value: # CONFIG_BUG_ON_DATA_CORRUPTION is not set
408 New value: CONFIG_BUG_ON_DATA_CORRUPTION=y
412 ## Questions and answers
414 __Q:__ How all these kernel parameters influence the Linux kernel security?
416 __A:__ To answer this question, you can use the `kernel-hardening-checker` [sources of recommendations][24]
417 and the [Linux Kernel Defence Map][4] with its references.
421 __Q:__ How disabling `CONFIG_USER_NS` cuts the attack surface? It's needed for containers!
423 __A:__ Yes, the `CONFIG_USER_NS` option provides some isolation between the userspace programs,
424 but the tool recommends disabling it to cut the attack surface __of the kernel__.
428 - An LWN article about the corresponding LKML discussion: https://lwn.net/Articles/673597/
430 - A twitter thread about `CONFIG_USER_NS` and security: https://twitter.com/robertswiecki/status/1095447678949953541
432 - A good overview of the trade-off between having user namespaces enabled, disabled and available only for root: https://github.com/NixOS/nixpkgs/pull/84522#issuecomment-614640601
436 __Q:__ KSPP and CLIP OS recommend `CONFIG_PANIC_ON_OOPS=y`. Why doesn't this tool do the same?
438 __A:__ I personally don't support this recommendation because:
439 - It decreases system safety (kernel oops is still not a rare situation)
440 - It allows easier denial-of-service attacks for the whole system
442 I think having `CONFIG_BUG` is enough here.
443 If a kernel oops happens in the process context, the offending/attacking process is killed.
444 In other cases, the kernel panics, which is similar to `CONFIG_PANIC_ON_OOPS=y`.
448 __Q:__ Why enabling `CONFIG_STATIC_USERMODEHELPER` breaks various things in my GNU/Linux system?
449 Do I really need that feature?
451 __A:__ Linux kernel usermode helpers can be used for privilege escalation in kernel exploits
452 ([example 1][9], [example 2][10]). `CONFIG_STATIC_USERMODEHELPER` prevents that method. But it
453 requires the corresponding support in the userspace: see the [example implementation][11] by
454 Tycho Andersen [@tych0][12].
458 __Q:__ What about performance impact of these security hardening options?
460 __A:__ Ike Devolder [@BlackIkeEagle][7] made some performance tests and described the results in [this article][8].
461 A more detailed evaluation is in the TODO list (the issue [#66][21]).
465 __Q:__ Can I easily check which kernel versions support some Kconfig option?
467 __A:__ Yes. See the [LKDDb][18] project (Linux Kernel Driver Database) by Giacomo Catenazzi [@cateee][19].
468 You can use it for the `mainline` or `stable` tree from [kernel.org][20] or for your custom kernel sources.
472 __Q:__ Does my kernel have all those mitigations of Transient Execution Vulnerabilities in my hardware?
474 __A:__ Checking the kernel config is not enough to answer this question.
475 I highly recommend using [spectre-meltdown-checker][13] tool maintained by Stéphane Lesimple [@speed47][14].
479 __Q:__ Why the `CONFIG_GCC_PLUGINS` option is automatically disabled during the kernel compilation?
481 __A:__ It means that your gcc doesn't support plugins. For example, if you have `gcc-7` on Ubuntu,
482 try to install `gcc-7-plugin-dev` package, it should help.
485 [1]: http://kernsec.org/wiki/index.php/Kernel_Self_Protection_Project/Recommended_Settings
486 [2]: https://docs.clip-os.org/clipos/kernel.html#configuration
487 [3]: https://grsecurity.net/
488 [4]: https://github.com/a13xp0p0v/linux-kernel-defence-map
489 [5]: https://lwn.net/Articles/791863/
490 [6]: https://github.com/a13xp0p0v/kernel-hardening-checker/issues/38
491 [7]: https://github.com/BlackIkeEagle
492 [8]: https://blog.herecura.eu/blog/2020-05-30-kconfig-hardening-tests/
493 [9]: https://googleprojectzero.blogspot.com/2018/09/a-cache-invalidation-bug-in-linux.html
494 [10]: https://a13xp0p0v.github.io/2020/02/15/CVE-2019-18683.html
495 [11]: https://github.com/tych0/huldufolk
496 [12]: https://github.com/tych0
497 [13]: https://github.com/speed47/spectre-meltdown-checker
498 [14]: https://github.com/speed47
499 [15]: https://github.com/a13xp0p0v/kernel-hardening-checker/issues/53
500 [16]: https://github.com/a13xp0p0v/kernel-hardening-checker/pull/54
501 [17]: https://github.com/a13xp0p0v/kernel-hardening-checker/pull/62
502 [18]: https://cateee.net/lkddb/web-lkddb/
503 [19]: https://github.com/cateee/lkddb
504 [20]: https://kernel.org/
505 [21]: https://github.com/a13xp0p0v/kernel-hardening-checker/issues/66
506 [22]: https://github.com/a13xp0p0v/kernel-hardening-checker/issues/56
507 [23]: https://github.com/a13xp0p0v/kernel-hardening-checker/issues?q=label%3Akernel_maintainer_feedback
508 [24]: https://github.com/a13xp0p0v/kernel-hardening-checker#motivation