
Iniezione di comandi DUML su drone DJI via Bluetooth — Proof of Concept per CVE-2026-78306
Record CVE: https://www.cve.org/CVERecord?id=CVE-2026-78306
NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-78306
I droni DJI espongono un'interfaccia Bluetooth utilizzata per stabilire una connessione all'interfaccia Wi-Fi del drone e scambiare le credenziali Wi-Fi.
L'interfaccia Bluetooth verifica l'UUID attendibile del dispositivo per tre comandi:
I comandi rimanenti non richiedono lo stesso controllo di autenticazione. Di conseguenza, un attaccante remoto nel raggio d'azione del Bluetooth potrebbe essere in grado di inviare comandi DUML non autorizzati al drone.
A seconda del comando, un attaccante potrebbe essere in grado di modificare la configurazione del drone, incluso il cambio della password Wi-Fi e potenzialmente ottenere l'accesso alla rete interna del drone; abilitare o disabilitare le interfacce radio; riavviare o spegnere il velivolo; ripristinare la configurazione, che cancella tutti i video e le foto catturate dal drone; ed eseguire altre azioni.
Il POC fornisce un registro dei comandi che consente di testare i comandi disponibili senza modificare il codice sorgente Python. Il registro dei comandi, inclusi il comando, il ricevitore, i requisiti di autenticazione e la descrizione di ciascun comando, è definito in 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
I seguenti comandi sono registrati in commands.json. Il POC separa i comandi in operazioni di lettura, configurazione, controllo radio, reset, sistema e parametri.
Queste operazioni sono classificate come danger nel POC e richiedono quindi una conferma esplicita prima di essere inviate.
| Comando | Cosa fa |
|---|---|
| Factory Reset WIFI | Ripristina la configurazione Wi-Fi allo stato predefinito. |
| Factory Restore Params | Ripristina la tabella dei parametri di configurazione di rete ai valori di fabbrica. |
Il POC contrassegna entrambe le operazioni come pericolose perché modificano la configurazione persistente.
| Comando | Cosa fa |
|---|---|
| Change a parameter | Cambia un parametro di configurazione del drone usando il suo hash del nome a 32 bit. |
| Reset a parameter | Ripristina un parametro di configurazione al valore predefinito del firmware. |
Il POC ottiene i nomi dei parametri da flyc_parameters.txt e fornisce una selezione interattiva dei parametri. Per aggiungere un parametro noto che si desidera modificare o ripristinare, aggiungere il suo nome a flyc_parameters.txt. Il parametro sarà quindi disponibile per la selezione all'avvio del POC.
I comandi classificati come danger richiedono una conferma esplicita prima della trasmissione.
La schermata di conferma mostra informazioni quali:
──────────────────────────────────────────────────────────────────────
!!! 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 funzione Change a parameter fornisce accesso ai parametri di configurazione noti elencati in flyc_parameters.txt.
Reset a parameter utilizza reset_cfg_item per ripristinare il parametro selezionato al valore predefinito del firmware.
Per un elenco completo dei parametri estratti e maggiori dettagli, consultare la pagina wiki FLYC Parameters.
Il POC fornisce inoltre diverse macro predefinite:
| Macro | Descrizione |
|---|---|
| Restart Wifi | Arresta e avvia il Wi-Fi (0x42 seguito da 0x41). |
| SET NEW PSK + Restart wifi | Cambia la PSK e poi riavvia il Wi-Fi. |
| Probe read commands | Invia i comandi di lettura registrati e segnala quali comandi rispondono. |
Le macro sono definite separatamente dalle singole voci dei comandi.
⚠️ AVVERTENZA: Questo proof of concept è destinato esclusivamente a scopi educativi, di ricerca sulla sicurezza e di penetration testing autorizzato.
Questo POC dimostra problemi di sicurezza nell'interfaccia di gestione dei comandi Bluetooth/DUML dei droni DJI. Alcuni comandi possono modificare la configurazione del dispositivo, disabilitare le interfacce radio, interrompere la connettività, riavviare o spegnere il velivolo, ripristinare la configurazione o eliminare i dati memorizzati.
⚠️ NON utilizzare questo POC contro qualsiasi velivolo, dispositivo, rete o sistema di cui non si è proprietari o per cui non si dispone di esplicita autorizzazione al test.
Alcuni comandi possono causare perdita di dati, modifiche alla configurazione, perdita di connettività, interruzione del dispositivo o altre conseguenze indesiderate. I test devono essere eseguiti solo in un ambiente controllato in cui il velivolo, le persone e le proprietà circostanti non siano a rischio.
Gli autori non sono responsabili per eventuali danni, perdita di dati, interruzione del servizio, funzionamento del velivolo o altre conseguenze derivanti dall'uso o dall'abuso di questo POC.
⚠️ Utilizzando questo POC, si accetta la responsabilità di garantire che i propri test siano autorizzati e conformi a tutte le leggi, i regolamenti e i requisiti di divulgazione responsabile applicabili.
| Prodotto | Versione interessata |
|---|
| 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 | Cosa fa |
|---|
| GET SSID | Recupera l'SSID Wi-Fi configurato. |
| GET PSK | Recupera la chiave pre-condivisa WPA2 del Wi-Fi. |
| GET MAC | Recupera l'indirizzo MAC dell'AP Wi-Fi. |
| GET Country Code | Recupera il codice paese normativo di due lettere. |
| GET Channel | Recupera il canale Wi-Fi attualmente attivo. |
| GET Band | Recupera la selezione di banda 2.4/5 GHz configurata. |
| GET RSSI | Interroga l'handler RSSI; questa build del firmware contiene un'implementazione stub. |
| GET WiFi/BT status | Recupera lo stato delle radio Wi-Fi e Bluetooth. |
| GET Device Info/Model | Recupera le informazioni sul dispositivo e sul modello. |
| GET Version | Recupera la versione del daemon. |
| GET Bluetooth Name | Recupera il nome del dispositivo Bluetooth. |
| Comando | Cosa fa |
|---|
| SET SSID | Cambia l'SSID Wi-Fi configurato. |
| SET PSK | Cambia la password Wi-Fi configurata. |
| SET MAC Address | Cambia la configurazione BSSID Wi-Fi a runtime. |
| SET Country Code | Cambia il codice paese normativo configurato. |
| SET Country Code Ext | Gestisce la configurazione estesa del codice paese. |
| SET Channel | Cambia il canale Wi-Fi e causa il riavvio dell'AP. |
| Comando | Cosa fa |
|---|
| Start WIFI | Avvia l'interfaccia Wi-Fi e i servizi associati. |
| Stop WIFI | Arresta l'interfaccia Wi-Fi. |
| Restart WIFI + BT | Riavvia i sottosistemi Wi-Fi e Bluetooth. |
| Start Bluetooth | Avvia il sottosistema Bluetooth. |
| Stop Bluetooth | Arresta il sottosistema Bluetooth e termina la sessione corrente. |
| Sysmode power control | Controlla lo stato di alimentazione Wi-Fi/Bluetooth. |
| Comando | Cosa fa |
|---|
ftpd_start | Avvia il servizio dji_ftpd. |
storage_export_enable | Abilita la configurazione di esportazione dello storage. |
storage_export_disable | Disabilita la configurazione di esportazione dello storage. |
play_sound | Attiva un suono del velivolo. |
mute | Disattiva l'audio dell'altoparlante del velivolo. |
unmute | Riattiva l'audio dell'altoparlante del velivolo. |
reboot_plain | Riavvia il velivolo. |
reboot_poweroff | Spegne il velivolo. |
reboot_powersave | Mette il velivolo in modalità risparmio energetico. |
device_reset L1 config | Ripristina le configurazioni di sistema, flight controller, gimbal, camera, Wi-Fi e SDR. |
device_reset L2 +MEDIA | Esegue il reset L1 e cancella lo storage multimediale, incluse le foto e i video catturati dal drone. |
device_reset L3 +log | Esegue il reset L2 e cancella inoltre i log di sistema. |
| File | Ruolo |
|---|
ble_console.py | Punto di ingresso principale, menu ed esecuzione dei comandi. |
commands.json | Registro dei comandi e descrizioni dei comandi. |
ble_transport.py | Scansione GATT Bluetooth, connessione e gestione delle risposte. |
duml_protocol.py | Costruzione dei pacchetti DUML v1 e gestione del CRC. |
duml_decoders.py | Decodifica delle risposte e gestione dei codici di ritorno. |
payload_builders.py | Generazione interattiva dei payload. |
parameters.py | Hashing e operazioni sui parametri di configurazione. |
terminal.py | UI del terminale, prompt e gestione dell'output. |
flyc_parameters.txt | Nomi dei parametri di configurazione noti. |
requirements.txt | Dipendenze Python. |