
DJI 드론 Bluetooth DUML 명령 주입을 악용하여 인증되지 않은 명령을 전송해 자격 증명을 읽고, 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 자격 증명을 교환하는 데 사용되는 블루투스 인터페이스를 노출합니다
블루투스 인터페이스는 세 가지 명령에 대해 장치의 신뢰할 수 있는 UUID를 확인합니다:
나머지 명령에는 동일한 인증 확인이 필요하지 않습니다. 그 결과, 블루투스 범위 내에 있는 원격 공격자가 드론에 무단 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 | 두 글자 규제 국가 코드를 조회합니다. |
| 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 위키 페이지를 참조하십시오.
POC는 또한 몇 가지 사전 정의된 매크로를 제공합니다:
| 명령 | 설명 |
|---|---|
| Restart Wifi | Wi-Fi를 중지하고 시작합니다 (0x42 다음에 0x41). |
| SET NEW PSK + Restart wifi | PSK를 변경한 다음 Wi-Fi를 재시작합니다. |
| Probe read commands | 등록된 읽기 명령을 전송하고 어떤 명령이 응답하는지 보고합니다. |
매크로는 개별 명령 항목과 별도로 정의됩니다.
⚠️ 경고: 이 개념 증명(proof of concept)은 오직 교육, 보안 연구, 그리고 승인된 침투 테스트 목적으로만 사용해야 합니다.
이 POC는 DJI Bluetooth/DUML 명령 처리 인터페이스의 보안 문제를 보여줍니다. 일부 명령은 기기 구성을 변경하거나, 무선 인터페이스를 비활성화하거나, 연결을 중단시키거나, 항공기를 재부팅 또는 전원 끄기하거나, 구성을 초기화하거나, 저장된 데이터를 삭제할 수 있습니다.
⚠️ 소유하지 않았거나 테스트에 대한 명시적 승인이 없는 항공기, 기기, 네트워크 또는 시스템에 대해 이 POC를 사용하지 마십시오.
일부 명령은 데이터 손실, 구성 변경, 연결 손실, 기기 중단 또는 기타 의도하지 않은 결과를 초래할 수 있습니다. 테스트는 항공기와 주변 사람 및 재산이 위험에 노출되지 않는 통제된 환경에서만 수행해야 합니다.
저자는 이 POC의 사용 또는 오용으로 인해 발생하는 어떠한 손해, 데이터 손실, 서비스 중단, 항공기 운용 또는 기타 결과에 대해서도 책임지지 않습니다.
⚠️ 이 POC를 사용함으로써 귀하는 테스트가 승인되었으며 모든 관련 법률, 규정 및 책임 있는 공개 요건을 준수하도록 보장할 책임을 수락합니다.