OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
Whether network connected or standalone, firmware is the center of controlling any embedded
device. As such, it is crucial to understand how firmware can be manipulated to perform
unauthorized functions and potentially cripple the supporting ecosystem’s security. To get started
with performing security testing and reverse engineering of firmware, use the following
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 1/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
Stage Description
1. Information gathering and Acquire all relative technical and documentation details
reconnaissance pertaining to the target device's firmware
4. Extracting the filesystem Carve filesystem contents from the target firmware
The following sections will further detail each stage with supporting examples where applicable.
Consider visiting the OWASP Internet of Things Project page and GitHub repository for the latest
methodology updates and forthcoming project releases.
A preconfigured Ubuntu virtual machine (EmbedOS) with firmware testing tools used throughout
this document can be downloaded via the following link. Details regarding EmbedOS’ tools can be
found on GitHub within the following repository https://github.com/scriptingxss/EmbedOS.
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 2/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
During this stage, collect as much information about the target as possible to understand its overall
composition underlying technology. Attempt to gather the following:
The above listed information should be gathered prior to security testing fieldwork via a
questionnaire or intake form. Ensure to leverage internal product line development teams to acquire
accurate and up to date data. Understand applied security controls as well as roadmap items,
known security issues, and most concerning risks. If needed, schedule follow up deep dives on
particular features in question. Assessments are most successful within a collaborative
environment.
Where possible, acquire data using open source intelligence (OSINT) tools and techniques. If open
source software is used, download the repository and perform both manual as well as automated
static analysis against the code base. Sometimes, open source software projects already use free
static analysis tools provided by vendors that provide scan results such as Coverity Scan and
Semmle’s LGTM. For example, the screenshots below shows snippets of Das U-Boot’s Coverity Scan
results.
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 3/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 4/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 5/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 6/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
With the information at hand, a light threat model exercise should be performed mapping attack
surfaces and impact areas that show the most value in the event of compromise.
To begin reviewing firmware contents, the firmware image file must be acquired. Attempt to obtain
firmware contents using one or more of the following methods:
Google dork queries targeted towards binary file extensions and file sharing platforms such as
Dropbox, Box, and Google drive
It’s common to come across firmware images through customers who upload contents to
forums, blogs, or comment on sites where they contacted the manufacturer to
troubleshoot an issue and were given firmware via a zip or flash drive sent.
Man-in-the-middle (MITM) device communication during updates
*Download builds from exposed cloud provider storage locations such as Amazon Web
Services (AWS) S3 buckets
Extract directly from hardware via UART, JTAG, PICit, etc.
Sniff serial communication within hardware components for update server requests
Via a hardcoded endpoint within the mobile or thick applications
Dumping firmware from the bootloader (e.g. U-boot) to flash storage or over the network via
tftp
Removing the flash chip (e.g. SPI) or MCU from the board for offline analysis and data
extraction (LAST RESORT).
You will need a supported chip programmer for flash storage and/or the MCU.
*Note: Ensure to follow local laws and regulations when downloading data from exposed cloud
provider storage services.
Each of the listed methods vary in difficulty and should not be considered an exhaustive list. Select
the appropriate method according to the project objectives and rules of engagement. If possible,
request both a debug build and release build of firmware to maximize testing coverage use cases in
the event debug code or functionality is compiled within a release.
Once the firmware image is obtained, explore aspects of the file to identify its characteristics. Use
the following steps to analyze firmware file types, potential root filesystem metadata, and gain
additional understanding of the platform it's compiled for.
1 file <bin>
2 strings
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 8/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
If none of the above methods provide any useful data, the following is possible:
If the binary may be encrypted, check the entropy using binwalk with the following command:
$ binwalk -E <bin>
Alternate tools are also available using Binvis online and the standalone application.
Binvis
https://code.google.com/archive/p/binvis/
https://binvis.io/#/
This stage involves looking inside firmware and parsing relative filesystem data to start identifying
as many potential security issues as possible. Use the following steps to extract firmware contents
for review of uncompiled code and device configurations used in following stages. Both automated
and manual extractions methods are shown below.
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 9/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
Filesystem types: squashfs, ubifs, romfs, rootfs, jffs2, yaffs2, cramfs, initramfs
2a. Sometimes, binwalk will not have the magic byte of the filesystem in its signatures. In these
cases, use binwalk to find the offset of the filesystem and carve the compressed filesystem from
the binary and manually extract the filesystem according to its type using the steps below.
1 $ binwalk DIR850L_REVB.bin
2
3 DECIMAL HEXADECIMAL DESCRIPTION
4 -----------------------------------------------------------------------------
5
6 0 0x0 DLOB firmware header, boot partition: """"dev=/dev/mtdblock/1""""
7 10380 0x288C LZMA compressed data, properties: 0x5D, dictionary size: 8388608
8 1704052 0x1A0074 PackImg section delimiter tag, little endian size: 32256 byte
9 1704084 0x1A0094 Squashfs filesystem, little endian, version 4.0, compression:
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 10/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
$ unsquashfs dir.squashfs
$ jefferson rootfsfile.jffs2
$ ubidump.py <bin>
During this stage, clues are gathered for dynamic and runtime analysis stages. Investigate if the
target firmware contains the following (non-exhaustive):
Legacy insecure network daemons such as telnetd (sometimes manufactures rename binaries
to disguise )
Hardcoded credentials (usernames, passwords, API keys, SSH keys, and backdoor variants )
Hardcoded API endpoints and backend server details
Update server functionality that could be used as an entry point
Review uncompiled code and start up scripts for remote code execution
Extract compiled binaries to be used for offline analysis with a disassembler for future steps
Statically analyze filesystem contents and uncompiled code manually or leveraging automation
tools such as firmwalker that parse the following:
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 11/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
The following subsections introduce open source automated firmware analysis tools.
Firmwalker
Execute firmwalker within it’s directory in ~/tools/firmwalker and point firmwalker to the absolute
path of the extracted filesystem’s root directory. Firmwalker uses information in the "/data/”
directory for parsing rules. A custom fork modified by Aaron Guzman with additional checks can be
found on GitHub at https://github.com/scriptingxss/firmwalker. The following examples show the
usage of firmwalker used on OWASP’s IoTGoat. Additional vulnerable firmware projects are listed in
the Vulnerable firmware section at the end of the document.
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 12/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
Two files will be generated, firmwalker.txt and firmwalkerappsec.txt. These output files should be
manually reviewed.
Fortunately, multiple open source automated firmware analysis tools are available. FACT features
include the following:
Identification of software components such as operating system, CPU architecture, and third-
party components along with their associated version information
Extraction of firmware filesystem (s ) from images
Detection of certificates and private keys
Detection of weak implementations mapping to Common Weakness Enumeration (CWE)
Feed & signature-based detection of vulnerabilities
Basic static behavioral analysis
Comparison (diff) of firmware versions and files
User mode emulation of filesystem binaries using QEMU
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 13/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
Detection of binary mitigations such as NX, DEP, ASLR, stack canaries, RELRO, and
FORTIFY_SOURCE
REST API
and more...
Below are instructions for using firmware analysis comparison toolkit within the companion
preconfigured virtual machine.
Tip: It is recommended to run FACT with a computer that has 16 Cores 64GB RAM although the tool
can run with a minimum of 4 cores and 8GB of RAM at a much slower pace. Scan output results
vary on the allocated resources given to the virtual machine. The more resources, the faster FACT
will complete scan submissions.
1 $ cd ~/tools/FACT_core/
2 $ sudo ./start_all_installed_fact_components
Upload firmware components to FACT for analysis. In the screenshot below, the compressed
complete firmware with its root filesystem will be uploaded and analyzed.
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 14/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
Depending on the hardware resources given to FACT, the analysis results will appear with its scan
results upon a given time. This process can take hours if minimal resources are allocated.
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 15/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 16/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
Disassemble suspect target binaries with data gathered from FACT using IDA Pro, Ghidra, Hopper,
Capstone, or Binary Ninja. Analyze binaries for potential remote code execution system calls,
strings, function lists, memory corruption vulnerabilities, and identify Xrefs to system() or alike
function calls. Note potential vulnerabilities to use for upcoming steps.
The following screenshot shows the “shellback” binary disassembled using Ghidra.
PIE enabled
$ readelf -h <bin> | grep 'Type:[[:space:]]*DYN'
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 17/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
DSO
$ readelf -d <bin> | grep -q 'DEBUG'
Symbols
$ readelf --syms <bin>
$ nm <bin>
Recognizable strings
-el specifies little-endian characters 16-bits wide (e.g. UTF-16).
Useful for cross-referencing with a hex editor, or want to know where in the file your string
is.
strings -n5 <bin>
1 $ execstack bin/*
2
3 X bin/ash
4
5 X bin/busybox
Partial RELRO:
$ readelf -d binary | grep GNU_RELRO
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 18/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
A script that automates checking many of the above binary properties is checksec.sh. Below, are
two examples of using the script.
Figure : Checksec.sh
For Microsoft binaries (EXE & DLL), use PESecurity to check for ASLR, DEP, SafeSEH, StrongNaming,
Authenticode, Control Flow Guard, and HighEntropyVA.
Using details and clues identified in previous steps, firmware as well as it’s encapsulated binaries
must be emulated to verify potential vulnerabilities. To accomplish emulating firmware, there are a
few approaches listed below.
1. Partial emulation (user space) - Emulation of standalone binaries derived from a firmware's
extracted filesystem such as /usr/bin/shellback
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 19/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
2. Full system emulation - Emulation of the full firmware and start up configurations leveraging
fake NVRAM.
3. Emulation using a real device or virtual machine - At times, partial or full emulation may not
work due to a hardware or architecture dependencies. If the architecture and endianness match
a device owned such as a raspberry pie, the root filesystem or specific binary can be transferred
to the device for further testing. This method also applies to pre built virtual machines using the
same architecture and endianness as the target.
To begin partially emulating binaries, the CPU architecture and endianness must be known for
selecting the appropriate QEMU emulation binary in the following steps.
1 $ binwalk -Y <bin>
2 $ readelf -h <bin>
el - little endian
eb - big endian
Binwalk can be used identify endianness for packaged firmware binaries (not from binaries within
extracted firmware) using the command below.
1 $ binwalk -Y UPG_ipc8120p-w7-M20-hi3516c-20160328_165229.ov
2
3 DECIMAL HEXADECIMAL DESCRIPTION
4
5 ------------------------------------------------------------------------------
6
7 3480 0xD98 ARM executable code, 32-bit, little endian, at least 1154 valid ins
After the CPU architecture and endianness have been identified, locate the appropriate QEMU binary
to perform partial emulation (Not for emulating the full firmware, but binaries with the extracted
firmware.)
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 20/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
Typically, in:
/usr/local/qemu-arch or /usr/bin/qemu-arch
Copy the applicable QEMU binary into the extracted root filesystem. The second command shows
copying the static arm QEMU binary to the extracted root filesystem within a ZSH shell showing the
absolute path.
Execute the ARM binary (or appropriate arch) to emulate using QEMU and chroot with the following
command:
The following example shows Busybox emulated within a typical x64 architecture an attacker
machine is likely using.
In another terminal, check if the service is listening locally and try to connect to it with netcat.
Sometimes, requests are dispatched to the CGI binary by the HTTP server. By simply emulating the
CGI binary, it's possible to analyze the process procedure or verify the vulnerability without setting
up a HTTP server. The following example issues a GET request to a MIPS CGI binary.
1 ~/DIR850L/squashfs-root/htdocs/web$ ls -l captcha.cgi
2 lrwxrwxrwx 1 root root 14 Oct 17 2017 captcha.cgi -> /htdocs/cgibin
3
4 # fix the broken symbolic link
5 ~/DIR850L/squashfs-root/htdocs/web$ rm captcha.cgi && ln -s ../cgibin captcha.
6
7 ~/DIR850L/squashfs-root$ sudo chroot . ./qemu-mips-static -E REQUEST_METHOD="G
8 HTTP/1.1 200 OK
9 Content-Type: text/xml
10
11 <?xml version="1.0" encoding="utf-8"?><captcha>
12 <result>FAIL</result><message>NO SESSION</message>
13 </captcha>
With the target binary emulated, interact with its interpreter or listening service. Fuzz its application
and network interfaces as noted in the next phase.
Full-system Emulation
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 22/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
When possible, use automation tools such as firmadyne, firmware analysis toolkit, or ARM-X
Firmware Emulation Framework to perform full emulation of firmware. These tools are essentially
wrappers for QEMU and other environmental functions such as nvram.
https://github.com/attify/firmware-analysis-toolkit
https://github.com/therealsaumil/armx/
https://github.com/firmadyne/firmadyne
https://github.com/qilingframework/qiling#qltool
36 ██║ ██║██║███╗██║██╔══██║╚════██║██╔═══╝ / | { /
37 ╚██████╔╝╚███╔███╔╝██║ ██║███████║██║ / | { /
38 ╚═════╝ ╚══╝╚══╝ ╚═╝ ╚═╝╚══════╝╚═╝ ..-"``~"-' ; )
39 ╦┌─┐╔╦╗╔═╗┌─┐┌─┐┌┬┐ ;' `
40 ║│ │ ║ ║ ╦│ │├─┤ │ ;' `
41 ╩└─┘ ╩ ╚═╝└─┘┴ ┴ ┴ ;' `
42 ------------------------------------------------------------ ;'
43 GitHub: https://github.com/OWASP/IoTGoat
44 ------------------------------------------------------------
45 root@IoTGoat:/#
Note: Modifications to these tools may be required if the firmware contains an uncommon
compression, filesystem, or unsupported architecture.
In this stage, perform dynamic testing while a device is running in its normal or emulated
environment. Objectives in this stage may vary depending on the project and level of access given.
Typically, this involves tampering of bootloader configurations, web and API testing, fuzzing
(network and application services), as well as active scanning using various toolsets to acquire
elevated access (root) and/or code execution.
Burp Suite
OWASP ZAP
Commix
Fuzzers such as - American fuzzy loop (AFL)
Network and protocol fuzzers such as - Mutiny, boofuzz, and kitty.
Nmap
NCrack
Metasploit
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 24/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
Reference industry standard web methodologies such as OWASP’s Testing Guide and Application
Security Verification Standard (ASVS).
Specific areas to review within an embedded device’s web application are the following:
Depending on the product and its application interfaces, test cases will differ.
Bootloader testing
When modifying device start up and bootloaders such as U-boot, attempt the following:
Attempt to access the bootloaders interpreter shell by pressing "0", space or other identified
“magic codes” during boot.
Modify configurations to execute a shell command such as adding ' init=/bin/sh ' at the end
of boot arguments
#printenv
#saveenv
#boot
Setup a tftp server to load images over the network locally from your workstation. Ensure the
device has network access.
#setenv ipaddr 192.168.2.2 #local IP of the device
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 25/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
#saveenv
#reset
Use ubootwrite.py to write the uboot-image and push a modified firmware to gain root
Check for enabled debug features such as:
verbose logging
loading arbitrary kernels
booting from untrusted sources
*Use caution: Connect one pin to ground, watch device boot up sequence, before the kernel
decompresses, short/connect the grounded pin to a data pin (DO) on an SPI flash chip
*Use caution: Connect one pin to ground, watch device boot up sequence, before the kernel
decompresses, short/connect the grounded pin to pins 8 and 9 of the NAND flash chip at the
moment U-boot decompresses the UBI image
*Review the NAND flash chip’s datasheet prior to shorting pins
Configure a rogue DHCP server with malicious parameters as input for a device to ingest during
a PXE boot
Use Metasploit’s (MSF) DHCP auxiliary server and modify the ‘ FILENAME ’ parameter with
command injection commands such as ‘a";/bin/sh;#’ to test input validation for
device startup procedures.
Attempt to upload custom firmware and/or compiled binaries for integrity or signature verification
flaws. For example, compile a backdoor bind shell that starts upon boot using the following steps.
If a root shell has already been obtained from dynamic analysis, bootloader manipulation, or
hardware security testing means, attempt to execute precompiled malicious binaries such as
implants or reverse shells. Consider using automated payload/implant tools used for command and
control (C&C) frameworks. For example, Metasploit framework and ‘msfvenom’ can be leveraged
using the following steps.
3. Transfer the payload to the compromised device (e.g. Run a local webserver and wget/curl the
payload to the filesystem) and ensure the payload has execution permissions
4. Prepare Metasploit to handle incoming requests. For example, start Metasploit with
msfconsole and use the following settings according to the payload above: use
exploit/multi/handler,
set payload linux/armle/meterpreter_reverse_tcp
exploit -j -z
If possible, identify a vulnerability within startup scripts to obtain persistent access to a device
across reboots. Such vulnerabilities arise when startup scripts reference, symbolically link, or
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 27/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
depend on code located in untrusted mounted locations such as SD cards, and flash volumes used
for storage data outside of root filesystems.
Runtime analysis involves attaching to a running process or binary while a device is running in its
normal or emulated environment. Basic runtime analysis steps are provided below:
gdb-multiarch
Peda
Frida
ptrace
strace
IDA Pro
Ghidra
Binary Ninja
Hopper
After identifying a vulnerability within a binary from previous steps, a proper proof-of-concept (PoC)
is required to demonstrate the real-world impact and risk. Developing exploit code requires
programming experience in lower level languages (e.g. ASM, C/C++, shellcode, etc.) as well as
background within the particular target architecture (e.g. MIPS, ARM, x86 etc.). PoC code involves
obtaining arbitrary execution on a device or application by controlling an instruction in memory.
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 28/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
It is not common for binary runtime protections (e.g. NX, DEP, ASLR, etc.) to be in place within
embedded systems however when this happens, additional techniques may be required such as
return oriented programming (ROP). ROP allows an attacker to implement arbitrary malicious
functionality by chaining existing code in the target process/binary's code known as gadgets. Steps
will need to be taken to exploit an identified vulnerability such as a buffer overflow by forming a ROP
chain. A tool that can be useful for situations like these is Capstone's gadget finder or ROPGadget-
https://github.com/JonathanSalwan/ROPgadget.
https://azeria-labs.com/writing-arm-shellcode/
https://www.corelan.be/index.php/category/security/exploit-writing-tutorials/
A combination of tools will be used throughout assessing firmware. Listed below, are commonly
used tools.
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 29/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
Vulnerable firmware
To practice discovering vulnerabilities in firmware, use the following vulnerable firmware projects as
a starting point.
OWASP IoTGoat
https://github.com/OWASP/IoTGoat
The Damn Vulnerable Router Firmware Project
https://github.com/praetorian-code/DVRF
Damn Vulnerable ARM Router (DVAR)
https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html
ARM-X
https://github.com/therealsaumil/armx#downloads
Azeria Labs VM 2.0
https://azeria-labs.com/lab-vm-2-0/
Damn Vulnerable IoT Device (DVID)
https://github.com/Vulcainreo/DVID
If you would like to contribute or provide feedback to improve this methodology, contact
[email protected] (@scriptingxss). Make sure to open up an issue or a pull request, and
we'll make sure to tend to it!
Special thanks to our sponsors Cisco Meraki, OWASP Inland Empire, and OWASP Los Angeles as
well as José Alejandro Rivas Vidal for his careful review.
License
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 30/31
7/27/2021 OWASP Firmware Security Testing Methodology - Firmware Security Testing Methodology
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/ 31/31