
DJIドローン DUML コマンドインジェクション(Bluetooth経由) — CVE-2026-78306 の概念実証
CVE record: https://www.cve.org/CVERecord?id=CVE-2026-78306
NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-78306
DJIドローンは、ドローンのWi-Fiインターフェースへの接続を確立し、Wi-Fi認証情報を交換するために使用されるBluetoothインターフェースを公開しています。
Bluetoothインターフェースは、デバイスの信頼済みUUIDを次の3つのコマンドに対してチェックします:
残りのコマンドには同じ認証チェックが要求されません。その結果、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に分類されるため、送信前に明示的な確認が必要です。
| Command | What it does |
|---|---|
| Factory Reset WIFI | Restores the Wi-Fi configuration to its default state. |
| Factory Restore Params | Restores the network configuration parameter table to factory defaults. |
POCは、これらの操作が永続的な設定を変更するため、両方とも危険であるとマークしています。
| Command | What it does |
|---|---|
| Change a parameter | Changes a drone configuration parameter using its 32-bit name hash. |
| Reset a parameter | Resets a configuration parameter to its firmware default. |
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 wiki pageを参照してください。
POCはいくつかの定義済みマクロも提供します:
| Macro | Description |
|---|---|
| Restart Wifi | Stops and starts Wi-Fi (0x42 followed by 0x41). |
| SET NEW PSK + Restart wifi | Changes the PSK and then restarts Wi-Fi. |
| Probe read commands | Sends the registered read commands and reports which commands respond. |
マクロは個々のコマンドエントリとは別に定義されています。
⚠️ 警告: この概念実証は、教育、セキュリティ研究、および許可されたペネトレーションテストの目的に厳密に限定して使用されることを意図しています。
このPOCは、DJIのBluetooth/DUMLコマンド処理インターフェースにおけるセキュリティ問題を実証します。一部のコマンドは、デバイス設定の変更、無線インターフェースの無効化、接続の中断、機体の再起動または電源オフ、設定のリセット、または保存データの削除を行う可能性があります。
⚠️ 自身が所有していない、またはテストする明示的な許可を持っていない航空機、デバイス、ネットワーク、またはシステムに対して、このPOCを使用しないでください。
一部のコマンドは、データ損失、設定変更、接続の喪失、デバイスの混乱、またはその他の意図しない結果を引き起こす可能性があります。テストは、航空機および周囲の人や財産が危険にさらされない制御された環境でのみ実施してください。
著者は、このPOCの使用または誤用に起因するいかなる損害、データ損失、サービス中断、航空機の運用、またはその他の結果についても責任を負いません。
⚠️ このPOCを使用することにより、あなたは自身のテストが許可されており、適用されるすべての法律、規制、および責任ある開示要件に準拠していることを保証する責任を負うことに同意するものとします。
| Product | Affected Version |
|---|
| 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 |
| Command | What it does |
|---|
| GET SSID | Retrieves the configured Wi-Fi SSID. |
| GET PSK | Retrieves the Wi-Fi WPA2 pre-shared key. |
| GET MAC | Retrieves the Wi-Fi AP MAC address. |
| GET Country Code | Retrieves the two-letter regulatory country code. |
| GET Channel | Retrieves the currently active Wi-Fi channel. |
| GET Band | Retrieves the configured 2.4/5 GHz band selection. |
| GET RSSI | Queries the RSSI handler; this firmware build contains a stub implementation. |
| GET WiFi/BT status | Retrieves the Wi-Fi and Bluetooth radio state. |
| GET Device Info/Model | Retrieves device and model information. |
| GET Version | Retrieves the daemon version. |
| GET Bluetooth Name | Retrieves the Bluetooth device name. |
| Command | What it does |
|---|
| SET SSID | Changes the configured Wi-Fi SSID. |
| SET PSK | Changes the configured Wi-Fi password. |
| SET MAC Address | Changes the runtime Wi-Fi BSSID configuration. |
| SET Country Code | Changes the configured regulatory country code. |
| SET Country Code Ext | Handles extended country-code configuration. |
| SET Channel | Changes the Wi-Fi channel and causes the AP to restart. |
| Command | What it does |
|---|
| Start WIFI | Starts the Wi-Fi interface and associated services. |
| Stop WIFI | Stops the Wi-Fi interface. |
| Restart WIFI + BT | Restarts the Wi-Fi and Bluetooth subsystems. |
| Start Bluetooth | Starts the Bluetooth subsystem. |
| Stop Bluetooth | Stops the Bluetooth subsystem and terminates the current session. |
| Sysmode power control | Controls the Wi-Fi/Bluetooth power state. |
| Command | What it does |
|---|
ftpd_start | Starts the dji_ftpd service. |
storage_export_enable | Enables the storage-export configuration. |
storage_export_disable | Disables the storage-export configuration. |
play_sound | Triggers an aircraft sound. |
mute | Mutes the aircraft speaker. |
unmute | Unmutes the aircraft speaker. |
reboot_plain | Reboots the aircraft. |
reboot_poweroff | Powers off the aircraft. |
reboot_powersave | Places the aircraft into power-save mode. |
device_reset L1 config | Resets the system, flight controller, gimbal, camera, Wi-Fi, and SDR configurations. |
device_reset L2 +MEDIA | Performs the L1 reset and wipes media storage, including pictures and videos captured by the drone. |
device_reset L3 +log | Performs the L2 reset and additionally clears the system logs. |
| File | Role |
|---|
ble_console.py | Main entry point, menu and command execution. |
commands.json | Command registry and command descriptions. |
ble_transport.py | Bluetooth GATT scanning, connection and response handling. |
duml_protocol.py | DUML v1 packet construction and CRC handling. |
duml_decoders.py | Response decoding and return-code handling. |
payload_builders.py | Interactive payload generation. |
parameters.py | Configuration parameter hashing and operations. |
terminal.py | Terminal UI, prompts and output handling. |
flyc_parameters.txt | Known configuration parameter names. |
requirements.txt | Python dependencies. |