
حقن أوامر DUML في طائرة DJI Drone عبر 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 عن واجهة Bluetooth تُستخدم لإنشاء اتصال بواجهة Wi-Fi الخاصة بالطائرة وتبادل بيانات اعتماد Wi-Fi.
تتحقق واجهة Bluetooth من UUID الموثوق للجهاز لثلاثة أوامر:
الأوامر المتبقية لا تتطلب نفس فحص المصادقة. ونتيجة لذلك، قد يتمكن مهاجم بعيد ضمن نطاق Bluetooth من إرسال أوامر 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 الأوامر إلى عمليات القراءة والإعدادات والتحكم بالراديو وإعادة التعيين والنظام والمعاملات.
تُصنَّف هذه العمليات على أنها danger في POC، وبالتالي تتطلب تأكيدًا صريحًا قبل إرسالها.
| الأمر | ما الذي يفعله |
|---|---|
| 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 لإعادة المعامل المحدد إلى الوضع الافتراضي للبرنامج الثابت.
للحصول على قائمة كاملة بالمعاملات المستخرجة ومزيد من التفاصيل، راجع صفحة wiki الخاصة بمعاملات FLYC.
يوفر POC أيضًا عدة وحدات ماكرو محددة مسبقًا:
| الماكرو | الوصف |
|---|---|
| Restart Wifi | يوقف ويبدأ Wi-Fi (0x42 متبوعًا بـ 0x41). |
| SET NEW PSK + Restart wifi | يغيّر PSK ثم يعيد تشغيل Wi-Fi. |
| Probe read commands | يرسل أوامر القراءة المسجلة ويبلّغ عن الأوامر التي تستجيب. |
يتم تعريف وحدات الماكرو بشكل منفصل عن إدخالات الأوامر الفردية.
⚠️ تحذير: هذا الإثبات للمفهوم مخصص بدقة لأغراض تعليمية وبحث أمني واختبار اختراق مصرح به.
يوضح POC هذا مشكلات أمنية في واجهة معالجة أوامر Bluetooth/DUML الخاصة بـ DJI. يمكن لبعض الأوامر تعديل إعدادات الجهاز، أو تعطيل واجهات الراديو، أو مقاطعة الاتصال، أو إعادة تشغيل الطائرة أو إيقاف تشغيلها، أو إعادة تعيين الإعدادات، أو حذف البيانات المخزنة.
⚠️ لا تستخدم 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 | يسترجع SSID الخاص بـ Wi-Fi المُهيأ. |
| GET PSK | يسترجع مفتاح WPA2 المشترك المسبق الخاص بـ Wi-Fi. |
| GET MAC | يسترجع عنوان MAC لنقطة الوصول Wi-Fi. |
| 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 | يغيّر SSID الخاص بـ Wi-Fi المُهيأ. |
| SET PSK | يغيّر كلمة مرور Wi-Fi المُهيأة. |
| SET MAC Address | يغيّر إعدادات BSSID الخاصة بـ Wi-Fi أثناء التشغيل. |
| SET Country Code | يغيّر رمز البلد التنظيمي المُهيأ. |
| SET Country Code Ext | يتعامل مع إعدادات رمز البلد الموسّعة. |
| SET Channel | يغيّر قناة Wi-Fi ويؤدي إلى إعادة تشغيل نقطة الوصول. |
| الأمر | ما الذي يفعله |
|---|
| 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 بالإضافة إلى مسح سجلات النظام. |
| الملف | الدور |
|---|
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 | واجهة الطرفية والمطالبات ومعالجة المخرجات. |
flyc_parameters.txt | أسماء معاملات الإعدادات المعروفة. |
requirements.txt | تبعيات Python. |