
Prueba de concepto que explota la inyección de comandos DUML por Bluetooth en drones DJI, enviando comandos no autenticados para leer credenciales, alterar la configuración de Wi-Fi y controlar los sistemas de la aeronave.
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 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.
| 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 |
https://github.com/user-attachments/assets/57f51df2-5160-404c-9fd3-2a3a8b700008
# 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
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 enviarse.
Los comandos de control de radio se implementan a través de los manejadores dji_network correspondientes.
| 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.
commands.json, no el códigoEl menú se genera a partir de commands.json al inicio. Para añadir un comando, añada un nuevo objeto a la lista commands de una sección. El comando aparecerá la próxima vez que se inicie el POC.
Ejemplo:
{
"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."
}
El receptor predeterminado es 0x07 (network:0) y el remitente predeterminado es 0x02 (mobile:0).
Los constructores interactivos de carga útil se definen en payload_builders.py.
Los constructores disponibles incluyen:
ssidpskcountrymacchannelbss_typepower_levelrawPara añadir un nuevo constructor, implemente la función, regístrela en BUILDERS y haga referencia a su nombre desde commands.json.
Los comandos clasificados como danger requieren confirmación explícita antes de la 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 información de DOES se toma del campo note del comando, mientras que las advertencias adicionales se toman del campo warn en commands.json.
La función Change a parameter proporciona acceso a los parámetros de configuración conocidos listados en flyc_parameters.txt.
Un parámetro puede seleccionarse por nombre, proporcionarse con un valor, convertirse al ancho little-endian seleccionado y enviarse usando set_cfg_item (0x03/0xf9).
Reset a parameter usa reset_cfg_item (0x03/0xfa) para restaurar el parámetro seleccionado a su valor predeterminado de firmware.
El POC también proporciona varias macros predefinidas:
| Macro | Descripción |
|---|---|
| Restart Wifi | Detiene e inicia Wi-Fi (0x42 seguido de 0x41). |
| SET NEW PSK + Restart wifi | Cambia la PSK y luego reinicia 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 use este POC contra ninguna aeronave, dispositivo, red o sistema que no posea 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 usar 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.
| Comando | Qué hace |
|---|
| GET SSID | Recupera el SSID Wi-Fi configurado. |
| GET PSK | Recupera la clave precompartida WPA2 de 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 la configuración del sistema, controlador de vuelo, gimbal, cámara, Wi-Fi y SDR. |
device_reset L2 +MEDIA | Realiza el restablecimiento L1 y formatea los medios/almacenamiento. |
device_reset L3 +log | Realiza el restablecimiento L2 y además borra el registro del sistema. |
| Campo | Obligatorio | Significado |
|---|
label | Sí | Texto mostrado en el menú. |
cmd_set | Sí | Identificador del conjunto de comandos DUML. |
cmd_id | Sí | Identificador de comando DUML. |
receiver | Sí | Byte receptor en el cable, (index << 5) | type. |
payload | No | Carga útil en hexadecimal. |
tier | No | read, write o danger. |
builder | No | Constructor interactivo de carga útil. |
auth | No | Indica que se requiere un UUID de confianza. |
bt_reply | No | Controla si el POC espera una respuesta Bluetooth. |
sender | No | Byte del remitente; por defecto 0x02. |
after | No | Acción de seguimiento opcional. |
note | No | Descripción de ingeniería inversa mostrada por el POC. |
warn | No | Texto de advertencia adicional mostrado para comandos peligrosos. |
| 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 GATT de Bluetooth, conexión y manejo de respuestas. |
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 carga útil. |
parameters.py | Hashing y operaciones de parámetros de configuración. |
terminal.py | Interfaz de terminal, indicaciones y manejo de salida. |
flyc_parameters.txt | Nombres de parámetros de configuración conocidos. |
requirements.txt | Dependencias de Python. |