
Inyección de comandos DUML en drones DJI a través de Bluetooth — Prueba de concepto para CVE-2026-78306
Registro CVE: https://www.cve.org/CVERecord?id=CVE-2026-78306
NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-78306
Los drones DJI exponen una interfaz Bluetooth utilizada para establecer una conexión con la interfaz Wi-Fi del dron e intercambiar credenciales Wi-Fi.
La interfaz Bluetooth verifica el UUID de confianza del dispositivo para tres comandos:
El resto de comandos no requieren la misma verificación de autenticación. Como resultado, un atacante remoto dentro del alcance Bluetooth podría enviar comandos DUML no autorizados al dron.
Dependiendo del comando, un atacante podría modificar la configuración del dron, incluyendo cambiar la contraseña Wi-Fi y potencialmente obtener acceso a la red interna del dron; habilitar o deshabilitar interfaces de radio; reiniciar o apagar la aeronave; restablecer la configuración, lo que borra todos los vídeos e imágenes capturados por el dron; y realizar otras acciones.
El POC proporciona un registro de comandos que permite probar los comandos disponibles sin modificar el código fuente de Python. El registro de comandos, incluyendo el comando, el receptor, los requisitos de autenticación y la descripción de cada comando, se define en commands.json.
https://github.com/user-attachments/assets/57f51df2-5160-404c-9fd3-2a3a8b700008
# Clone the repository
git clone https://github.com/Wh02m1/CVE-2026-78306.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
python3 ble_console.py
Los siguientes comandos están registrados en commands.json. El POC separa los comandos en operaciones de lectura, configuración, control de radio, restablecimiento, sistema y parámetros.
Estas operaciones se clasifican como danger en el POC y, por lo tanto, requieren confirmación explícita antes de ser enviadas.
| Comando | Qué hace |
|---|---|
| Factory Reset WIFI | Restaura la configuración Wi-Fi a su estado predeterminado. |
| Factory Restore Params | Restaura la tabla de parámetros de configuración de red a los valores de fábrica. |
El POC marca ambas operaciones como peligrosas porque modifican la configuración persistente.
| Comando | Qué hace |
|---|---|
| Change a parameter | Cambia un parámetro de configuración del dron usando el hash de 32 bits de su nombre. |
| Reset a parameter | Restablece un parámetro de configuración a su valor predeterminado de firmware. |
El POC obtiene los nombres de los parámetros de flyc_parameters.txt y proporciona una selección interactiva de parámetros. Para añadir un parámetro conocido que desee modificar o restablecer, añada su nombre a flyc_parameters.txt. El parámetro estará entonces disponible para su selección cuando se inicie el POC.
Los comandos clasificados como danger requieren confirmación explícita antes de su transmisión.
La pantalla de confirmación muestra información como:
──────────────────────────────────────────────────────────────────────
!!! 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:
La función Change a parameter proporciona acceso a los parámetros de configuración conocidos listados en flyc_parameters.txt.
Reset a parameter utiliza reset_cfg_item para restaurar el parámetro seleccionado a su valor predeterminado de firmware.
Para obtener una lista completa de los parámetros extraídos y más detalles, consulte la página wiki de parámetros FLYC.
El POC también proporciona varias macros predefinidas:
| Macro | Descripción |
|---|---|
| Restart Wifi | Detiene e inicia el Wi-Fi (0x42 seguido de 0x41). |
| SET NEW PSK + Restart wifi | Cambia la PSK y luego reinicia el Wi-Fi. |
| Probe read commands | Envía los comandos de lectura registrados e informa qué comandos responden. |
Las macros se definen por separado de las entradas de comandos individuales.
⚠️ ADVERTENCIA: Esta prueba de concepto está destinada estrictamente a fines educativos, de investigación de seguridad y de pruebas de penetración autorizadas.
Este POC demuestra problemas de seguridad en la interfaz de manejo de comandos Bluetooth/DUML de DJI. Algunos comandos pueden modificar la configuración del dispositivo, deshabilitar interfaces de radio, interrumpir la conectividad, reiniciar o apagar la aeronave, restablecer la configuración o eliminar datos almacenados.
⚠️ NO utilice este POC contra ninguna aeronave, dispositivo, red o sistema que no sea de su propiedad o para el que no tenga autorización explícita de prueba.
Algunos comandos pueden causar pérdida de datos, cambios de configuración, pérdida de conectividad, interrupción del dispositivo u otras consecuencias no deseadas. Las pruebas solo deben realizarse en un entorno controlado donde la aeronave y las personas y propiedades circundantes no estén en riesgo.
Los autores no son responsables de ningún daño, pérdida de datos, interrupción del servicio, operación de la aeronave u otras consecuencias derivadas del uso o mal uso de este POC.
⚠️ Al utilizar este POC, usted acepta la responsabilidad de asegurar que sus pruebas estén autorizadas y cumplan con todas las leyes, regulaciones y requisitos de divulgación responsable aplicables.
| Producto | Versión afectada |
|---|
| DJI Neo | 0 – 01.00.0400 |
| DJI Neo 2 | 0 – 01.00.0500 |
| DJI Flip | 0 – 01.00.1200 |
| DJI Air 3 | 0 – 01.00.1600 |
| DJI Air 3S | 0 – 01.00.1400 |
| DJI Avata 2 | 0 – 01.00.0400 |
| DJI Avata 360 | 0 – 01.00.0300 |
| DJI Mavic 3 | 0 – 01.00.1400 |
| DJI Mavic 3 Classic | 0 – 01.00.0800 |
| DJI Mavic 3 Pro | 0 – 01.01.0700 |
| DJI Mavic 4 Pro | 0 – 01.00.0500 |
| DJI Mini 2 | 0 – 01.07.0200 |
| DJI Mini 3 | 0 – 01.00.0500 |
| DJI Mini 3 Pro | 0 – 01.00.0900 |
| DJI Mini 4 Pro | 0 – 01.00.1100 |
| DJI Mini 5 Pro | 0 – 01.00.0600 |
| Comando | Qué hace |
|---|
| GET SSID | Recupera el SSID Wi-Fi configurado. |
| GET PSK | Recupera la clave precompartida WPA2 del Wi-Fi. |
| GET MAC | Recupera la dirección MAC del AP Wi-Fi. |
| GET Country Code | Recupera el código de país regulatorio de dos letras. |
| GET Channel | Recupera el canal Wi-Fi actualmente activo. |
| GET Band | Recupera la selección de banda 2.4/5 GHz configurada. |
| GET RSSI | Consulta el manejador RSSI; esta compilación de firmware contiene una implementación stub. |
| GET WiFi/BT status | Recupera el estado de las radios Wi-Fi y Bluetooth. |
| GET Device Info/Model | Recupera la información del dispositivo y del modelo. |
| GET Version | Recupera la versión del daemon. |
| GET Bluetooth Name | Recupera el nombre del dispositivo Bluetooth. |
| Comando | Qué hace |
|---|
| SET SSID | Cambia el SSID Wi-Fi configurado. |
| SET PSK | Cambia la contraseña Wi-Fi configurada. |
| SET MAC Address | Cambia la configuración del BSSID Wi-Fi en tiempo de ejecución. |
| SET Country Code | Cambia el código de país regulatorio configurado. |
| SET Country Code Ext | Gestiona la configuración extendida del código de país. |
| SET Channel | Cambia el canal Wi-Fi y provoca el reinicio del AP. |
| Comando | Qué hace |
|---|
| Start WIFI | Inicia la interfaz Wi-Fi y los servicios asociados. |
| Stop WIFI | Detiene la interfaz Wi-Fi. |
| Restart WIFI + BT | Reinicia los subsistemas Wi-Fi y Bluetooth. |
| Start Bluetooth | Inicia el subsistema Bluetooth. |
| Stop Bluetooth | Detiene el subsistema Bluetooth y termina la sesión actual. |
| Sysmode power control | Controla el estado de energía de Wi-Fi/Bluetooth. |
| Comando | Qué hace |
|---|
ftpd_start | Inicia el servicio dji_ftpd. |
storage_export_enable | Habilita la configuración de exportación de almacenamiento. |
storage_export_disable | Deshabilita la configuración de exportación de almacenamiento. |
play_sound | Activa un sonido de la aeronave. |
mute | Silencia el altavoz de la aeronave. |
unmute | Activa el sonido del altavoz de la aeronave. |
reboot_plain | Reinicia la aeronave. |
reboot_poweroff | Apaga la aeronave. |
reboot_powersave | Coloca la aeronave en modo de ahorro de energía. |
device_reset L1 config | Restablece las configuraciones del sistema, controlador de vuelo, gimbal, cámara, Wi-Fi y SDR. |
device_reset L2 +MEDIA | Realiza el restablecimiento L1 y borra el almacenamiento multimedia, incluyendo las imágenes y vídeos capturados por el dron. |
device_reset L3 +log | Realiza el restablecimiento L2 y además borra los registros del sistema. |
| Archivo | Rol |
|---|
ble_console.py | Punto de entrada principal, menú y ejecución de comandos. |
commands.json | Registro de comandos y descripciones de comandos. |
ble_transport.py | Escaneo, conexión y manejo de respuestas GATT de Bluetooth. |
duml_protocol.py | Construcción de paquetes DUML v1 y manejo de CRC. |
duml_decoders.py | Decodificación de respuestas y manejo de códigos de retorno. |
payload_builders.py | Generación interactiva de payloads. |
parameters.py | Hashing y operaciones de parámetros de configuración. |
terminal.py | Interfaz de terminal, prompts y manejo de salida. |
flyc_parameters.txt | Nombres de parámetros de configuración conocidos. |
requirements.txt | Dependencias de Python. |