Table of Content
- Document Structure
- Secure Boot Software Flow Steps
- Hardened Boot
- Kernel Hardening
- Disable the serial console
- Restrict access to kernel memory through device file
- Bake-in the kernel command-line
- Disable kernel debug symbols
- Disable access to a kernel core dump
- Disable KGDB
- Disable Kprobes
- Disable Tracing
- Disable Profiling
- Disable magic sysrq support
- Disable OOPS print on BUG()
- Disable kexec
- Disable kernel IP autoconfiguration
- Disable /proc/config.gz
- Disable swap
- Disable NFS file system
- Disable support for binary formats other than ELF
- Disable “Load All Symbols”
- Disable Kernel Debugging
- Disable the kernel debug filesystem
- Disable BUG() support
- Disable Sysctl syscall support
- Kernel Modules
- Disable module unloading
- Disable Forced Module Loading
- The mtd-utils shall not be present on the file system
- Debuggers shall not be present on the file system
- Partition Mount Options
- Hardened Boot
- Hardened System
- Kernel Hardening
- Build with Stack Protection
- Disable access to /dev/mem
- Disable cross-memory attach
- Disable core dumps
- Disable Legacy Linux Support
- Disable firmware auto-loading user mode helper
- Enable Kernel Panic on OOPS
- Disable socket monitoring interface
- Disable BPF JIT
- Enable Enforced Module Signing
- Disable all USB, PCMCIA (and other hotplug bus) drivers that aren’t needed
- Disable all file systems not needed
- Kernel Address Display Restriction
- DMESG Restrictions
- Stack Smashing Attacks
- Position Independent Executables
- Detect Buffer Overflows
- Prevent Overwrite Attacks
- Library linking
- Removal or Non-Inclusion of Utilities
- Root Access
- Network Hardening
- Hardened System
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.
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.
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
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.
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
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.
Upon successful verification of all of the boot and loader images, the secure process will initiate the Stage 1 boot process.
The Stage 1 boot process will perform processor initialization, and then initiate the Stage 2 boot process.
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).
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
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
The Stage 2 boot loader will load the successfully verified kernel and boot the linux OS
The booted Linux OS will perform the normal Linux init sequence
The Linux init process will start the required applications and services as described in the init process and present on the rootfs.
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.
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
For sboot proper configuration needs to be done to disable the serial console.
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:
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
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
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:
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.
These kernel debug symbols are enabled by other config items in the
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.
The Linux kernel supports KGDB over USB and console ports. These
mechanisms are controlled by the kgdbdbgp and kgdboc kernel
It is important to ensure that no shipping product contains a kernel with KGDB compiled-in.
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.
FTrace enables the kernel to trace every kernel function.
Providing kernel trace functionality would assist an attacker in discovering attack vectors.
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.
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.
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.
This prevents someone who gets root from supplanting the kernel.
This can be used as a way to bypass signed kernels.
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.
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.
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.
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.
Disable support for binary formats other than ELF
This will make possible to plug wrapper-driven binary formats into
It enables support for binary formats other than ELF.
Providing the ability to use alternate interpreters would assist an attacker in discovering attack vectors
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;
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.
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.
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.
Disable Sysctl syscall support
Enabling this will result in code being included that is hard to maintain and not well tested.
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.
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.
### 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:
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:
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:
|/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.|
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.
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.
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.
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|
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.
Disable access to /dev/mem
The /dev/mem file in Linux systems is directly mapped to physical
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.
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.
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.
Disable Legacy Linux Support
There are some Kernel Configs which are present only to support legacy
See also section 22.214.171.124 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.
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.
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.
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
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.
Disable BPF JIT
The BPF JIT can be used to create kernel-payloads from firewall table
This configuration for is supported in Linux 3.16 and greater and thus should only be disabled for such versions.
Enable Enforced Module Signing
This configuration is supported in Linux 3.7 and greater and thus should only be enabled for such versions.
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
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
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
Emit extra code to check for buffer overflows, such as stack smashing attacks
Position Independent Executables
Produce a position independent executable on targets which supports it.
Detect Buffer Overflows
Helps detect some buffer overflow errors.
Prevent Overwrite Attacks
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.
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.
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|
|Dropbear||Remove “dropbear” from ‘/etc/init.d/rcs’||EXCLUDE||EXCLUDE|
|Who and whoami||/bin/whoami||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)
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.
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).
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.
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.
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.
In order to enable the isafw during the image build, please add the following line to your build/conf/local.conf file:
INHERIT += "isafw"