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 凭据。
该蓝牙接口仅对三个命令检查设备的受信任 UUID:
其余命令不需要相同的身份验证检查。因此,处于蓝牙范围内的远程攻击者可能能够向无人机发送未经授权的 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 参数 wiki 页面。
该 POC 还提供了几个预定义宏:
| 宏 | 描述 |
|---|---|
| Restart Wifi | 停止并启动 Wi-Fi(0x42 后跟 0x41)。 |
| SET NEW PSK + Restart wifi | 更改 PSK,然后重启 Wi-Fi。 |
| Probe read commands | 发送已注册的读取命令并报告哪些命令有响应。 |
这些宏与各个命令条目分开定义。
⚠️ 警告:此概念验证严格用于教育、安全研究和授权的渗透测试目的。
此 POC 演示了 DJI 蓝牙/DUML 命令处理接口中的安全问题。某些命令可以修改设备配置、禁用无线电接口、中断连接、重启或关闭飞行器、重置配置或删除存储的数据。
⚠️ 请勿对任何您不拥有或没有明确授权测试的飞行器、设备、网络或系统使用此 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 | 检索 Wi-Fi AP MAC 地址。 |
| GET Country Code | 检索两个字母的监管国家代码。 |
| GET Channel | 检索当前活动的 Wi-Fi 信道。 |
| GET Band | 检索已配置的 2.4/5 GHz 频段选择。 |
| GET RSSI | 查询 RSSI 处理程序;此固件版本包含一个存根实现。 |
| GET WiFi/BT status | 检索 Wi-Fi 和蓝牙无线电状态。 |
| GET Device Info/Model | 检索设备和型号信息。 |
| GET Version | 检索守护进程版本。 |
| GET Bluetooth Name | 检索蓝牙设备名称。 |
| 命令 | 功能 |
|---|
| 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 和蓝牙子系统。 |
| Start Bluetooth | 启动蓝牙子系统。 |
| Stop Bluetooth | 停止蓝牙子系统并终止当前会话。 |
| Sysmode power control | 控制 Wi-Fi/蓝牙电源状态。 |
| 命令 | 功能 |
|---|
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 | 蓝牙 GATT 扫描、连接和响应处理。 |
duml_protocol.py | DUML v1 数据包构造和 CRC 处理。 |
duml_decoders.py | 响应解码和返回码处理。 |
payload_builders.py | 交互式载荷生成。 |
parameters.py | 配置参数哈希和操作。 |
terminal.py | 终端 UI、提示和输出处理。 |
flyc_parameters.txt | 已知配置参数名称。 |
requirements.txt | Python 依赖项。 |