summaryrefslogtreecommitdiffstats
path: root/sec-blueprint/08-Hardening.md
diff options
context:
space:
mode:
Diffstat (limited to 'sec-blueprint/08-Hardening.md')
-rw-r--r--sec-blueprint/08-Hardening.md597
1 files changed, 597 insertions, 0 deletions
diff --git a/sec-blueprint/08-Hardening.md b/sec-blueprint/08-Hardening.md
new file mode 100644
index 0000000..7a6077b
--- /dev/null
+++ b/sec-blueprint/08-Hardening.md
@@ -0,0 +1,597 @@
+Overview
+========
+
+Scope
+-----
+
+The information contained in this document is applicable to systems based
+on Automotive Grade Linux.
+
+Limitations
+-----------
+
+- This document is based on knowledge and research gained from looking
+ at security desktop and server versions of Linux as well as Android
+ exploits and hardening.
+
+- Some kernel configuration options can have an impact on performance.
+ This will be noted where applicable.­
+
+Document Structure
+------------------
+
+This document has been divided into three sections; REQUIREMENTS,
+RECOMMENDATIONS, and VALIDATION. The REQUIREMENTS section details
+explicit requirements that must be adhered to for the embedded
+device**.** The RECOMMENDATIONS section details best practices, and some
+recommended security settings for the embedded device. The third
+section, VALIDATION, provides reference scripts and test procedures that
+can be used to verify adherence with the REQUIREMENTS detailed in the
+first section of this guide.
+
+Hardening
+---------
+
+The term *Hardening* refers to the tools, techniques and processes
+required in order to reduce the attack surface on an embedded system,
+such as an embedded control unit (ECU) or other managed device. The
+target for all hardening activities is to prevent the execution of
+invalid binaries on the device, and to prevent copying of security
+related data from the device. There are three main areas of focus for
+hardening an embedded device:
+
+
+Requirements
+============
+
+ For the purposes of reference and explanation, we are providing guidance
+ on how to configure an embedded device that runs with a linux 3. 10.17
+ Linux kernel. These requirements must still be met by manufacturers that
+ opt to build using an alternative version of the Linux kernel.
+
+Kernel Hardening
+----------------
+
+ The following sub-sections contain information on various kernel
+ configuration options to enhance the security measures in the kernel
+ and also for applications compiled to take advantage of these security
+ features. Additionally, there are also configuration options that
+ close known vulnerable configuration options. Here’s a high level
+ summary of various kernel configurations that shall be required for
+ deployment.
+
+### Disable the serial console
+
+ The serial console should be disabled to prevent an attacker from
+ accessing this powerful interface.
+
+```
+ CONFIG_SERIAL_8250=n
+ CONFIG_SERIAL_8250_CONSOLE=n
+ CONFIG_SERIAL_CORE=n
+ CONFIG_SERIAL_CORE_CONSOLE=n
+```
+
+### Restrict access to kernel memory through device file
+
+ The /dev/kmem file in Linux systems is directly mapped to kernel
+ virtual memory. This can be disastrous if an attacker gains root
+ access, as the attacker would have direct access to kernel virtual
+ memory.
+
+ To disable the /dev/kmem file, which is very infrequently used by
+ applications, the following kernel option should be set in the
+ compile-time kernel configuration:
+
+```
+ CONFIG_DEVKMEM=n
+```
+
+ In case applications in userspace need /dev/kmem support, it should be
+ available only for authenticated applications.
+
+### Bake-in the kernel command-line
+
+ The kernel command-line is used to control many aspects of the booting
+ kernel, and is prone to tampering as they are passed in RAM with
+ little to no reverse validation on these parameters. To prevent this
+ type of attack, the kernel shall be configured to ignore command line
+ arguments, and use pre-configured (compile time) options instead.
+
+ Set the kernel command line in the CONFIG\_CMDLINE KConfig item and
+ then pass no arguments from the bootloader.
+
+```
+ CONFIG_CMDLINE_BOOL=y
+ CONFIG_CMDLINE=”<*insert kernel command line here*>”
+ CONFIG_CMDLINE_OVERRIDE=y
+```
+
+ It is recommended that any per-device settings (eg. MAC addresses,
+ serial numbers, etc.) be stored and accessed from read-only memory (or
+ files), and that any such parameters be verified (signature checking)
+ prior to their use.
+
+### Disable kernel debug symbols
+
+ Debug symbols should always be removed from production kernels as they
+ provide a lot of information to attackers.
+
+```
+ CONFIG_DEBUG_INFO=n
+```
+
+ These kernel debug symbols are enabled by other config items in the
+ kernel. Care should be taken to disable those also. If
+ CONFIG\_DEBUG\_INFO cannot be disabled then enabling
+ CONFIG\_DEBUG\_INFO\_REDUCED is second best.
+
+### Disable access to a kernel core dump
+
+ This kernel configuration disables access to a kernel core dump from
+ user space -- if enabled it gives attackers a useful view into kernel
+ memory.
+
+```
+ CONFIG_PROC_KCORE=n
+```
+
+### Disable KGDB
+
+ The Linux kernel supports KGDB over USB and console ports. These
+ mechanisms are controlled by the kgdbdbgp and kgdboc kernel
+ command-line parameters. It is important to ensure that no shipping
+ product contains a kernel with KGDB compiled-in.
+
+```
+ CONFIG_KGDB=n
+```
+
+### Disable Kprobes
+
+ Kprobes enables you to dynamically break into any kernel routine and
+ collect debugging and performance information non-disruptively. You
+ can trap at almost any kernel code address, specifying a handler
+ routine to be invoked when the breakpoint is hit.
+
+```
+ CONFIG_KPROBES=n
+```
+
+### Disable Tracing
+
+ FTrace enables the kernel to trace every kernel function. Providing kernel
+ trace functionality would assist an attacker in discovering attack vectors.
+
+```
+ CONFIG_FTRACE=n
+```
+
+### Disable Profiling
+
+ Profiling and OProfile enables profiling the whole system, include the kernel,
+ kernel modules, libraries, and applications.Providing profiling functionality
+ would assist an attacker in discovering attack vectors.
+
+```
+ CONFIG_OPROFILE=n
+ CONFIG_PROFILING=n
+```
+
+### Disable magic sysrq support
+
+ On a few architectures, you can access a powerful debugger interface
+ from the keyboard. The same powerful interface can be present on the
+ serial console – responding to serial break – of Linux on other
+ architectures. Disable to avoid potentially exposing this powerful
+ backdoor.
+
+```
+ CONFIG_MAGIC_SYSRQ=n
+```
+
+### Disable OOPS print on BUG()
+
+ The output from OOPS print can be helpful in Return Oriented
+ Programming (ROP) when trying to determine the effectives of an
+ exploit.
+
+```
+ CONFIG_DEBUG_BUGVERBOSE=n
+```
+
+### Disable kexec
+
+ This prevents someone who gets root from supplanting the kernel. This
+ can be used as a way to bypass signed kernels.
+
+```
+ CONFIG_KEXEC=n
+```
+
+### Disable kernel IP autoconfiguration
+
+ It is preferable to have IP configuration performed using a user-space
+ tool as these tend to have more validation. We do not want the network
+ interface coming up until the system has come up properly.
+
+```
+ CONFIG_IP_PNP=n
+```
+
+### Disable /proc/config.gz
+
+ It is extremely important to not expose the kernel configuration used
+ on a production device to a potential attacker. With access to the
+ kernel config, it could be possible for an attacker to build a custom
+ kernel for the device that may disable critical security features.
+
+```
+ CONFIG_IKCONFIG=n
+```
+
+### Disable swap
+
+ If not disabled, attackers can enable swap at runtime, add pressure to
+ the memory subsystem and then scour the pages written to swap for
+ useful information.
+
+```
+ CONFIG_SWAP=n
+```
+
+### Disable namespace support
+
+ Do not allow namespace support to prevent duplicates of dev nodes,
+ pids and mount points. This may be used in virtualization and
+ container solutions like LXC, so in some cases it cannot be disabled.
+
+```
+ CONFIG_NAMESPACES=n
+```
+
+### Disable NFS file system
+
+ While often enabled in development, when left enabled in production
+ builds this can be a very useful way for an attacker to get files onto
+ and off of an STB.
+
+```
+ CONFIG_NFSD=n
+ CONFIG_NFS_FS=n
+```
+
+### Disable support for binary formats other than ELF
+
+ This will make possible to plug wrapper-driven binary formats into
+ the kernel. It enables support for binary formats other than ELF. Providing
+ the ability to use alternate interpreters would assist an attacker in
+ discovering attack vectors
+
+```
+ CONFIG_BINFMT_MISC=n
+```
+
+### Disable “Load All Symbols”
+
+ There is a /proc/kallsyms file which exposes the kernel memory space
+ address of many kernel symbols (functions, variables, etc.). This
+ information is useful to attackers in identifying kernel
+ versions/configurations and in preparing payloads for exploits of
+ kernel space.
+
+ Both KALLSYMS\_ALL and KALLSYMS shall be disabled;
+
+```
+ CONFIG_KALLSYMS=n
+ CONFIG_KALLSYMS_ALL=n
+```
+
+### Disable Kernel Debugging
+
+ There are development-only branches of code in the kernel enabled by
+ the DEBUG\_KERNEL conf. This should be disabled to compile-out these
+ branches.
+
+```
+ CONFIG_DEBUG_KERNEL=n
+```
+
+ In some kernel versions, disabling this requires also disabling
+ CONFIG\_EMBEDDED, and CONFIG\_EXPERT Disabling CONFIG\_EXPERT makes it
+ impossible to disable \_COREDUMP, DEBUG\_BUGVERBOSE, \_NAMESPACES,
+ \_KALLSYMS and \_BUG. In which case it is better to leave this enabled
+ than enable the others.
+
+### Disable the kernel debug filesystem
+
+ The kernel debug filesystem presents a lot of useful information and
+ means of manipulation of the kernel to an attacker.
+
+```
+ CONFIG_DEBUG_FS=n
+```
+
+### Disable BUG() support
+
+ The kernel will display backtrace and register information for BUGs
+ and WARNs in kernel space, making it easier for attackers to develop
+ exploits.
+
+```
+ CONFIG_BUG=n
+```
+
+### Disable Sysctl syscall support
+
+ Enabling this will result in code being included that is hard to
+ maintain and not well tested.
+
+```
+ CONFIG_SYSCTL_SYSCALL=n
+```
+
+### Kernel Modules
+
+### Disable module unloading
+
+ This stops an attacker unloading security focused kernel modules. It
+ will also prevent the attacker from removing evidence of any attempted
+ kernel tampering that may have been initiated by loading of a kernel
+ module.
+
+```
+ CONFIG_MODULE_UNLOAD=n
+```
+
+### Disable Forced Module Loading
+
+ If enabled, then modules without version information or with
+ mismatched version information may be forcibly loaded into the kernel.
+ Disabling this configuration forces the attackers to build modules
+ with matched kernel sources and configuration in order to load them.
+
+```
+ CONFIG_MODULE_FORCE_LOAD=n
+```
+
+Recommendations
+===============
+
+The following sections detail best practices that should be applied in
+order to secure a device. Although they are not currently listed as hard
+requirements, they may be upgraded to requirements status in the future.
+
+
+
+Kernel Hardening
+----------------
+
+ The following sub-sections contain information on various kernel
+ configuration options that will require updating to a newer kernel
+ version in order to enhance the security measures in the kernel and
+ also for applications compiled to take advantage of these security
+ features.
+
+ Additionally, there are also configuration options that close known
+ vulnerable configuration options. Here’s a high level summary of the
+ various kernel configurations and which kernel version they pertain:
+
+| Kernel Configuration | Kernel Version |
+|---------------------------------------|----------------|
+| CONFIG\_CHECKPOINT\_RESTORE=n |3.3+ |
+| CONFIG\_UNIX\_DIAG=n |3.3+ |
+| CROSS\_MEMORY\_ATTACH=n |3.5+ |
+| CONFIG\_PANIC\_ON\_OOPS=y |3.5+ |
+| CONFIG\_COREDUMP=n |3.7+ |
+| CONFIG\_MODULE\_SIG\_FORCE=y |3.7+ |
+| CONFIG\_PACKET\_DIAG=n |3.7+ |
+| CONFIG\_FW\_LOADER\_USER\_HELPER=n |3.9+ |
+| CONFIG\_CC\_STACKPROTECTOR=y |3.11+ (MIPS) |
+| CONFIG\_USELIB=n |3.15+ |
+| BPF\_JIT=n |3.16+ (MIPS) |
+| CONFIG\_DEVMEM=n |4.0+ |
+
+### Build with Stack Protection
+
+ Similar to the stack protector used for ELF programs in user-space,
+ the kernel can protect its internal stacks as well. This configuration
+ for the MIPS architecture is supported in Linux 3.11 and greater and
+ thus should only be enabled for such versions. This configuration also
+ requires building the kernel with the gcc compiler 4.2 or greater.
+
+```
+ CONFIG_CC_STACKPROTECTOR=y
+```
+
+### Disable access to /dev/mem
+
+ The /dev/mem file in Linux systems is directly mapped to physical
+ memory. This can be disastrous if an attacker gains root access, as
+ the attacker would have direct access to physical memory through this
+ convenient device file. It may not always be possible to disable such
+ file, as some applications might need such support. In that case then
+ this device file should be available only for authenticated
+ applications. This configuration is supported in Linux 4.0 and greater
+ and thus should only be disabled for such versions.
+
+```
+ CONFIG_DEVMEM=n
+```
+
+### Disable cross-memory attach
+
+ Disable the process\_vm\_\*v syscalls which allow one process to
+ peek/poke the virtual memory of another. This configuration is
+ supported in Linux 3.5 and greater and thus should only be disabled
+ for such versions.
+```
+ CROSS_MEMORY_ATTACH=n
+```
+
+### Disable core dumps
+
+ Core dumps provide lot of debug information for hackers. So disabling
+ core dumps is recommended in production builds. This configuration is
+ supported in Linux 3.7 and greater and thus should only be disabled
+ for such versions.
+
+```
+ CONFIG_COREDUMP=n
+```
+
+### Disable Legacy Linux Support
+
+ There are some Kernel Configs which are present only to support legacy
+ binaries. See also section 2.2.2.18 for disabling support for legacy
+ binary formats. The uselib system call, in particular, has no valid
+ use in any libc6 or uclibc system in recent times. This configuration
+ is supported in Linux 3.15 and greater and thus should only be
+ disabled for such versions.
+
+```
+ CONFIG_USELIB=n
+```
+
+### Disable firmware auto-loading user mode helper
+
+ The firmware auto loading helper, which is a utility executed by the
+ kernel on hotplug events requiring firmware, needs to be set setuid.
+ As a result of this, the helper utility is an attractive target for
+ attackers with control of physical ports on the device. Disabling this
+ configuration is supported in Linux 3.9 and greater.
+
+```
+ CONFIG_FW_LOADER_USER_HELPER=n
+```
+
+### Enable Kernel Panic on OOPS
+
+ When fuzzing the kernel or attempting kernel exploits attackers are
+ likely to trigger kernel OOPSes. Setting the behavior on OOPS to PANIC
+ can impede their progress. This configuration is supported in Linux
+ 3.5 and greater and thus should only be enabled for such versions.
+
+```
+ CONFIG_PANIC_ON_OOPS=y
+```
+
+### Disable socket monitoring interface
+
+ These monitors can be used to inspect shared file descriptors on Unix
+ Domain sockets or traffic on ‘localhost’ which is otherwise assumed to
+ be confidential. The **CONFIG\_PACKET\_DIAG** configuration is
+ supported in Linux 3.7 and greater and thus should only be disabled
+ for such versions. The **CONFIG\_UNIX\_DIAG** configuration is
+ supported in Linux 3.3 and greater and thus should only be disabled
+ for such versions.
+
+```
+ CONFIG_PACKET_DIAG=n
+ CONFIG_UNIX_DIAG=n
+```
+
+### Disable BPF JIT
+
+ The BPF JIT can be used to create kernel-payloads from firewall table
+ rules. This configuration for the MIPS architecture is supported in
+ Linux 3.16 and greater and thus should only be disabled for such
+ versions.
+```
+ BPF_JIT=n
+```
+
+### Disable checkpoint/restore
+
+ The checkpoint/restore service can take a process, freeze it and
+ migrate it. This results in providing more info than a core dump. This
+ configuration is supported in Linux 3.3 and greater and thus should
+ only be disabled for such versions.
+
+```
+ CONFIG_CHECKPOINT_RESTORE=n
+```
+
+### Enable Enforced Module Signing
+
+ This configuration is supported in Linux 3.7 and greater and thus
+ should only be enabled for such versions.
+
+```
+ CONFIG_MODULE_SIG_FORCE=y
+```
+
+### Disable all USB, PCMCIA (and other hotplug bus) drivers that aren’t needed
+
+ To reduce the attack surface, the driver enumeration, probe, and
+ operation happen in the kernel. The driver data is parsed by the
+ kernel, so any logic bugs in these drivers can become kernel exploits.
+
+### Disable all file systems not needed
+
+ To reduce the attack surface; file system data is parsed by the kernel
+ so any logic bugs in file system drivers can become kernel exploits.
+
+### Kernel Address Display Restriction
+
+ When attackers try to develop "run anywhere" exploits for kernel
+ vulnerabilities, they frequently need to know the location of internal
+ kernel structures. By treating kernel addresses as sensitive
+ information, those locations are not visible to regular local users.
+
+ /proc/sys/kernel/kptr\_restrict is set to "1" to block the reporting
+ of known kernel address leaks.
+
+ Additionally, various files and directories should be readable only by
+ the root user: /boot/vmlinuz\*, /boot/System.map\*,
+ /sys/kernel/debug/, /proc/slabinfo
+
+### DMESG Restrictions
+
+ When attackers try to develop "run anywhere" exploits for
+ vulnerabilties, they frequently will use dmesg output. By treating
+ dmesg output as sensitive information, this output is not available to
+ the attacker.
+
+ /proc/sys/kernel/dmesg\_restrict can be set to "1" to treat dmesg
+ output as sensitive.
+
+### SELinux
+
+ If SELinux is in use on the embedded system, the following kernel
+ options should be enabled to prevent SELlinux from being disabled at
+ either runtime or boot time.
+
+```
+ CONFIG_SECURITY_SELINUX_DEVELOP=n
+ CONFIG_SECURITY_SELINUX_DISABLE=n
+ CONFIG_SECURITY_SELINUX_BOOTPARAM=n
+```
+
+
+Validation
+==========
+
+Image Security Analysis Framework (ISAFW)
+-----------------------------------------
+**meta-security-isafw** is an OE layer that allows enabling the Image
+Security Analysis Framework (isafw) for your image builds.
+
+The primary purpose of isafw is to provide an extensible
+framework for analysing different security aspects of images
+during the build process.
+
+The isafw project itself can be found at
+ https://github.com/01org/isafw
+
+This layer can be added to your builds to produce an analysis report,
+including a kernel config analysis.
+
+### Usage
+
+In order to enable the isafw during the image build, please add
+the following line to your build/conf/local.conf file:
+
+```python
+INHERIT += "isafw"
+```