A consumer drone is a flying computer with a radio stack, a GPS receiver, a flight controller running open-source firmware, and a telemetry link broadcasting its position and status in plaintext. Most of them ship with the same protocol trust assumptions that plagued enterprise networks in 2005.
The attack surface isn't theoretical. MAVLink — the dominant telemetry and command protocol for commercial and hobbyist drones — was designed for ease of integration, not security. It has no mandatory authentication. Commands are accepted from any source that can reach the vehicle's radio link. A sufficiently motivated researcher with a software-defined radio and a laptop can, in a controlled environment, do things to a drone that the manufacturer's documentation would strongly prefer you didn't know about.
DuckHunter is the research platform for understanding that surface before someone less friendly does.
The Protocol Problem
MAVLink was designed for the ArduPilot ecosystem in 2009. It solved a real problem elegantly: a lightweight binary protocol for passing telemetry and commands between a ground control station and an aircraft. Simple, efficient, widely adopted. The drone industry built on top of it and never looked back.
The security posture of that original design reflects the context it was built for: hobbyist researchers flying in open fields, not adversarial RF environments. There was no authentication layer because the assumption was physical proximity implied authorization. That assumption no longer holds.
MAVLink 2 added signing support in 2016. Adoption remains inconsistent. A significant portion of commercial and hobbyist vehicles in the field today either don't implement message signing, implement it incorrectly, or disable it for compatibility with older ground stations. The HEARTBEAT message that every MAVLink vehicle broadcasts continuously — announcing its presence, system type, firmware version, and operational state — is unsigned by default on most hardware.
This is the entry point DuckHunter's CMD_INJECT module is built around.
// Simulated MAVLink HEARTBEAT capture
// Passive monitoring — no transmission required
const packet = await pulseSniff({
band: "2.4GHz",
protocol: "MAVLink2",
filter: ["HEARTBEAT", "POSITION"]
});
console.log(packet);
// {
// type: "HEARTBEAT",
// system_id: 1,
// autopilot: "ArduCopter",
// base_mode: "GUIDED | ARMED",
// custom_mode: 4,
// signed: false // <-- most common finding
// }
A passive HEARTBEAT capture tells you the vehicle is present, what firmware it's running, whether it's armed, and whether its command link is authenticated. That's a complete target profile without transmitting a single byte.
RF as Reconnaissance
Before you can interact with a drone's protocol stack, you have to find it. SKY_SWEEP handles the spectrum side — real-time signal identification across the three bands drone control links actually use.
2.4GHz is where most consumer and prosumer links live: DJI OcuSync, legacy Spektrum DSMX, ExpressLRS in its most common configuration. 5.8GHz carries a smaller subset of control links and most FPV video downlinks. 900MHz is the long-range tier — TBS Crossfire, ExpressLRS 900, systems designed to maintain link integrity at distances where 2.4GHz degrades.
Each protocol has a signature. Frequency-hopping spread spectrum links like ELRS and Crossfire use pseudorandom hop sequences that look like noise to a naive scanner but have detectable statistical properties. Consumer OcuSync links have characteristic burst patterns. The PSD visualization in SKY_SWEEP maps signal power against frequency in real time, turning the RF environment into something you can actually read.
The practical value is triangulation: if you know what a target link looks like spectrally, you can track signal strength to determine proximity and approximate bearing. That's target acquisition without GPS.
GPS Integrity and the Spoofing Problem
TRACK_LOCK is the module that addresses a different class of attack — not injection into the control link, but manipulation of the navigation data the drone trusts.