
DJIドローンのBluetooth DUMLコマンドインジェクションを悪用するProof-of-conceptで、認証なしのコマンドを送信して認証情報の読み取り、Wi-Fi設定の変更、機体システムの制御を行う。
DJIドローンは、ドローンのWi-Fiインターフェースへの接続を確立し、Wi-Fi認証情報を交換するために使用されるBluetoothインターフェースを公開しています。
Bluetoothインターフェースは、デバイスの信頼済みUUIDを次の3つのコマンドに対してチェックします:
残りのコマンドには同じ認証チェックが要求されません。その結果、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から取得され、追加の警告はcommands.jsonのwarnフィールドから取得されます。
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 | 登録された読み取りコマンドを送信し、どのコマンドが応答するかを報告します。 |
マクロは個々のコマンドエントリとは別に定義されています。
⚠️ 警告: この概念実証は、教育、セキュリティ研究、および許可されたペネトレーションテストの目的に厳密に限定して意図されています。
このPOCは、DJI Bluetooth/DUMLコマンド処理インターフェースにおけるセキュリティ問題を実証します。一部のコマンドは、デバイス設定の変更、無線インターフェースの無効化、接続の中断、機体の再起動または電源オフ、設定のリセット、または保存データの削除を行う可能性があります。
⚠️ 所有していない、またはテストする明示的な許可を持っていない航空機、デバイス、ネットワーク、またはシステムに対してこのPOCを使用しないでください。
一部のコマンドは、データ損失、設定変更、接続の喪失、デバイスの混乱、またはその他の意図しない結果を引き起こす可能性があります。テストは、航空機および周囲の人々や財産が危険にさらされない制御された環境でのみ実行する必要があります。
著者は、このPOCの使用または誤用から生じるいかなる損害、データ損失、サービス中断、航空機の運用、またはその他の結果についても責任を負いません。
⚠️ このPOCを使用することにより、あなたはテストが許可されており、適用されるすべての法律、規制、および責任ある開示要件に準拠していることを保証する責任を負うことに同意します。
| コマンド | 動作 |
|---|
| GET SSID | 設定されているWi-Fi SSIDを取得します。 |
| GET PSK | Wi-Fi WPA2事前共有鍵を取得します。 |
| GET MAC | Wi-Fi AP MACアドレスを取得します。 |
| GET Country Code | 2文字の規制国コードを取得します。 |
| GET Channel | 現在アクティブなWi-Fiチャネルを取得します。 |
| GET Band | 設定されている2.4/5 GHz帯域の選択を取得します。 |
| 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 | 実行時のWi-Fi BSSID設定を変更します。 |
| SET Country Code | 設定されている規制国コードを変更します。 |
| SET Country Code Ext | 拡張国コード設定を処理します。 |
| SET Channel | Wi-Fiチャネルを変更し、APを再起動させます。 |
| コマンド | 動作 |
|---|
| 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 | いいえ | 16進ペイロード。 |
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 | ターミナルUI、プロンプトおよび出力処理。 |
flyc_parameters.txt | 既知の設定パラメータ名。 |
requirements.txt | Python依存関係。 |