
Proof-of-concept que explora a injeção de comandos DUML via Bluetooth em drones DJI, enviando comandos não autenticados para ler credenciais, alterar a configuração de Wi-Fi e controlar os sistemas da aeronave.
Os drones DJI expõem uma interface Bluetooth usada para estabelecer uma conexão com a interface Wi-Fi do drone e trocar credenciais de Wi-Fi.
A interface Bluetooth verifica o UUID confiável do dispositivo para três comandos:
Os comandos restantes não exigem a mesma verificação de autenticação. Como resultado, um atacante remoto dentro do alcance do Bluetooth pode ser capaz de enviar comandos DUML não autorizados ao drone.
Dependendo do comando, um atacante pode ser capaz de modificar a configuração do drone, incluindo alterar a senha do Wi-Fi e potencialmente obter acesso à rede interna do drone, habilitar ou desabilitar interfaces de rádio, reiniciar ou desligar a aeronave, redefinir a configuração e realizar outras ações.
O POC fornece um registro de comandos que permite testar os comandos disponíveis sem modificar o código-fonte Python. O registro de comandos, incluindo o comando, o receptor, os requisitos de autenticação e a descrição de cada comando, é definido em commands.json.
| Produto | Versão Afetada |
|---|---|
| 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
Os comandos a seguir estão registrados em commands.json. O POC separa os comandos em operações de leitura, configuração, controle de rádio, redefinição, sistema e parâmetros.
Essas operações são classificadas como danger no POC e, portanto, exigem confirmação explícita antes de serem enviadas.
Os comandos de controle de rádio são implementados através dos manipuladores dji_network correspondentes.
| Comando | O que faz |
|---|---|
| Factory Reset WIFI | Restaura a configuração de Wi-Fi ao seu estado padrão. |
| Factory Restore Params | Restaura a tabela de parâmetros de configuração de rede aos padrões de fábrica. |
O POC marca ambas as operações como perigosas porque elas modificam a configuração persistente.
| Comando | O que faz |
|---|---|
| Change a parameter | Altera um parâmetro de configuração do drone usando seu hash de nome de 32 bits. |
| Reset a parameter | Redefine um parâmetro de configuração ao seu padrão de firmware. |
O POC obtém os nomes dos parâmetros de flyc_parameters.txt e fornece seleção interativa de parâmetros. Para adicionar um parâmetro conhecido que você deseja modificar ou redefinir, adicione seu nome a flyc_parameters.txt. O parâmetro ficará então disponível para seleção quando o POC for iniciado.
commands.json, Não o CódigoO menu é gerado a partir de commands.json na inicialização. Para adicionar um comando, adicione um novo objeto à lista commands de uma seção. O comando aparecerá na próxima vez que o POC for iniciado.
Exemplo:
{
"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."
}
O receptor padrão é 0x07 (network:0) e o remetente padrão é 0x02 (mobile:0).
Os construtores interativos de payload são definidos em payload_builders.py.
Os construtores disponíveis incluem:
ssidpskcountrymacchannelbss_typepower_levelrawPara adicionar um novo construtor, implemente a função, registre-a em BUILDERS e faça referência ao seu nome a partir de commands.json.
Os comandos classificados como danger exigem confirmação explícita antes da transmissão.
A tela de confirmação exibe informações 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:
A informação DOES é obtida do note do comando, enquanto avisos adicionais são obtidos do campo warn em commands.json.
A função Change a parameter fornece acesso aos parâmetros de configuração conhecidos listados em flyc_parameters.txt.
Um parâmetro pode ser selecionado por nome, fornecido com um valor, convertido para a largura little-endian selecionada e enviado usando set_cfg_item (0x03/0xf9).
Reset a parameter usa reset_cfg_item (0x03/0xfa) para restaurar o parâmetro selecionado ao seu padrão de firmware.
O POC também fornece várias macros predefinidas:
| Macro | Descrição |
|---|---|
| Restart Wifi | Para e inicia o Wi-Fi (0x42 seguido de 0x41). |
| SET NEW PSK + Restart wifi | Altera a PSK e então reinicia o Wi-Fi. |
| Probe read commands | Envia os comandos de leitura registrados e informa quais comandos respondem. |
As macros são definidas separadamente das entradas de comando individuais.
⚠️ AVISO: Esta prova de conceito destina-se estritamente a fins educacionais, de pesquisa de segurança e de testes de penetração autorizados.
Este POC demonstra problemas de segurança na interface de tratamento de comandos Bluetooth/DUML da DJI. Alguns comandos podem modificar a configuração do dispositivo, desabilitar interfaces de rádio, interromper a conectividade, reiniciar ou desligar a aeronave, redefinir a configuração ou excluir dados armazenados.
⚠️ NÃO use este POC contra qualquer aeronave, dispositivo, rede ou sistema que você não possua ou não tenha autorização explícita para testar.
Alguns comandos podem causar perda de dados, alterações de configuração, perda de conectividade, interrupção do dispositivo ou outras consequências não intencionais. Os testes devem ser realizados apenas em um ambiente controlado onde a aeronave e as pessoas e propriedades ao redor não estejam em risco.
Os autores não são responsáveis por qualquer dano, perda de dados, interrupção de serviço, operação da aeronave ou outras consequências resultantes do uso ou uso indevido deste POC.
⚠️ Ao usar este POC, você aceita a responsabilidade de garantir que seus testes sejam autorizados e estejam em conformidade com todas as leis, regulamentos e requisitos de divulgação responsável aplicáveis.
| Comando | O que faz |
|---|
| GET SSID | Recupera o SSID de Wi-Fi configurado. |
| GET PSK | Recupera a chave pré-compartilhada WPA2 do Wi-Fi. |
| GET MAC | Recupera o endereço MAC do AP Wi-Fi. |
| GET Country Code | Recupera o código de país regulatório de duas letras. |
| GET Channel | Recupera o canal de Wi-Fi atualmente ativo. |
| GET Band | Recupera a seleção de banda 2.4/5 GHz configurada. |
| GET RSSI | Consulta o manipulador RSSI; esta compilação de firmware contém uma implementação stub. |
| GET WiFi/BT status | Recupera o estado dos rádios Wi-Fi e Bluetooth. |
| GET Device Info/Model | Recupera informações do dispositivo e do modelo. |
| GET Version | Recupera a versão do daemon. |
| GET Bluetooth Name | Recupera o nome do dispositivo Bluetooth. |
| Comando | O que faz |
|---|
| SET SSID | Altera o SSID de Wi-Fi configurado. |
| SET PSK | Altera a senha de Wi-Fi configurada. |
| SET MAC Address | Altera a configuração de BSSID do Wi-Fi em tempo de execução. |
| SET Country Code | Altera o código de país regulatório configurado. |
| SET Country Code Ext | Lida com a configuração estendida de código de país. |
| SET Channel | Altera o canal de Wi-Fi e faz o AP reiniciar. |
| Comando | O que faz |
|---|
| Start WIFI | Inicia a interface Wi-Fi e os serviços associados. |
| Stop WIFI | Para a interface Wi-Fi. |
| Restart WIFI + BT | Reinicia os subsistemas Wi-Fi e Bluetooth. |
| Start Bluetooth | Inicia o subsistema Bluetooth. |
| Stop Bluetooth | Para o subsistema Bluetooth e encerra a sessão atual. |
| Sysmode power control | Controla o estado de energia do Wi-Fi/Bluetooth. |
| Comando | O que faz |
|---|
ftpd_start | Inicia o serviço dji_ftpd. |
storage_export_enable | Habilita a configuração de exportação de armazenamento. |
storage_export_disable | Desabilita a configuração de exportação de armazenamento. |
play_sound | Dispara um som da aeronave. |
mute | Silencia o alto-falante da aeronave. |
unmute | Reativa o som do alto-falante da aeronave. |
reboot_plain | Reinicia a aeronave. |
reboot_poweroff | Desliga a aeronave. |
reboot_powersave | Coloca a aeronave em modo de economia de energia. |
device_reset L1 config | Redefine as configurações de sistema, controlador de voo, gimbal, câmera, Wi-Fi e SDR. |
device_reset L2 +MEDIA | Executa a redefinição L1 e formata mídia/armazenamento. |
device_reset L3 +log | Executa a redefinição L2 e adicionalmente limpa o log do sistema. |
| Campo | Obrigatório | Significado |
|---|
label | Sim | Texto exibido no menu. |
cmd_set | Sim | Identificador do conjunto de comandos DUML. |
cmd_id | Sim | Identificador do comando DUML. |
receiver | Sim | Byte do receptor no fio, (index << 5) | type. |
payload | Não | Payload em hexadecimal. |
tier | Não | read, write ou danger. |
builder | Não | Construtor interativo de payload. |
auth | Não | Indica que um UUID confiável é necessário. |
bt_reply | Não | Controla se o POC aguarda uma resposta Bluetooth. |
sender | Não | Byte do remetente; o padrão é 0x02. |
after | Não | Ação de acompanhamento opcional. |
note | Não | Descrição de engenharia reversa exibida pelo POC. |
warn | Não | Texto de aviso adicional exibido para comandos perigosos. |
| Arquivo | Função |
|---|
ble_console.py | Ponto de entrada principal, menu e execução de comandos. |
commands.json | Registro de comandos e descrições de comandos. |
ble_transport.py | Varredura GATT Bluetooth, conexão e tratamento de respostas. |
duml_protocol.py | Construção de pacotes DUML v1 e tratamento de CRC. |
duml_decoders.py | Decodificação de respostas e tratamento de códigos de retorno. |
payload_builders.py | Geração interativa de payload. |
parameters.py | Hashing e operações de parâmetros de configuração. |
terminal.py | Interface de terminal, prompts e tratamento de saída. |
flyc_parameters.txt | Nomes de parâmetros de configuração conhecidos. |
requirements.txt | Dependências Python. |