
Proof-of-concept che sfrutta l'iniezione di comandi DUML via Bluetooth sui droni DJI, inviando comandi non autenticati per leggere le credenziali, modificare la configurazione Wi-Fi e controllare i sistemi del velivolo.
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, inclusa la modifica della password Wi-Fi e potenzialmente ottenere l'accesso alla rete interna del drone, abilitare o disabilitare le interfacce radio, riavviare o spegnere l'aeromobile, ripristinare la configurazione 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.
| 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 |
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
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.
I comandi di controllo radio sono implementati tramite i corrispondenti handler dji_network.
| 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 | Modifica un parametro di configurazione del drone utilizzando 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.
commands.json, non il codiceIl menu viene generato da commands.json all'avvio. Per aggiungere un comando, aggiungere un nuovo oggetto alla lista commands di una sezione. Il comando apparirà la prossima volta che il POC viene avviato.
Esempio:
{
"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."
}
Il ricevitore predefinito è 0x07 (network:0) e il mittente predefinito è 0x02 (mobile:0).
I builder interattivi dei payload sono definiti in payload_builders.py.
I builder disponibili includono:
ssidpskcountrymacchannelbss_typepower_levelrawPer aggiungere un nuovo builder, implementare la funzione, registrarla in BUILDERS e fare riferimento al suo nome da commands.json.
I comandi classificati come danger richiedono una conferma esplicita prima della trasmissione.
La schermata di conferma visualizza 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:
Le informazioni DOES sono tratte dal campo note del comando, mentre gli avvisi aggiuntivi sono tratti dal campo warn in commands.json.
La funzione Change a parameter fornisce l'accesso ai parametri di configurazione noti elencati in flyc_parameters.txt.
Un parametro può essere selezionato per nome, fornito con un valore, convertito nella larghezza little-endian selezionata e inviato utilizzando set_cfg_item (0x03/0xf9).
Reset a parameter utilizza reset_cfg_item (0x03/0xfa) per ripristinare il parametro selezionato al valore predefinito del firmware.
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 | Modifica 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.
⚠️ AVVISO: 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 di DJI. Alcuni comandi possono modificare la configurazione del dispositivo, disabilitare le interfacce radio, interrompere la connettività, riavviare o spegnere l'aeromobile, ripristinare la configurazione o eliminare i dati memorizzati.
⚠️ NON utilizzare questo POC contro qualsiasi aeromobile, 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 l'aeromobile, 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 dell'aeromobile 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.
| Comando | Cosa fa |
|---|
| GET SSID | Recupera l'SSID Wi-Fi configurato. |
| GET PSK | Recupera la chiave pre-condivisa WPA2 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 | Modifica l'SSID Wi-Fi configurato. |
| SET PSK | Modifica la password Wi-Fi configurata. |
| SET MAC Address | Modifica la configurazione BSSID Wi-Fi a runtime. |
| SET Country Code | Modifica il codice paese normativo configurato. |
| SET Country Code Ext | Gestisce la configurazione estesa del codice paese. |
| SET Channel | Modifica 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 dell'aeromobile. |
mute | Disattiva l'audio dell'altoparlante dell'aeromobile. |
unmute | Riattiva l'audio dell'altoparlante dell'aeromobile. |
reboot_plain | Riavvia l'aeromobile. |
reboot_poweroff | Spegne l'aeromobile. |
reboot_powersave | Mette l'aeromobile in modalità risparmio energetico. |
device_reset L1 config | Ripristina la configurazione di sistema, flight-controller, gimbal, camera, Wi-Fi e SDR. |
device_reset L2 +MEDIA | Esegue il reset L1 e formatta i media/storage. |
device_reset L3 +log | Esegue il reset L2 e cancella inoltre il log di sistema. |
| Campo | Obbligatorio | Significato |
|---|
label | Sì | Testo visualizzato nel menu. |
cmd_set | Sì | Identificatore del command-set DUML. |
cmd_id | Sì | Identificatore del comando DUML. |
receiver | Sì | Byte del ricevitore sul filo, (index << 5) | type. |
payload | No | Payload esadecimale. |
tier | No | read, write o danger. |
builder | No | Builder interattivo del payload. |
auth | No | Indica che è richiesto un UUID attendibile. |
bt_reply | No | Controlla se il POC attende una risposta Bluetooth. |
sender | No | Byte del mittente; valore predefinito 0x02. |
after | No | Azione successiva opzionale. |
note | No | Descrizione di reverse-engineering mostrata dal POC. |
warn | No | Testo di avviso aggiuntivo visualizzato per i comandi pericolosi. |
| 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. |