Skip to content
KitploitKITPLOIT
ToolsBlog
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
CVE-2026-78306 — Proof-of-concept exploiting DJI drone Bluetooth DUML command injection, sending unauthenticated commands to read credentials, alter Wi-Fi config, and control aircraft systems. | Kitploit
Tools/GitHubGitHub/wh02m1/cve-2026-78306
Embedded Systems SecurityBluetooth SecurityIoT SecurityPayload GenerationVulnerability AnalysisExploitationWireless SecurityPenetration TestingHardware & IoT Security
GitHubwh02m1/cve-2026-78306

CVE-2026-78306

Proof-of-concept exploiting DJI drone Bluetooth DUML command injection, sending unauthenticated commands to read credentials, alter Wi-Fi config, and control aircraft systems.

2h 55m agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share
View Repository

CVE-2026-78306 — DJI DUML Command Injection over Bluetooth POC

Description

DJI drones expose a Bluetooth interface used to establish a connection to the drone's Wi-Fi interface and exchange Wi-Fi credentials.

The Bluetooth interface checks the device's trusted UUID for three commands:

  • Get SSID
  • Get PSK
  • Get MAC address

The remaining commands do not require the same authentication check. As a result, a remote attacker within Bluetooth range may be able to send unauthorized DUML commands to the drone.

Depending on the command, an attacker may be able to modify the drone's configuration, including changing the Wi-Fi password and potentially gaining access to the drone's internal network, enabling or disabling radio interfaces, restarting or powering off the aircraft, resetting configuration, and performing other actions.

The POC provides a command registry that allows the available commands to be tested without modifying the Python source code. The command registry, including the command, receiver, authentication requirements, and description of each command, is defined in commands.json.

Affected Products

ProductAffected Version
DJI Neo0 – 01.00.0400
DJI Neo 20 – 01.00.0500
DJI Flip0 – 01.00.1200
DJI Air 30 – 01.00.1600
DJI Air 3S0 – 01.00.1400
DJI Avata 20 – 01.00.0400
DJI Avata 3600 – 01.00.0300
DJI Mavic 30 – 01.00.1400
DJI Mavic 3 Classic0 – 01.00.0800
DJI Mavic 3 Pro0 – 01.01.0700
DJI Mavic 4 Pro0 – 01.00.0500
DJI Mini 20 – 01.07.0200
DJI Mini 30 – 01.00.0500
DJI Mini 3 Pro0 – 01.00.0900
DJI Mini 4 Pro0 – 01.00.1100
DJI Mini 5 Pro0 – 01.00.0600

DEMO

https://github.com/user-attachments/assets/57f51df2-5160-404c-9fd3-2a3a8b700008

Installation

1. Install the POC

root@kitploit:~
# Clone the repository
git clone https://github.com/Wh02m1/CVE-2026-78306-POC.git
cd CVE-2026-78306-POC

# Create and activate a Python virtual environment
python3 -m venv venv
source venv/bin/activate

# Install dependencies
pip install -r requirements.txt

2. Power on the drone

3. Run the POC

root@kitploit:~
python3 ble_console.py

4. After scan select the Drone SSID

image

Command Reference

The following commands are registered in commands.json. The POC separates commands into read, configuration, radio-control, reset, system, and parameter operations.

Read Commands

Write Configuration Commands

These operations are classified as danger in the POC and therefore require explicit confirmation before being sent.

Radio Control Commands

The radio-control commands are implemented through the corresponding dji_network handlers.

Reset Commands

CommandWhat it does
Factory Reset WIFIRestores the Wi-Fi configuration to its default state.
Factory Restore ParamsRestores the network configuration parameter table to factory defaults.

The POC marks both operations as dangerous because they modify persistent configuration.

System Commands

Parameter Commands

CommandWhat it does
Change a parameterChanges a drone configuration parameter using its 32-bit name hash.
Reset a parameterResets a configuration parameter to its firmware default.

The POC obtains parameter names from flyc_parameters.txt and provides interactive parameter selection. To add a known parameter that you want to modify or reset, add its name to flyc_parameters.txt. The parameter will then be available for selection when the POC is started.

Adding a Command: Edit commands.json, Not the Code

The menu is generated from commands.json at startup. To add a command, add a new object to a section's commands list. The command will appear the next time the POC is started.

Example:

root@kitploit:~
{
  "label": "GET Channel",
  "cmd_set": "0x07",
  "cmd_id": "0x2c",
  "receiver": "0x07",
  "payload": "",
  "tier": "read",
  "bt_reply": true,
  "note": "wms_evt_get_chan -> wifi_mgmt_get_chan."
}

Command Fields

The default receiver is 0x07 (network:0) and the default sender is 0x02 (mobile:0).


Payload Builders

Interactive payload builders are defined in payload_builders.py.

Available builders include:

  • ssid
  • psk
  • country
  • mac
  • channel
  • bss_type
  • power_level
  • raw

To add a new builder, implement the function, register it in BUILDERS, and reference its name from commands.json.


Confirmation Screen

Commands classified as danger require explicit confirmation before transmission.

The confirmation screen displays information such as:

root@kitploit:~
──────────────────────────────────────────────────────────────────────
  !!!  DANGEROUS COMMAND  !!!
──────────────────────────────────────────────────────────────────────
 COMMAND    device_reset L1 config
 ROUTE      00/de -> ve_air:1
 PAYLOAD    11 01 00 00 00 00
 DOES       system / FC / gimbal / camera / wifi / sdr config reset
 WARNING    The FC configuration reset can restart the motors.
──────────────────────────────────────────────────────────────────────
 Type YES to send:

The DOES information is taken from the command's note, while additional warnings are taken from the warn field in commands.json.


Parameters

The Change a parameter function provides access to the known configuration parameters listed in flyc_parameters.txt.

A parameter can be selected by name, supplied with a value, converted to the selected little-endian width, and sent using set_cfg_item (0x03/0xf9).

Reset a parameter uses reset_cfg_item (0x03/0xfa) to restore the selected parameter to its firmware default.


Macros

The POC also provides several predefined macros:

MacroDescription
Restart WifiStops and starts Wi-Fi (0x42 followed by 0x41).
SET NEW PSK + Restart wifiChanges the PSK and then restarts Wi-Fi.
Probe read commandsSends the registered read commands and reports which commands respond.

The macros are defined separately from the individual command entries.


Files


⚠️ Disclaimer

⚠️ WARNING: This proof of concept is intended strictly for educational, security-research, and authorized penetration-testing purposes.

This POC demonstrates security issues in the DJI Bluetooth/DUML command-handling interface. Some commands can modify device configuration, disable radio interfaces, interrupt connectivity, reboot or power off the aircraft, reset configuration, or delete stored data.

⚠️ Do NOT use this POC against any aircraft, device, network, or system that you do not own or do not have explicit authorization to test.

Some commands may cause data loss, configuration changes, loss of connectivity, device disruption, or other unintended consequences. Testing should only be performed in a controlled environment where the aircraft and surrounding people and property are not at risk.

The authors are not responsible for any damage, data loss, service interruption, aircraft operation, or other consequences resulting from the use or misuse of this POC.

⚠️ By using this POC, you accept responsibility for ensuring that your testing is authorized and complies with all applicable laws, regulations, and responsible-disclosure requirements.

Download Tool
CommandWhat it does
GET SSIDRetrieves the configured Wi-Fi SSID.
GET PSKRetrieves the Wi-Fi WPA2 pre-shared key.
GET MACRetrieves the Wi-Fi AP MAC address.
GET Country CodeRetrieves the two-letter regulatory country code.
GET ChannelRetrieves the currently active Wi-Fi channel.
GET BandRetrieves the configured 2.4/5 GHz band selection.
GET RSSIQueries the RSSI handler; this firmware build contains a stub implementation.
GET WiFi/BT statusRetrieves the Wi-Fi and Bluetooth radio state.
GET Device Info/ModelRetrieves device and model information.
GET VersionRetrieves the daemon version.
GET Bluetooth NameRetrieves the Bluetooth device name.
CommandWhat it does
SET SSIDChanges the configured Wi-Fi SSID.
SET PSKChanges the configured Wi-Fi password.
SET MAC AddressChanges the runtime Wi-Fi BSSID configuration.
SET Country CodeChanges the configured regulatory country code.
SET Country Code ExtHandles extended country-code configuration.
SET ChannelChanges the Wi-Fi channel and causes the AP to restart.
CommandWhat it does
Start WIFIStarts the Wi-Fi interface and associated services.
Stop WIFIStops the Wi-Fi interface.
Restart WIFI + BTRestarts the Wi-Fi and Bluetooth subsystems.
Start BluetoothStarts the Bluetooth subsystem.
Stop BluetoothStops the Bluetooth subsystem and terminates the current session.
Sysmode power controlControls the Wi-Fi/Bluetooth power state.
CommandWhat it does
ftpd_startStarts the dji_ftpd service.
storage_export_enableEnables the storage-export configuration.
storage_export_disableDisables the storage-export configuration.
play_soundTriggers an aircraft sound.
muteMutes the aircraft speaker.
unmuteUnmutes the aircraft speaker.
reboot_plainReboots the aircraft.
reboot_poweroffPowers off the aircraft.
reboot_powersavePlaces the aircraft into power-save mode.
device_reset L1 configResets system, flight-controller, gimbal, camera, Wi-Fi, and SDR configuration.
device_reset L2 +MEDIAPerforms the L1 reset and formats media/storage.
device_reset L3 +logPerforms the L2 reset and additionally clears the system log.
FieldRequiredMeaning
labelYesText displayed in the menu.
cmd_setYesDUML command-set identifier.
cmd_idYesDUML command identifier.
receiverYesWire receiver byte, (index << 5) | type.
payloadNoHex payload.
tierNoread, write, or danger.
builderNoInteractive payload builder.
authNoIndicates that a trusted UUID is required.
bt_replyNoControls whether the POC waits for a Bluetooth response.
senderNoSender byte; defaults to 0x02.
afterNoOptional follow-up action.
noteNoReverse-engineering description shown by the POC.
warnNoAdditional warning text displayed for dangerous commands.
FileRole
ble_console.pyMain entry point, menu and command execution.
commands.jsonCommand registry and command descriptions.
ble_transport.pyBluetooth GATT scanning, connection and response handling.
duml_protocol.pyDUML v1 packet construction and CRC handling.
duml_decoders.pyResponse decoding and return-code handling.
payload_builders.pyInteractive payload generation.
parameters.pyConfiguration parameter hashing and operations.
terminal.pyTerminal UI, prompts and output handling.
flyc_parameters.txtKnown configuration parameter names.
requirements.txtPython dependencies.