
DJIドローンのBluetooth DUMLコマンドインジェクションを悪用するProof-of-conceptで、認証なしのコマンドを送信して認証情報の読み取り、Wi-Fi設定の変更、機体システムの制御を行う。
CVEレコード: 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インターフェースは、次の3つのコマンドについてデバイスの信頼済みUUIDを確認します:
残りのコマンドには、同じ認証チェックは要求されません。その結果、Bluetoothの範囲内にいるリモート攻撃者が、不正なDUMLコマンドをドローンに送信できる可能性があります。
コマンドによっては、攻撃者はドローンの設定を変更できる可能性があり、これにはWi-Fiパスワードの変更やドローンの内部ネットワークへのアクセス取得の可能性が含まれます。また、無線インターフェースの有効化または無効化、機体の再起動または電源オフ、ドローンで撮影されたすべての動画や写真を消去する設定のリセット、その他の操作を実行できる可能性があります。
注記: このエクスプロイトは現在、Wi-Fi経由でドローンを操作している飛行中、および無線経由でドローンを操作している地上時/ドローン着陸時に動作します。
| 製品 | 影響を受けるバージョン |
|---|---|
| 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.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 に登録されており、そこから直接生成されます。danger とマークされたコマンドは、送信前に明示的な確認が必要です。
| コマンド | 動作 |
|---|---|
| GET WiFi SSID [AUTH] | 設定済みのWi-Fi SSIDを取得します。信頼済みUUIDが必要です。 |
| GET WiFi Password [AUTH] | Wi-Fi WPA2事前共有鍵を取得します。信頼済みUUIDが必要です。 |
| GET WiFi MAC address [AUTH] | Wi-Fi APのMACアドレスを取得します。信頼済みUUIDが必要です。 |
| GET Country Code | 2文字の規制国コードを取得します。 |
| GET Channel | 現在アクティブなWi-Fiチャネルを取得します。 |
| GET Band | 設定済みの2.4/5 GHz帯域選択を取得します。 |
| GET RSSI [stub] | RSSIハンドラに問い合わせます。このビルドではスタブ値を返します。 |
| GET WiFi/BT status | Wi-FiおよびBluetooth無線の状態を取得します。 |
| GET Version | ファームウェアのバージョン文字列を取得します。 |
| コマンド | 動作 |
|---|---|
| SET NEW WiFi SSID | 設定済みのWi-Fi SSIDを変更します。 |
| SET NEW WiFi Password | 設定済みのWi-Fiパスワードを変更します。 |
| SET NEW WiFi MAC Address | 実行時のWi-Fi BSSID設定を変更します。 |
| SET NEW Country Code | 設定済みの規制国コードを変更します。 |
| SET NEW Country Code Ext | 拡張国コード設定を処理します。 |
| SET NEW Channel | Wi-Fiチャネルを変更し、APを再起動させます。 |
これらの操作はPOCでは danger に分類されるため、送信前に明示的な確認が必要です。
| コマンド | 動作 |
|---|---|
| Start WiFi | Wi-Fiインターフェースを起動します。 |
| Stop WiFi | Wi-Fiインターフェースを停止します。 |
| Restart WiFi + Bluetooth | Wi-FiおよびBluetooth無線を再起動します。 |
| Start Bluetooth | Bluetooth無線を起動します。 |
| Stop Bluetooth | Bluetooth無線を停止し、現在のセッションを終了します。 |
| Sysmode power control | Wi-Fi/Bluetooth無線の電源状態を制御します。 |
| コマンド | 動作 |
|---|---|
| Factory Reset WIFI | Wi-Fi設定をデフォルト状態に復元します。 |
| Factory Restore Params | ネットワーク設定を工場出荷時のデフォルトに復元します。 |
POCは、これらの操作が永続的な設定を変更するため、両方を危険とマークしています。
| コマンド | 動作 |
|---|---|
| Start The Drone FTP server | 機体のFTPサービスを起動します。 |
| Enable Storage Export | ストレージエクスポートを有効にします。 |
| Disable Storage Export | ストレージエクスポートを無効にします。 |
| reboot The Drone | 機体を再起動します。 |
| poweroff The Drone | 機体の電源を切ります(再度電源を入れるには物理的なアクセスが必要です)。 |
| powersave mode The Drone | 機体を省電力モードに移行します。 |
| コマンド | 動作 |
|---|---|
| Start Remote Controller DoS | リモートコントローラー拒否サービスシーケンスの最初のステップです。切断ステップが必要とする状態に機体を移行します。 |
| Stop Remote Controller DoS | シーケンスを完了します。機体がコントローラーリンクへの応答を停止するため、リモートコントローラーは機体を見失います。事前に最初のステップを実行してください。 |
| Remote Controller Recover | 機体を通常動作に戻そうと試みます。 |
| コマンド | 動作 |
|---|---|
| Change a parameter | 32ビットの名前ハッシュを使用してドローンの設定パラメータを変更します。 |
| Reset a parameter | 設定パラメータをファームウェアのデフォルトにリセットします。 |
POCは flyc_parameters.txt からパラメータ名を取得し、対話的なパラメータ選択を提供します。変更またはリセットしたい既知のパラメータを追加するには、その名前を flyc_parameters.txt に追加してください。その後、POCの起動時にそのパラメータを選択できるようになります。
danger に分類されたコマンドは、送信前に明示的な確認が必要です。
確認画面には次のような情報が表示されます:
──────────────────────────────────────────────────────────────────────
!!! DANGEROUS COMMAND !!!
──────────────────────────────────────────────────────────────────────
COMMAND Factory Reset WIFI
ROUTE 07/0f → 0x07
PAYLOAD (none)
DOES resets the Wi-Fi config and regenerates the PSK
WARNING Disconnects every device currently on the drone's Wi-Fi.
──────────────────────────────────────────────────────────────────────
Type YES to send:
Change a parameter 関数は、flyc_parameters.txt に記載されている既知の設定パラメータへのアクセスを提供します。
Reset a parameter は reset_cfg_item を使用して、選択したパラメータをファームウェアのデフォルト値に復元します。
抽出されたパラメータの完全なリストと詳細については、FLYC Parameters wiki ページを参照してください。
この POC では、いくつかの定義済みマクロも提供しています:
| コマンド | 説明 |
|---|---|
| Restart Wifi | Wi-Fi を停止して起動します(0x42 に続いて 0x41)。 |
| SET NEW PSK + Restart wifi | PSK を変更してから Wi-Fi を再起動します。 |
| Probe read commands | 登録済みの読み取りコマンドを送信し、どのコマンドが応答するかを報告します。 |
マクロは個々のコマンドエントリとは別に定義されています。
⚠️ 警告: この実証コード(POC)は、教育、セキュリティ研究、および許可されたペネトレーションテストの目的に厳密に限定して使用することを意図しています。
この POC は、DJI の Bluetooth/DUML コマンド処理インターフェースにおけるセキュリティ上の問題を実証するものです。一部のコマンドは、デバイス設定の変更、無線インターフェースの無効化、接続の中断、機体の再起動や電源オフ、設定のリセット、または保存データの削除を引き起こす可能性があります。
⚠️ 自身が所有していない、または明示的なテスト許可を得ていない航空機、デバイス、ネットワーク、システムに対してこの POC を使用しないでください。
一部のコマンドは、データ損失、設定変更、接続喪失、デバイスの機能停止、その他の意図しない結果を引き起こす可能性があります。テストは、航空機および周囲の人や財産に危険が及ばない制御された環境でのみ実施してください。
著者は、この POC の使用または誤用に起因するいかなる損害、データ損失、サービス中断、航空機の運用、その他の結果についても責任を負いません。
⚠️ この POC を使用することにより、あなたは自身のテストが許可されており、適用されるすべての法律、規制、および責任ある開示の要件を遵守していることを保証する責任を負うことに同意するものとします。