Case Study

Cracking the Drone Controller — When Firmware Becomes the Weak Link

> root@re-bench:~# binwalk -e controller_fw_v04.12.03.bin && strings squashfs-root/usr/bin/link_mgr | grep -i 'pass\|key\|token'<span class="cursor-blink">_</span>_

Peter Bassill 2 December 2025 17 min read
penetration-testing firmware-analysis reverse-engineering from-the-hacker-desk uav-security supply-chain embedded-systems drone-controller

We stopped looking at the aircraft. We started reading the controller's mind.

Over the past three months, we have examined drones from every angle — hijacking control links, harvesting accumulated intelligence, and spoofing the satellite signals they navigate by. Each of those articles targeted the aircraft or the signal environment around it.

This month, we turn to the device in the pilot's hands.

The handheld controller is the component that everybody touches and nobody questions. It is powered on, paired with the aircraft, and used to fly. It connects to the pilot's mobile device. It connects to the manufacturer's servers to download firmware updates. It stores authentication tokens, pairing keys, and configuration data. It runs an embedded operating system with services, libraries, and binaries — a complete computing platform held in two hands.

On this engagement, we did not fly anything. We did not transmit any radio signals. We did not connect to any network. We took the controller to a bench, extracted its firmware, and read what was inside. What we found raises questions not just about this controller, but about the firmware supply chain that underpins the entire commercial drone ecosystem.


The Engagement Brief

The client was a critical infrastructure operator — an energy company that used commercial drones for inspection of transmission towers, substations, and solar installations. Their fleet of six drones and four controllers was managed by an in-house aviation team. Following our previous drone security work — which had gained attention within the industry — the client engaged us to conduct a firmware security assessment of their drone controller hardware.

The scope was deliberately narrow: the controller unit only. No aircraft, no radio links, no flight operations. The assessment was a pure reverse engineering exercise — firmware extraction, static analysis, and identification of security-relevant findings within the firmware image. The client provided two controllers: one current production unit and one retired unit for destructive analysis if required.

The controller was a current-generation model from a major commercial drone manufacturer. It ran an embedded Linux operating system on an ARM processor, with integrated display, physical controls, radio transceiver, and Wi-Fi and Bluetooth interfaces. It retailed for approximately twelve hundred pounds.


Firmware Extraction

Firmware extraction is the process of obtaining a copy of the software that runs on an embedded device. There are several methods, ranging from non-invasive (intercepting an update download) to semi-invasive (accessing a debug interface) to fully invasive (desoldering and reading the flash memory chip directly). We attempted all three, in order of increasing invasiveness.

Update Interception

The controller checks for firmware updates when connected to Wi-Fi. We connected it to a controlled Wi-Fi access point and monitored the traffic.

Firmware Update — Network Interception
# Controller connected to monitored AP — update check initiated:

$ mitmproxy --mode transparent -p 8080

GET https://update.vendor-cloud.com/v3/product/controller_rc231/latest
Response: 200 OK
{
"version": "04.12.03",
"release_date": "2025-09-15",
"size": 287614976,
"url": "https://cdn.vendor-cloud.com/fw/rc231_04.12.03.bin",
"md5": "a3b8c1d4e5f6..."
}

GET https://cdn.vendor-cloud.com/fw/rc231_04.12.03.bin
Response: 200 OK — 274 MB firmware image downloaded

# Observations:
# — Update check uses HTTPS (TLS 1.3) ✓
# — Firmware download uses HTTPS ✓
# — Integrity check: MD5 hash only ✗ (MD5 is cryptographically broken)
# — No digital signature on firmware image ✗
# — No certificate pinning on update endpoint ✗

The firmware update channel used HTTPS for transport — a positive finding that prevents casual interception. However, three critical weaknesses were present. First, the integrity check used MD5 — a hash algorithm that has been cryptographically broken since 2004 and for which collision attacks are practical. MD5 does not provide meaningful integrity assurance. Second, the firmware image carried no digital signature — the controller verified the MD5 hash against the value provided by the update server, but it did not verify that the firmware had been signed by the manufacturer. Third, the HTTPS connection did not implement certificate pinning — the controller accepted any valid TLS certificate for the update domain, making the connection vulnerable to man-in-the-middle attacks using a rogue certificate authority.

The practical consequence: an attacker who could intercept the controller's network traffic — via a rogue Wi-Fi access point, DNS hijacking, or ARP spoofing — could serve a modified firmware image with a matching MD5 hash. The controller would accept it.

Finding — Firmware Updates Lack Cryptographic Signature Verification

The controller verifies firmware integrity using MD5 only (cryptographically broken, collisions practical). No digital signature is applied to the firmware image. No certificate pinning is implemented on the update endpoint. A man-in-the-middle attacker could serve a modified firmware image that the controller would accept as genuine.

Debug Interface

Using the retired controller, we examined the printed circuit board for debug interfaces. Embedded devices frequently expose UART (serial), JTAG, or SWD debug interfaces on the PCB — test points left from manufacturing that are sometimes accessible without desoldering components.

Hardware Debug Interface — UART Discovery
# PCB inspection — retired controller (case removed):

J3 header (unpopulated): 4 pads — GND, TX, RX, VCC
Configuration: 3.3V UART, 115200 baud, 8N1

$ screen /dev/ttyUSB0 115200

[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 4.14.117 (builder@fw-build-07)
[ 0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7)
...
[ 3.847221] Starting services...
[ 4.112003] link_manager v2.34.1 started
[ 4.223847] cloud_agent v1.18.0 started
[ 4.334102] telemetry_relay v3.02.7 started

vendor-rc231 login:

# Full boot log visible on UART
# Login prompt — attempting default credentials:
# root / (blank) — Access denied
# root / root — Access denied
# admin / admin — Access denied
# root / vendor123 — ACCESS GRANTED (root shell)

An unpopulated UART header on the PCB — four solder pads labelled J3 — provided a serial console. Soldering a four-pin header took thirty seconds. The console displayed the full Linux boot log, revealing kernel version, service names, and a login prompt. The root password — vendor123 — was a manufacturer debug credential. With root access to the running controller, we could examine the live filesystem, running processes, network connections, and memory contents.

We also used the UART root shell to dump the complete firmware from the flash storage — providing a live filesystem image that complemented the update file obtained via network interception.


Firmware Analysis

With both the update file and the live filesystem dump in hand, we began static analysis of the firmware contents.

Firmware Structure — Binwalk Extraction
$ binwalk -e rc231_04.12.03.bin

DECIMAL HEXADECIMAL DESCRIPTION
0 0x0 uImage header, Linux 4.14.117, ARM
65536 0x10000 Linux kernel (zImage)
4194304 0x400000 SquashFS filesystem, little endian, v4.0
234881024 0xE000000 JFFS2 filesystem (configuration partition)

$ ls squashfs-root/
bin/ etc/ lib/ opt/ sbin/ usr/ var/

$ ls squashfs-root/usr/bin/
link_manager — C2 radio link management
cloud_agent — manufacturer cloud communication
telemetry_relay — telemetry processing and display
pair_service — controller-aircraft pairing
fw_updater — firmware update client
media_proxy — video/photo transfer relay
diag_service — diagnostics and logging

The firmware image contained a standard embedded Linux structure: a compressed kernel, a read-only SquashFS root filesystem containing the operating system and application binaries, and a writable JFFS2 partition for configuration data. The application binaries — seven key services managing radio links, cloud communication, telemetry, pairing, updates, media transfer, and diagnostics — were compiled ARM ELF binaries.

We subjected each binary to static analysis using standard reverse engineering tools.


Hard-Coded Credentials

The first pass was a string extraction across all binaries and configuration files — searching for patterns indicative of credentials, keys, tokens, and secrets.

Credential Discovery — String Analysis
$ strings squashfs-root/usr/bin/cloud_agent | grep -iE 'key|token|pass|secret|api'

api_key=dGhpcyBpcyBub3QgdGhlIHJlYWwga2V5 (base64 encoded)
mqtt_password=Cl0ud_Ctrl_2023! (plaintext)
provisioning_secret=A4F7...C3D1 (32-byte hex) (shared secret)

$ strings squashfs-root/usr/bin/link_manager | grep -iE 'key|pass|pair'

default_pair_key=5A3F...8B2E (16-byte hex) (pairing key)
diag_password=D!ag_Acc3ss_2022 (plaintext)

$ strings squashfs-root/usr/bin/diag_service | grep -iE 'key|pass|enable'

debug_enable_key=vendor_debug_XXXX (debug backdoor)
telnet_password=t3lnet_fw_debug (plaintext)

$ cat squashfs-root/etc/shadow
root:$6$[SALT]$[HASH]:18000:0:99999:7:::

$ hashcat -m 1800 -a 0 hash.txt rockyou.txt
root:vendor123 — cracked in 4 seconds

# 6 hard-coded credentials discovered across 3 binaries
# All credentials identical across all controllers of same model

Six hard-coded credentials discovered across three binaries and the system password file. An MQTT password for the manufacturer's cloud telemetry broker. A provisioning secret used during initial device registration with the cloud platform. A default pairing key used as a fallback during controller-aircraft pairing. A diagnostics password. A debug enable key that activated a hidden telnet service. And the root password confirmed via hash cracking.

The critical property of hard-coded credentials in firmware is that they are identical on every device of the same model. The firmware image is the same for every controller. The credentials compiled into the binaries are the same for every controller. Extracting them from one device compromises every device running that firmware version worldwide.

Credential Location Purpose Impact
MQTT password cloud_agent binary Authenticate to manufacturer's MQTT broker for telemetry upload Connect to cloud broker as any controller; read/publish telemetry for all devices on the platform
Provisioning secret cloud_agent binary Authenticate during initial device registration with cloud Register rogue devices on manufacturer's platform; impersonate legitimate controllers
Default pairing key link_manager binary Fallback key for controller-aircraft pairing when primary pairing fails Pair an unauthorised controller with any aircraft using fallback pairing mode
Diagnostics password link_manager binary Access hidden diagnostics mode via controller UI Access low-level radio configuration, spectrum analyser, and protocol debugging
Debug enable key diag_service binary Activate hidden telnet service on the controller Remote shell access to any controller on the same network when telnet is enabled
Root password /etc/shadow Linux root account on the controller Full system access via UART debug interface on any controller of this model

The Cloud Connection

The cloud_agent binary managed the controller's communication with the manufacturer's cloud platform. Using the hard-coded MQTT credentials, we examined what access the cloud connection provided.

Cloud Platform — MQTT Broker Analysis
# Connecting to manufacturer's MQTT broker with extracted credentials:
$ mosquitto_sub -h telemetry.vendor-cloud.com -p 8883 \
-u 'rc_controller' -P 'Cl0ud_Ctrl_2023!' \
--cafile vendor_ca.pem -t '#' -v

[*] Connected to telemetry.vendor-cloud.com:8883 (TLS)
[*] Subscribed to wildcard topic '#'

devices/rc231/SN-4847XXXX/telemetry {"battery":94,"gps":{...},"status":"idle"}
devices/rc231/SN-5012XXXX/telemetry {"battery":67,"gps":{...},"status":"flying"}
devices/ac450/SN-7201XXXX/telemetry {"battery":42,"gps":{...},"status":"landing"}
...

# Wildcard subscription successful
# Receiving telemetry from ALL devices on the platform
# Not just our client's devices — ALL customers globally

# Each message contains: device serial, GPS position, battery,
# flight status, connected aircraft serial, pilot account ID

# MQTT topic ACL: NOT ENFORCED for this credential set
# Single shared credential provides read access to all device topics

The MQTT credentials extracted from the firmware were shared across all controllers and provided read access to telemetry from every device on the manufacturer's platform. The MQTT broker did not enforce per-device topic access control lists (ACLs). A wildcard subscription returned real-time telemetry — GPS position, flight status, battery level, connected aircraft serial number, and pilot account identifier — for every active controller and aircraft globally.

This finding extended far beyond our client's six controllers. It was a platform-level vulnerability affecting every customer of this drone manufacturer. We immediately classified this as a responsible disclosure finding and notified the manufacturer through their published security contact, providing full technical details and a ninety-day remediation window before any public discussion.

Critical Finding — Platform-Wide Telemetry Exposure via Hard-Coded MQTT Credentials

Hard-coded MQTT credentials in the controller firmware provided read access to real-time telemetry for all devices on the manufacturer's cloud platform — not limited to the client's devices. GPS positions, flight status, and pilot identifiers for all customers globally were accessible with a single credential set extracted from any controller of this model. The manufacturer was notified via responsible disclosure.


The Update Supply Chain

The firmware update mechanism warranted deeper analysis. We had identified that the update used MD5 for integrity and lacked cryptographic signature verification. We tested whether a modified firmware image would be accepted by the controller.

Firmware Modification — Integrity Bypass Test
# Extract original firmware:
$ binwalk -e rc231_04.12.03.bin

# Modify: add benign marker file to filesystem
$ echo 'HEDGEHOG_TEST_MARKER' > squashfs-root/tmp/test.txt

# Repack SquashFS filesystem:
$ mksquashfs squashfs-root/ new_rootfs.sqsh -comp xz

# Rebuild firmware image with modified filesystem:
$ python3 rebuild_fw.py --kernel original_kernel.img \
--rootfs new_rootfs.sqsh --config original_jffs2.img \
--output rc231_modified.bin

# Calculate new MD5:
$ md5sum rc231_modified.bin
7f3a2b1c... rc231_modified.bin

# Serve modified firmware via rogue update server:
# Controller performs update check → served modified image + new MD5
# Controller validates MD5 → MATCH
# Controller installs modified firmware → SUCCESS

# Verification: connect via UART after reboot:
$ cat /tmp/test.txt
HEDGEHOG_TEST_MARKER

# Modified firmware accepted and installed — no signature check

We built a modified firmware image containing a benign marker file, served it via a rogue update server (using DNS redirection on our controlled network), and the controller accepted and installed it. The MD5 hash of the new image was provided by our rogue server, and the controller verified the hash — which matched, because we computed the correct MD5 for our modified image. There was no cryptographic signature to prevent this.

In a real attack, the modified firmware could contain anything: a persistent backdoor, modified radio parameters, altered telemetry reporting, a keylogger capturing pilot account credentials, or modified pairing logic that allows an attacker's controller to bind to any aircraft. The controller would install it, reboot, and continue operating — with the attacker's code running alongside the legitimate firmware.

The supply chain implications are severe. An attacker who could intercept the firmware update — via a rogue Wi-Fi access point at a drone show, a compromised hotel network, or a man-in-the-middle position on the pilot's home broadband — could persistently compromise the controller. The compromise would survive factory resets (which do not reflash the firmware) and would only be removed by a legitimate firmware reinstallation from a verified source.


From Firmware Extraction to Supply Chain Compromise

Step Action Weakness Exploited
01 Intercepted firmware update over controlled Wi-Fi No certificate pinning; firmware URL and MD5 disclosed in cleartext JSON
02 Obtained root shell via UART debug interface Unpopulated UART header on PCB; root password 'vendor123'
03 Extracted 6 hard-coded credentials from firmware binaries Credentials compiled into binaries; identical across all devices
04 Accessed manufacturer's MQTT broker — global telemetry exposure Shared MQTT credentials; no per-device topic ACLs
05 Built and installed modified firmware via rogue update server MD5-only integrity check; no cryptographic firmware signature

Firmware Is the Foundation. If It's Compromised, Everything Above It Falls.

Hard-Coded Credentials Are Fleet-Wide Credentials
A credential compiled into firmware exists on every device running that firmware. It cannot be changed per-device. It cannot be rotated. It cannot be revoked without a firmware update. And when it is extracted from any single device — purchased, stolen, borrowed, or found — it compromises every device. The economics are asymmetric: the attacker buys one controller; the vulnerability affects thousands.
Unsigned Updates Are Arbitrary Code Execution
A firmware update mechanism without cryptographic signature verification is an arbitrary code execution vector. If the device will install any firmware image that matches a self-declared hash, the attacker simply provides their own image with its own hash. Code signing — where the device verifies a digital signature against a trusted public key before installing an update — is the only meaningful defence.
Shared Cloud Credentials Scale the Breach
When every device authenticates to the cloud platform with the same credentials, compromising one device compromises the platform. Per-device credentials — unique to each device, provisioned during manufacturing, and revocable individually — are the standard solution. The manufacturer chose shared credentials, likely for manufacturing simplicity. The consequence is platform-wide exposure.
The Supply Chain Is the Attack Surface
Firmware supply chain attacks do not require physical access to the target device. They require access to the network the device uses to update. A compromised Wi-Fi network, a DNS hijack, or a compromised CDN node is sufficient. The controller updates over whatever Wi-Fi the pilot connects it to — their home broadband, a hotel Wi-Fi, a site office network. Each is an attack opportunity.

Recommendations and Hardening

Remediation Roadmap
Client-Side (0–30 days) Cost: Low
✓ Update controllers only on trusted, controlled networks
✓ Verify firmware versions match vendor's published release notes
✓ Restrict UART physical access — apply tamper-evident seals to case
✓ Monitor vendor security advisories for firmware patches
✓ Store controllers in locked, access-controlled storage

Manufacturer Recommendations (Responsible Disclosure) Cost: Medium–High
○ Implement cryptographic firmware signing (RSA/ECDSA)
○ Replace MD5 integrity check with SHA-256 minimum
○ Implement certificate pinning on firmware update endpoint
○ Replace shared MQTT credentials with per-device certificates
○ Implement MQTT topic ACLs (device reads only its own topics)
○ Remove hard-coded credentials from all production binaries
○ Disable UART debug interface in production firmware (or require auth)
○ Remove or secure debug enable keys and telnet backdoors
○ Implement secure boot chain (verify kernel, filesystem, and app integrity)

Industry-Wide Cost: N/A
○ Include controller firmware in UAV security assessment scope
○ Require firmware signing verification as procurement criterion
○ Treat drone controllers as managed IT assets (asset register,
firmware tracking, update verification, physical security)

The remediation for this engagement has a unique structure: the most critical fixes must be implemented by the manufacturer, not the client. The client cannot add cryptographic signature verification to the controller. The client cannot replace the shared MQTT credentials with per-device certificates. The client cannot remove the hard-coded credentials from the firmware binaries. These are design decisions embedded in the product.

What the client can do is manage the risk. Updating controllers only on trusted networks reduces the firmware supply chain risk. Physical access controls reduce the UART extraction risk. Monitoring vendor advisories ensures that firmware patches addressing disclosed vulnerabilities are applied promptly. And including firmware security as a procurement criterion for future drone equipment ensures that the next generation of controllers meets a higher security standard.

Cryptographic firmware signing is the single most impactful change the manufacturer can make. A signed firmware image — where the controller verifies an ECDSA or RSA signature against a trusted public key embedded in the bootloader before installing any update — makes firmware modification attacks computationally infeasible. The attacker cannot generate a valid signature without the manufacturer's private key. This is standard practice in modern embedded systems and automotive ECUs. It should be standard practice in commercial drone controllers.


The device in the pilot's hands was the least examined and the most compromised.

Four months ago, we began examining drone security. We attacked the aircraft's control links. We harvested intelligence from its storage. We spoofed the satellites it navigated by. And now, we have read the secrets compiled into the controller's firmware — secrets shared with every other controller of the same model on the planet.

The controller was the component that the client — and, we suspect, the manufacturer's security team — thought about least. It is the device the pilot holds. It is the device that sits on a desk between flights. It is the device that connects to Wi-Fi for updates and never prompts for a password. It is the device that nobody reverse engineers, because it is 'just a remote control'.

It is not a remote control. It is a networked Linux computer that authenticates to a cloud platform, processes telemetry, manages radio links, and installs firmware updates from the internet. It deserves the same security scrutiny as any other computing device in the organisation.

This concludes our drone security series. Across four articles, we have demonstrated that commercial UAV systems present an attack surface that spans radio frequency interception, data accumulation, satellite signal manipulation, and firmware supply chain compromise. The common thread is that organisations deploy drones as tools — cameras, survey instruments, patrol platforms — without recognising that they are also networked computing devices with all the vulnerabilities that entails.

Until next time — stay sharp, stay curious, and the next time someone hands you a controller, remember: the firmware remembers everything the manufacturer compiled into it. Including the passwords.

Legal Disclaimer

This article describes a firmware security assessment conducted under formal engagement with full written authorisation from the client. Firmware extraction was performed on hardware owned by the client and provided for assessment. No radio transmissions were made. No manufacturer systems were accessed beyond confirming the platform-level vulnerability using credentials extracted from the client's own hardware. The platform-wide MQTT telemetry exposure was reported to the manufacturer via responsible disclosure with a ninety-day remediation window. All identifying details — including the manufacturer, model, and specific credentials — have been altered or omitted. Reverse engineering of firmware may be subject to the terms of the manufacturer's end-user licence agreement. Unauthorised access to computer systems is an offence under the Computer Misuse Act 1990. Do not attempt to replicate these techniques without proper authorisation and legal review.



If the manufacturer compiled it in, it is on every device they shipped.

Hedgehog Security conducts firmware security assessments for IoT devices, embedded systems, and commercial drone platforms. We extract, analyse, and reverse engineer firmware to identify hard-coded credentials, insecure update mechanisms, debug interfaces, and supply chain vulnerabilities. The findings go beyond one device — they reveal what is present on every device of the same model worldwide.