
Эксплойт proof-of-concept, использующий инъекцию команд DUML через Bluetooth дронов DJI, отправляющий неаутентифицированные команды для чтения учётных данных, изменения конфигурации Wi-Fi и управления системами летательного аппарата.
Дроны DJI предоставляют интерфейс Bluetooth, используемый для установления соединения с Wi-Fi-интерфейсом дрона и обмена учётными данными Wi-Fi.
Интерфейс Bluetooth проверяет доверенный UUID устройства для трёх команд:
Остальные команды не требуют такой же проверки подлинности. В результате удалённый злоумышленник в зоне действия Bluetooth может отправлять несанкционированные команды DUML на дрон.
В зависимости от команды злоумышленник может изменить конфигурацию дрона, включая смену пароля Wi-Fi и потенциальное получение доступа к внутренней сети дрона, включение или отключение радиоинтерфейсов, перезагрузку или выключение аппарата, сброс конфигурации и выполнение других действий.
POC предоставляет реестр команд, позволяющий тестировать доступные команды без изменения исходного кода Python. Реестр команд, включая команду, получателя, требования аутентификации и описание каждой команды, определён в commands.json.
| Продукт | Затронутая версия |
|---|---|
| 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
Следующие команды зарегистрированы в commands.json. POC разделяет команды на операции чтения, конфигурации, управления радиоинтерфейсами, сброса, системные и параметрические.
Эти операции классифицируются в POC как danger и поэтому требуют явного подтверждения перед отправкой.
Команды управления радиоинтерфейсами реализованы через соответствующие обработчики dji_network.
| Команда | Что делает |
|---|---|
| Factory Reset WIFI | Восстанавливает конфигурацию Wi-Fi до состояния по умолчанию. |
| Factory Restore Params | Восстанавливает таблицу параметров сетевой конфигурации до заводских значений. |
POC помечает обе операции как опасные, поскольку они изменяют постоянную конфигурацию.
| Команда | Что делает |
|---|---|
| Change a parameter | Изменяет параметр конфигурации дрона, используя 32-битный хеш имени. |
| Reset a parameter | Сбрасывает параметр конфигурации до значения по умолчанию прошивки. |
POC получает имена параметров из flyc_parameters.txt и предоставляет интерактивный выбор параметров. Чтобы добавить известный параметр, который вы хотите изменить или сбросить, добавьте его имя в flyc_parameters.txt. После этого параметр станет доступен для выбора при запуске POC.
commands.json, а не кодМеню генерируется из commands.json при запуске. Чтобы добавить команду, добавьте новый объект в список commands раздела. Команда появится при следующем запуске POC.
Пример:
{
"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."
}
Получатель по умолчанию — 0x07 (network:0), отправитель по умолчанию — 0x02 (mobile:0).
Интерактивные конструкторы полезной нагрузки определены в payload_builders.py.
Доступные конструкторы включают:
ssidpskcountrymacchannelbss_typepower_levelrawЧтобы добавить новый конструктор, реализуйте функцию, зарегистрируйте её в BUILDERS и укажите её имя в commands.json.
Команды, классифицированные как 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:
Информация DOES берётся из поля note команды, а дополнительные предупреждения — из поля warn в commands.json.
Функция Change a parameter предоставляет доступ к известным параметрам конфигурации, перечисленным в flyc_parameters.txt.
Параметр можно выбрать по имени, указать его значение, преобразовать в выбранную ширину с прямым порядком байтов и отправить с помощью set_cfg_item (0x03/0xf9).
Reset a parameter использует reset_cfg_item (0x03/0xfa) для восстановления выбранного параметра до значения по умолчанию прошивки.
POC также предоставляет несколько предопределённых макросов:
| Макрос | Описание |
|---|---|
| Restart Wifi | Останавливает и запускает Wi-Fi (0x42, затем 0x41). |
| SET NEW PSK + Restart wifi | Изменяет PSK, а затем перезапускает Wi-Fi. |
| Probe read commands | Отправляет зарегистрированные команды чтения и сообщает, какие команды отвечают. |
Макросы определены отдельно от отдельных записей команд.
⚠️ ВНИМАНИЕ: Данное proof of concept предназначено строго для образовательных целей, исследований в области безопасности и авторизованного тестирования на проникновение.
Данный POC демонстрирует проблемы безопасности в интерфейсе обработки команд DJI Bluetooth/DUML. Некоторые команды могут изменять конфигурацию устройства, отключать радиоинтерфейсы, прерывать соединение, перезагружать или выключать аппарат, сбрасывать конфигурацию или удалять сохранённые данные.
⚠️ НЕ используйте данный POC против любого аппарата, устройства, сети или системы, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.
Некоторые команды могут вызвать потерю данных, изменение конфигурации, потерю соединения, нарушение работы устройства или другие непреднамеренные последствия. Тестирование следует проводить только в контролируемой среде, где аппарат, окружающие люди и имущество не подвергаются риску.
Авторы не несут ответственности за любой ущерб, потерю данных, прерывание обслуживания, работу аппарата или другие последствия, возникшие в результате использования или неправильного использования данного POC.
⚠️ Используя данный POC, вы принимаете на себя ответственность за обеспечение того, чтобы ваше тестирование было авторизованным и соответствовало всем применимым законам, нормативным требованиям и требованиям ответственного раскрытия.
| Команда | Что делает |
|---|
| GET SSID | Получает настроенный SSID Wi-Fi. |
| GET PSK | Получает предварительный общий ключ WPA2 Wi-Fi. |
| 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 | Изменяет настроенный SSID Wi-Fi. |
| 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 и дополнительно очищает системный журнал. |
| Поле | Обязательно | Значение |
|---|
label | Да | Текст, отображаемый в меню. |
cmd_set | Да | Идентификатор набора команд DUML. |
cmd_id | Да | Идентификатор команды DUML. |
receiver | Да | Байт получателя на линии, (index << 5) | type. |
payload | Нет | Полезная нагрузка в hex. |
tier | Нет | read, write или danger. |
builder | Нет | Интерактивный конструктор полезной нагрузки. |
auth | Нет | Указывает, что требуется доверенный UUID. |
bt_reply | Нет | Управляет тем, ожидает ли POC ответа Bluetooth. |
sender | Нет | Байт отправителя; по умолчанию 0x02. |
after | Нет | Необязательное последующее действие. |
note | Нет | Описание обратной разработки, отображаемое POC. |
warn | Нет | Дополнительный текст предупреждения, отображаемый для опасных команд. |
| Файл | Роль |
|---|
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. |