
DJI Drone DUML Command Injection over Bluetooth — Proof of Concept для CVE-2026-78306
Запись CVE: https://www.cve.org/CVERecord?id=CVE-2026-78306
NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-78306
Дроны DJI предоставляют Bluetooth-интерфейс, используемый для установления соединения с Wi-Fi-интерфейсом дрона и обмена учётными данными Wi-Fi.
Bluetooth-интерфейс проверяет доверенный UUID устройства для трёх команд:
Для остальных команд такая же проверка аутентификации не требуется. В результате удалённый атакующий в пределах радиуса действия Bluetooth может отправлять дрону несанкционированные команды DUML.
В зависимости от команды атакующий может изменить конфигурацию дрона, включая смену пароля Wi-Fi и потенциальное получение доступа к внутренней сети дрона; включение или отключение радиинтерфейсов; перезагрузку или выключение аппарата; сброс конфигурации, что приводит к удалению всех видео и фотографий, снятых дроном; а также выполнение других действий.
POC предоставляет реестр команд, позволяющий тестировать доступные команды без изменения исходного кода Python. Реестр команд, включая команду, получателя, требования аутентификации и описание каждой команды, определён в 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
Следующие команды зарегистрированы в commands.json. POC разделяет команды на операции чтения, конфигурации, управления радиоинтерфейсами, сброса, системные и параметрические.
Эти операции классифицируются в POC как danger и поэтому требуют явного подтверждения перед отправкой.
| Команда | Что делает |
|---|---|
| Factory Reset WIFI | Восстанавливает конфигурацию Wi-Fi до состояния по умолчанию. |
| Factory Restore Params | Восстанавливает таблицу параметров сетевой конфигурации до заводских значений. |
POC помечает обе операции как опасные, поскольку они изменяют постоянную конфигурацию.
| Команда | Что делает |
|---|---|
| Change a parameter | Изменяет параметр конфигурации дрона, используя 32-битный хеш его имени. |
| Reset a parameter | Сбрасывает параметр конфигурации до значения по умолчанию в прошивке. |
POC получает имена параметров из flyc_parameters.txt и предоставляет интерактивный выбор параметров. Чтобы добавить известный параметр, который вы хотите изменить или сбросить, добавьте его имя в flyc_parameters.txt. После этого параметр станет доступен для выбора при запуске POC.
Команды, классифицированные как danger, требуют явного подтверждения перед отправкой.
Экран подтверждения отображает такую информацию, как:
──────────────────────────────────────────────────────────────────────
!!! 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:
Функция Change a parameter предоставляет доступ к известным параметрам конфигурации, перечисленным в flyc_parameters.txt.
Reset a parameter использует reset_cfg_item для восстановления выбранного параметра до значения по умолчанию в прошивке.
Полный список извлечённых параметров и дополнительные сведения см. на странице вики FLYC Parameters.
POC также предоставляет несколько предопределённых макросов:
| Макрос | Описание |
|---|---|
| Restart Wifi | Останавливает и запускает Wi-Fi (0x42, затем 0x41). |
| SET NEW PSK + Restart wifi | Изменяет PSK, а затем перезапускает Wi-Fi. |
| Probe read commands | Отправляет зарегистрированные команды чтения и сообщает, какие команды отвечают. |
Макросы определены отдельно от отдельных записей команд.
⚠️ ВНИМАНИЕ: Данное proof of concept предназначено строго для образовательных целей, целей исследования безопасности и авторизованного тестирования на проникновение.
Данный POC демонстрирует проблемы безопасности в интерфейсе обработки команд Bluetooth/DUML дронов DJI. Некоторые команды могут изменять конфигурацию устройства, отключать радиинтерфейсы, прерывать соединение, перезагружать или выключать аппарат, сбрасывать конфигурацию или удалять сохранённые данные.
⚠️ НЕ используйте данный POC против любого аппарата, устройства, сети или системы, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.
Некоторые команды могут вызвать потерю данных, изменение конфигурации, потерю соединения, нарушение работы устройства или другие непреднамеренные последствия. Тестирование следует проводить только в контролируемой среде, где аппарат, окружающие люди и имущество не подвергаются риску.
Авторы не несут ответственности за любой ущерб, потерю данных, прерывание обслуживания, работу аппарата или иные последствия, возникшие в результате использования или неправильного использования данного POC.
⚠️ Используя данный POC, вы принимаете на себя ответственность за обеспечение авторизованности вашего тестирования и его соответствия всем применимым законам, нормативным требованиям и требованиям ответственного раскрытия информации.
| Продукт | Затронутая версия |
|---|
| 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 |
| Команда | Что делает |
|---|
| GET SSID | Получает настроенный Wi-Fi SSID. |
| GET PSK | Получает предварительный ключ Wi-Fi WPA2. |
| GET MAC | Получает MAC-адрес точки доступа Wi-Fi. |
| GET Country Code | Получает двухбуквенный код страны регулирования. |
| GET Channel | Получает текущий активный Wi-Fi-канал. |
| GET Band | Получает настроенный выбор диапазона 2,4/5 ГГц. |
| GET RSSI | Запрашивает обработчик RSSI; данная сборка прошивки содержит заглушку. |
| GET WiFi/BT status | Получает состояние радиомодулей Wi-Fi и Bluetooth. |
| GET Device Info/Model | Получает информацию об устройстве и модели. |
| GET Version | Получает версию демона. |
| GET Bluetooth Name | Получает имя Bluetooth-устройства. |
| Команда | Что делает |
|---|
| SET SSID | Изменяет настроенный Wi-Fi SSID. |
| SET PSK | Изменяет настроенный пароль Wi-Fi. |
| SET MAC Address | Изменяет конфигурацию BSSID Wi-Fi во время выполнения. |
| SET Country Code | Изменяет настроенный код страны регулирования. |
| SET Country Code Ext | Обрабатывает расширенную конфигурацию кода страны. |
| SET Channel | Изменяет Wi-Fi-канал и вызывает перезапуск точки доступа. |
| Команда | Что делает |
|---|
| Start WIFI | Запускает Wi-Fi-интерфейс и связанные службы. |
| Stop WIFI | Останавливает Wi-Fi-интерфейс. |
| Restart WIFI + BT | Перезапускает подсистемы Wi-Fi и Bluetooth. |
| Start Bluetooth | Запускает подсистему Bluetooth. |
| Stop Bluetooth | Останавливает подсистему Bluetooth и завершает текущий сеанс. |
| Sysmode power control | Управляет состоянием питания Wi-Fi/Bluetooth. |
| Команда | Что делает |
|---|
ftpd_start | Запускает службу dji_ftpd. |
storage_export_enable | Включает конфигурацию экспорта хранилища. |
storage_export_disable | Отключает конфигурацию экспорта хранилища. |
play_sound | Воспроизводит звук аппарата. |
mute | Отключает звук динамика аппарата. |
unmute | Включает звук динамика аппарата. |
reboot_plain | Перезагружает аппарат. |
reboot_poweroff | Выключает аппарат. |
reboot_powersave | Переводит аппарат в режим энергосбережения. |
device_reset L1 config | Сбрасывает конфигурации системы, полётного контроллера, подвеса, камеры, Wi-Fi и SDR. |
device_reset L2 +MEDIA | Выполняет сброс L1 и стирает медиахранилище, включая фотографии и видео, снятые дроном. |
device_reset L3 +log | Выполняет сброс L2 и дополнительно очищает системные журналы. |
| Файл | Роль |
|---|
ble_console.py | Главная точка входа, меню и выполнение команд. |
commands.json | Реестр команд и описания команд. |
ble_transport.py | Сканирование Bluetooth GATT, установление соединения и обработка ответов. |
duml_protocol.py | Формирование пакетов DUML v1 и обработка CRC. |
duml_decoders.py | Декодирование ответов и обработка кодов возврата. |
payload_builders.py | Интерактивная генерация полезной нагрузки. |
parameters.py | Хеширование и операции с параметрами конфигурации. |
terminal.py | Терминальный интерфейс, приглашения и обработка вывода. |
flyc_parameters.txt | Известные имена параметров конфигурации. |
requirements.txt | Зависимости Python. |