
DJI 드론 DUML 명령 주입 (Bluetooth 경유) — CVE-2026-78306 개념 증명
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 인터페이스는 세 가지 명령에 대해 장치의 신뢰할 수 있는 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.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는 명령을 읽기, 구성, 무선 제어, 초기화, 시스템 및 매개변수 작업으로 구분합니다.
| 명령 | 수행하는 작업 |
|---|---|
| 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 및 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를 재시작하게 합니다. |
이러한 작업은 POC에서 danger로 분류되므로 전송 전에 명시적인 확인이 필요합니다.
| 명령 | 수행하는 작업 |
|---|---|
| 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 전원 상태를 제어합니다. |
| 명령 | 수행하는 작업 |
|---|---|
| Factory Reset WIFI | Wi-Fi 구성을 기본 상태로 복원합니다. |
| Factory Restore Params | 네트워크 구성 매개변수 테이블을 공장 기본값으로 복원합니다. |
POC는 두 작업 모두 영구 구성을 수정하므로 위험한 것으로 표시합니다.
| 명령 | 수행하는 작업 |
|---|---|
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 초기화를 수행하고 추가로 시스템 로그를 지웁니다. |
| 명령 | 수행하는 작업 |
|---|---|
| Change a parameter | 32비트 이름 해시를 사용하여 드론 구성 매개변수를 변경합니다. |
| Reset a parameter | 구성 매개변수를 펌웨어 기본값으로 초기화합니다. |
POC는 flyc_parameters.txt에서 매개변수 이름을 가져오고 대화형 매개변수 선택을 제공합니다. 수정하거나 초기화하려는 알려진 매개변수를 추가하려면 해당 이름을 flyc_parameters.txt에 추가하십시오. 그러면 POC가 시작될 때 해당 매개변수를 선택할 수 있습니다.
danger로 분류된 명령은 전송 전에 명시적인 확인이 필요합니다.
확인 화면에는 다음과 같은 정보가 표시됩니다: