diff options
Diffstat (limited to 'sec-blueprint/07-system-hardening.md')
-rw-r--r-- | sec-blueprint/07-system-hardening.md | 1250 |
1 files changed, 0 insertions, 1250 deletions
diff --git a/sec-blueprint/07-system-hardening.md b/sec-blueprint/07-system-hardening.md deleted file mode 100644 index 5ffe501..0000000 --- a/sec-blueprint/07-system-hardening.md +++ /dev/null @@ -1,1250 +0,0 @@ ---- - -title : System Hardening -date : 2017-05-23 -categories: security, hardening, automotive -tags: security, hardening, architecture, automotive, linux -layout: techdoc - ---- - -**Table of Content** - -1. TOC -{:toc} - -# Overview - -## Scope - -This document provides recommended guidelines for adding protection to an -embedded system. 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: - -**Boot Hardening**: Steps/requirements to configure the boot sequence, -in order to restrict the device from executing anything other than the -approved software image. - -**System Hardening**: Best practices associated with the configuration -of an embedded Linux based operating system. This section includes both -hardening of the kernel itself, as well as specific configurations and -patches used to protect against known vulnerabilities within the build -and configuration of the root filesystem. - -**Application Hardening:** Best practices to apply to the build and -release of user space applications, in order to reduce the number of -attack surfaces used by potential attackers. - -## Secure Boot Software Flow Steps - -1. After power on, the processor will perform the verification - of the Stage 1 boot image, the stage 2 boot image and the Secure - loader image. - - a. If any of the images fail the verification process the device - will not boot. - -2. Upon successful verification of all of the boot and loader images, - the secure process will initiate the Stage 1 boot process. - -3. The Stage 1 boot process will perform processor initialization, and - then initiate the Stage 2 boot process. - -4. The Stage 2 boot process will initiate the Secure Loader, which will - process any customer specific customizations (e.g. front panel - of ECU, USB based image updates, etc). - -5. The Secure Loader will check to determine if there are any updates - to be processed. If the update settings indicate that an upgrade - should occur then the Secure Loader will will determine the correct - action based on the nature of the upgrades: - - a. If the Secure Loader determines that an upgrade was performed - (or attempted), it will initiate the reboot process. - - b. If no upgrades were processed: then the Secure Loader will pass - control back to the Stage 2 boot process for further processing - -6. The Stage 2 boot process will continue with the boot process, by - performing a verification of the kernel image prior to the load of - that image - - a. If the kernel image verification fails, the Stage 2 boot loader - will not boot - -8. The Stage 2 boot loader will load the successfully verified kernel - and boot the linux OS - -9. The booted Linux OS will perform the normal Linux init sequence - -10. The Linux init process will start the required applications and - services as described in the init process and present on the rootfs. - -# Requirements - - For the purposes of reference and explanation, we are providing guidance - on how to configure an embedded device that runs with a 3.10.17 - Linux kernel, and includes the use of U-Boot as the *Stage 2* - These requirements must still be met by manufacturers that - opt to build using an alternative version of the Linux kernel. - -## Hardened Boot - -### Boot image selection - -The boot process shall be uninterruptable and shall irrevocably boot the -image as specified in the boot environment. - -In U-Boot set the “**bootdelay**” environment variable and/or define -CONFIG\_BOOTDELAY to -2. - -### Verifying Authenticity of booting image - -It shall not be possible to boot from an unverified image. - -The secure boot feature in U-Boot shall be enabled. The secure boot -feature is available from U-Boot 2013.07 version. - -To enable the secure boot feature, enable the following features: - -``` -CONFIG_FIT: enables support for Flat Image Tree (FIT) uImage format. -CONFIG_FIT_SIGNATURE: enables signature verification of FIT images. -CONFIG_RSA: enables RSA algorithm used for FIT image verifitcation. -CONFIG_OF_CONTROL: enables Flattened Device Tree (FDT) configuration. -CONFIG_OF_SEPARATE: enables separate build of u-Boot from the device tree. -CONFIG_DEFAULT_DEVICE_TREE: specifies the default Device Tree used for the -run-time configuration of U-Boot. -``` - -Generate the U-Boot image with public keys to validate and load the -image. It shall use RSA2048 and SHA256 for authentication. - -### Disable USB support - -To disable USB support in U-Boot, following configs shall not be -defined: - -``` -CONFIG_CMD_USB: enables basic USB support and the usb command -CONFIG_USB_UHCI: defines the lowlevel part. -CONFIG_USB_KEYBOARD: enables the USB Keyboard -CONFIG_USB_STORAGE: enables the USB storage devices -CONFIG_USB_HOST_ETHER: enables USB ethernet adapter support -``` - -### Console / Remote Access - -Serial console output shall be disabled. To disable console output in -U-Boot, set the following macros: - -``` -CONFIG_SILENT_CONSOLE -CONFIG_SYS_DEVICE_NULLDEV -CONFIG_SILENT_CONSOLE_UPDATE_ON_RELOC -``` - -and set “***silent”*** environment variable. - -For the Secure loader, disable the traces by undefining the below macro - -``` -INC_DEBUG_PRINT -``` - -For sboot proper configuration needs to be done to disable the serial -console. - -### Field upgrades - -Field upgrades can be achieved securely by using a Secure Loader. -This loader will authenticate an incoming image (USB,Serial, Network) -prior to writing it to the flash memory on the device. It should not be -possible to write to flash from bootloader (U-Boot). Note that because - USB support is to be disabled within the sboot/U-Boot code, the board -specific implementation of the Secure Loader will have to manage the -entire USB initialization, enumeration, and read/write access to the -mass storage device. - -### Disable USB, Serial, Docsis support - -Disable USB support in sboot. In addition, disable unnecessary communication -modes like Ethernet, Serial ports, DOCSIS in U-Boot and sboot that are -not necessary. - -### Immutable Environment variables - -In U-Boot, ensure Kernel command line, boot commands, boot delay and -other environment variables are immutable. This will prevent -side-loading of alternate images, by restricting the boot selection to -only the image in FLASH. - -The environment variables shall be part of text region in U-Boot as -default environment variable and not in non-volatile memory. - -Remove configuration options related to non-volatile memory such as: - -``` -#define CONFIG_ENV_IS_IN_MMC -#define CONFIG_ENV_IS_IN_EEPROM -#define CONFIG_ENV_IS_IN_FLASH -#define CONFIG_ENV_IS_IN_DATAFLASH -#define CONFIG_ENV_IS_IN_MMC -#define CONFIG_ENV_IS_IN_FAT -#define CONFIG_ENV_IS_IN_NAND -#define CONFIG_ENV_IS_IN_NVRAM -#define CONFIG_ENV_IS_IN_ONENAND -#define CONFIG_ENV_IS_IN_SPI_FLASH -#define CONFIG_ENV_IS_IN_REMOTE -#define CONFIG_ENV_IS_IN_UBI -``` - -and include the following definition: - -``` -#define** CONFIG_ENV_IS_NOWHERE -``` - -## 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. - -```bash - 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. - -```bash - 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. - -```bash - 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. - -```bash - 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. - -```bash - 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. - -```bash - 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. - -```bash - 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. - -```bash - 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. - -```bash - 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 effectiveness of an - exploit. - -```bash - 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. - -```bash - 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. - -```bash - 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. - -```bash - 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. - -```bash - CONFIG_SWAP=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. - -```bash - 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 - -```bash - 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; - -```bash - 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. - -```bash - 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. - -```bash - 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. - -```bash - CONFIG_BUG=n -``` - -### Disable Sysctl syscall support - - Enabling this will result in code being included that is hard to - maintain and not well tested. - -```bash - 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. - -```bash - 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. - -```bash - CONFIG_MODULE_FORCE_LOAD=n -``` -### System Services - -#### Console & Remote Access - -- The kernel console interfaces shall be disabled. Do not pass any statements - of the following kind (e.g. console=ttyS0 console=tty0) on the kernel - command line. All of the console=<interface> statements should be - stripped and removed from the kernel command line. - -- The telnet server shall be disabled. - -- Do not start telnetd in init scripts. - -- Remove telnetd from the root file system. - -- Root login access via the console shall be disabled. - -- Do not run shell or getty on /dev/ttySx or /dev/console from - init scripts. - -- Root login access through remote access such as SSH shall - be disabled or completely removed - -#### Disable *sudo* for other users - - Remove the /etc/sudoers file from the root file system - - Remove the sudo command from the root file system. - -#### Mount /tmp file system as noexec - - A lot of malware can be stopped by not allowing files located in /tmp - to execute. - - The /etc/fstab file should contain a line for the /tmp directory with - the noexec mount option set as follows: - - tmpfs /tmp tmpfs noexec 0 0 - -#### User Account Management - - All user accounts shall have strong, non-default passwords. A strong - password is described to have all of the following attributes: - -- At least one upper-case letter - -- At least one numeric character - -- At least one lower-case letter - -- Password shall be eight or more characters in length - -- Shall not use a known, common pattern (e.g. Xxxxxxx\# - or Xxxxxxx\#\#) - -#### Remove known insecure services - - The following legacy services are inherently insecure and should be - avoided: - -- rlogind - -- rshd - -- rcmd - -- rexecd - -- rbootd - -- rquotad - -- rstatd - -- rusersd - -- rwalld - -- rhosts - -- rexd - - These services offer insufficient authentication, no encryption, and - are not considered secure. They shall be removed along with their - configuration files. - -### The mtd-utils shall not be present on the file system - - The mtd-utils binary package (also known as the Memory Technology - Device Utilities package) contains a collection of executable binaries - that allow a user to perform operations on raw flash devices. Here’s a - non-exhaustive sample of commonly used utilities that are part of the - mtd-utils package: - -- flash\_erase - -- flash\_eraseall - -- flashcp - -- flash\_lock - -- flash\_otp\_dump - -- flash\_otp\_info - -- flash\_unlock - -- mkfs.jffs2 - -- mkfs.ubifs - -- nanddump - -- nandtest - -- nandwrite - -- ubiattach - -- ubicrc32 - -- ubidetach - -- ubiformat - -- ubimkvol - -- ubinfo - -- ubinize - -- ubirename - -- ubirmvol - -- ubirsvol - -- ubiupdatevol - - The mtd-utils package as a whole (including all of its executable - binaries) shall not be present on the file system. Including these - binaries on the file system will facilitate an attacker’s ability to - read, write or otherwise gather information about raw flash devices - present on the system. - -### Debuggers shall not be present on the file system - - No debuggers shall be present on the file system. This includes, but - is not limited to, the GNU Debugger client/server (commonly known in - their short form names such as the gdb and gdbserver executable - binaries respectively), or the LLDB next generation debugger. - Including these binaries as part of the file system will facilitate an - attacker’s ability to reverse engineer and debug (either locally or - remotely) any process that is currently executing on the device. - -### Partition Mount Options - - There are several security restrictions that can be set on a - filesystem when it is mounted. Some common security options include, - but are not limited to: - - nosuid - Do not allow set-user-identifier or set-group-identifier bits - to take effect - - nodev - Do not interpret character or block special devices on the - filesystem - - noexec - Do not allow execution of any binaries on the mounted - filesystem - - ro - Mount filesystem as read-only - - The following flags shall be used for mounting common filesystems: - - -| Partition | Notes | -|------------------------------|---------------------------------------------------------------------------------------------| -| /boot | Use nosuid and nodev and consider using noexec. | -| /var & /tmp | In the /etc/fstab or vfstab file, add nosuid, nodev and noexec. | -| Non-Root local partitions | If the filesystem type is ext2 or ext3 and the mount point is not '/', add the nodev option.| -| Removable storage partitions | Add nodev, nosuid, and noexec options. | -| Temporary storage partitions | Add nodev, nosuid, and noexec options. | -| /dev/shm | Add nodev, nosuid, and noexec options. | -| /dev | Add nosuid, noexec options.\ | -| | Note: if CONFIG\_DEVTMPFS\_MOUNT is set then the kernel will mount /dev and will not apply | -| | the nosuid, noexec options. Either disable CONFIG\_DEVTMPFS\_MOUNT or add a remount with | -| | noexec and nosuid options to system startup. | - - -# 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. -In addition, specific operators may change some of these recommendations -into requirements based on their specific needs and objectives. - -## Hardened Boot - -The boot loader consists of the Primary boot loader residing in OTP -memory, sboot, U-Boot and Secure loader residing in external flash (NAND -or SPI/NOR flash memory). The CPU on power on or reset executes the -primary boot loader. The OTP primary boot loader makes the necessary -initial system configuration and then loads the secondary boot loader -sboot from external flash memory to ram memory. The sboot then loads the -U-Boot along with the Secure loader. U-Boot then verifies and loads the -Kernel/system image before passing control to it. - -### Removal of memory dump commands - -In U-Boot, following commands shall be disabled to avoid memory dumps - -``` -md : Memory Display command - -mm : Memory modify command – auto incrementing address - -nm : Memory modify command – constant address - -mw : memory write - -cp : memory copy - -mwc : memory write cyclic - -mdc : memory display cyclic - -mtest : simple ram read/write test - -loopw : infinite write loop on address range -``` - -Similarly memory dump support shall be disabled from sboot - -### Disable flash access - -In U-Boot following flash memory commands shall be disabled: - -Nand: Support for nand flash access available through **do\_nand** has -to be disabled. - -Similarly sboot should disable flash access support through command line -if any. - -## Hardened System - -### Network - -#### Disable all Network Interfaces - - Preferably no network interface is allowed, but if required, then the - enabled services should be restricted to only those described in the - STB’s functional description. - -### Remove or Disable Unnecessary Services, Ports, and Devices. - - Services and utilities that do not have a defined purpose on a system - should be removed. If removal is not possible, but the service or - utility can be disabled, then it should be disabled. If a service or - utility is necessary, available secure configuration best practices - should be implemented. - - Telnet, FTP, and NFS have security weaknesses that are well known; - however, customers may have requirements to use these services. If - remote shell access and file transfer are required, then provide more - secure options, such as SSH and SFTP/SCP. - -### Restrict USB Ports - - Linux Kernel support for USB should be compiled-out if not required. - If it is needed, the Linux Kernel should be configured to only enable - the minimum required USB devices. - - User-initiated USB-filesystems should be treated with special care.. - - Whether or not the filesystems are mounted in userspace(FUSE), restricted - mount options should be observed. - -## 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\_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+ | -| CONFIG\_USELIB=n |3.15+ | -| BPF\_JIT=n |3.16+ | -| 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 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. - -```bash - 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. - -```bash - 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. -```bash - 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. - -```bash - 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. - -```bash - 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. - -```bash - 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. - -```bash - 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. - -```bash - 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 is supported in - Linux 3.16 and greater and thus should only be disabled for such - versions. - -```bash - BPF_JIT=n -``` - -### Enable Enforced Module Signing - - This configuration is supported in Linux 3.7 and greater and thus - should only be enabled for such versions. - -```bash - 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. - -Enable the below compiler and linker options when building user-space -applications to avoid stack smashing, buffer overflow attacks. - -### Stack Smashing Attacks - - **-fstack-protector-all** - - Emit extra code to check for buffer overflows, such as stack smashing - attacks - -### Position Independent Executables - - **-pie –fpic** - - Produce a position independent executable on targets which supports - it. - -### Detect Buffer Overflows - - **-D\_FORTIFY\_SOURCE=2** - - Helps detect some buffer overflow errors. - -### Prevent Overwrite Attacks - - **–z,relro** - - This linking option helps during program load, several ELF memory - sections need to be written by the linker, but can be turned read-only - before turning over control to the program. This prevents some Global - Offset Table GOT overwrite attacks, or in the dtors section of the ELF - binary. - - **-z,now** - -During program load, all dynamic symbols are resolved, allowing for the -complete GOT to be marked read-only (due to -z relro above). This -prevents GOT overwrite attacks. For very large application, this can -incur some performance loss during initial load while symbols are -resolved, but this shouldn't be an issue for daemons. - -### Library linking - - **–static** - -It is recommended that dynamic linking should not be allowed. This will -avoid user from replacing a library with malicious library. All libraries -should be linked statically. - -## Removal or Non-Inclusion of Utilities - -Table below lists utilities that are typically present in an embedded -device, along with the normal path of each utility. The table has -information about whether a utility shall be included or excluded from -respective environment. The values “INCLUDE” here means to include the -utility in the environment and “EXCLUDE” means to exclude it from the -respective environment. - -| **Utility Name** | **Location** | **Debug Environment** | **Production Environment** | -|-------------------|-------------------------------------------|------------------------|------------------------------| -| Strace | /bin/trace | INCLUDE | EXCLUDE | -| Klogd | /sbin/klogd | INCLUDE | EXCLUDE | -| Syslogd(logger) | /bin/logger | INCLUDE | EXCLUDE | -| Gdbserver | /bin/gdbserver | INCLUDE | EXCLUDE | -| Dropbear | Remove “dropbear” from ‘/etc/init.d/rcs’ | EXCLUDE | EXCLUDE | -| SSH | NA | INCLUDE | EXCLUDE | -| Editors (vi) | /bin/vi | INCLUDE | EXCLUDE | -| Dmesg | /bin/dmesg | INCLUDE | EXCLUDE | -| UART | /proc/tty/driver/ | INCLUDE | EXCLUDE | -| Hexdump | /bin/hexdump | INCLUDE | EXCLUDE | -| Dnsdomainname | /bin/dnsdomainname | EXCLUDE | EXCLUDE | -| Hostname | /bin/hostname | INCLUDE | EXCLUDE | -| Pmap | /bin/pmap | INCLUDE | EXCLUDE | -| su | /bin/su | INCLUDE | EXCLUDE | -| Which | /bin/which | INCLUDE | EXCLUDE | -| Who and whoami | /bin/whoami | INCLUDE | EXCLUDE | -| ps | /bin/ps | INCLUDE | EXCLUDE | -| lsmod | /sbin/lsmod | INCLUDE | EXCLUDE | -| install | /bin/install | INCLUDE | EXCLUDE | -| logger | /bin/logger | INCLUDE | EXCLUDE | -| ps | /bin/ps | INCLUDE | EXCLUDE | -| rpm | /bin/rpm | INCLUDE | EXCLUDE | -| Iostat | /bin/iostat | INCLUDE | EXCLUDE | -| find | /bin/find | INCLUDE | EXCLUDE | -| Chgrp | /bin/chgrp | INCLUDE | EXCLUDE | -| Chmod | /bin/chmod | INCLUDE | EXCLUDE | -| Chown | /bin/chown | INCLUDE | EXCLUDE | -| killall | /bin/killall | INCLUDE | EXCLUDE | -| top | /bin/top | INCLUDE | EXCLUDE | -| stbhotplug | /sbin/stbhotplug | INCLUDE | EXCLUDE | - -Note: The following Unix/Linux utilities shall be permitted as they are -often used in the start-up scripts and for USB logging. If any of these -utilities are not required by the device then those should be removed. - - **sed, awk, cut, df, dmesg, echo, fdisk, grep, mkdir, mount (vfat), - printf, tail, tee, test (directory), test (file)** - -## Root Access - -The main applications, those that provide the principal functionality of -the embedded device, **should not execute** with root identity or any -capability. - -If the main application are allowed to execute at any capability, -then the entire system is at the mercy of the said application’s good -behaviour. Problems arise when an application is compromised and able to -execute commands which could consistently and persistently compromise -the system by implanting rogue applications. - -It is suggested that the middleware and the UI should run in a context -on a user with no capability and all persistent resources should be -maintained without any capability. - -One way to ensure this is by implementing a server-client paradigm. -Services provided by the system’s drivers can be shared this way. The -other advantage of this approach is that multiple applications can share -the same resources at the same time. - -Root access **should not be allowed** for the following utilities: - -``` - login - su - ssh - scp - sftp -``` - -Root access **should not be allowed** for the console device. The -development environment should allow users to login with pre-created -user accounts. - -Switching to elevated privileges shall be allowed in the development -environment via sudo. - -## Network Hardening - -### Disable IPv4 Forwarding - - The net.ipv4.ip\_forward sysctl setting controls if IP forwarding is - allowed or not on the System. Unless the system is used as a router or - gateway, IPv4 forwarding should be disabled. - -### Disable IP Source Routing - - Disable IP source routing on all interfaces through the - net.ipv4.conf.\*.accept\_source\_route = 0 setting. - - IP source routing would allow a remote user (the sender) to specify - the route that the packet should take, rather than use the (default) - routing tables used by the routers between the sender and the - destination. This could be used to spoof IP addresses and still get - the replies (rather than sending the replies to the real owner of the - IP address). - -### Disable ICMP - - Use of ICMP, especially ping, shall be avoided. This is a common way - of gaining access to a system. - -#### Disable ICMP Redirects - - Set net.ipv4.conf.\*.accept\_redirects=0 to disable ICMP redirect - support on the interfaces. - - ICMP redirect messages are used by routers to inform hosts to use a - different gateway than the one used. These packets should only be sent - by the gateway of the system. In managed and embedded devices the - gateway is controlled and any changes should be controlled. - - Allowing ICMP redirect messages would allow for "remote" updating of - the routing table, which could allow an attacker to get all packets - sent to the outside first rather than the packets immediately going to - the real gateway. - -#### Ignore ICMP Echo Broadcasts - - When net.ipv4.icmp\_echo\_ignore\_broadcasts=1 is set, then your - system will not reply to broadcast “ping” requests. - -#### Ignore ICMP Bogus Error Responses - - When an invalid response is given to broadcast frames (which occurs - sometimes in erroneous routers), the Linux kernel will by default log - this event. These can be disabled by setting - throughnet.ipv4.icmp\_ignore\_bogus\_error\_responses to 1. - -### Ignore all broadcast message - - All the IP packets that come on the address “255.255.255.255” shall be - ignored. This can be done through the iptables rules. - -### Disable IPV6 - - If there are no plans of using IPV6, it is a good practice to disable - this support as it will reduce the size of the kernel TCP/IP stack. - -### Enable TCP SYN Cookie Protection - - One way of denial of service (DoS) attack against a service would be - to flood the server with SYNrequests (the TCP packet that starts a - handshake for a connection). Such a flood can lead to a service - disruption as the connection state handling will consume significant - resources. - - By enabling net.ipv4.tcp\_syncookies, the Linux kernel will change its - handshake behavior when its SYN backlog queue overflows: it replies to - SYN requests with the appropriate SYN+ACK reply, but it does not store - the connection in its backlog queue. - - -# Validation - -## Hardened System - -### 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" -``` |