
إثبات مفهوم يستغل حقن أوامر DUML عبر البلوتوث في طائرات DJI بدون طيار، حيث يرسل أوامر غير موثّقة لقراءة بيانات الاعتماد، وتعديل إعدادات Wi-Fi، والتحكم في أنظمة الطائرة.
تكشف طائرات DJI بدون طيار عن واجهة Bluetooth تُستخدم لإنشاء اتصال بواجهة Wi-Fi الخاصة بالطائرة وتبادل بيانات اعتماد Wi-Fi.
تتحقق واجهة 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-POC.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، وبالتالي تتطلب تأكيدًا صريحًا قبل إرسالها.
يتم تنفيذ أوامر التحكم بالراديو من خلال معالجات dji_network المقابلة.
| الأمر | ما الذي يفعله |
|---|---|
| Factory Reset WIFI | يعيد إعدادات Wi-Fi إلى حالتها الافتراضية. |
| Factory Restore Params | يعيد جدول معاملات إعدادات الشبكة إلى إعدادات المصنع الافتراضية. |
يصنّف POC كلا العمليتين على أنهما خطيرتان لأنهما تعدّلان الإعدادات الدائمة.
| الأمر | ما الذي يفعله |
|---|---|
| Change a parameter | يغيّر معامل إعدادات الطائرة باستخدام تجزئة اسمه 32-بت. |
| Reset a parameter | يعيد معامل إعدادات إلى الوضع الافتراضي للبرنامج الثابت. |
يحصل POC على أسماء المعاملات من flyc_parameters.txt ويوفر اختيارًا تفاعليًا للمعاملات. لإضافة معامل معروف تريد تعديله أو إعادة تعيينه، أضف اسمه إلى flyc_parameters.txt. سيصبح المعامل بعد ذلك متاحًا للاختيار عند تشغيل POC.
commands.json، وليس الكودتُنشأ القائمة من commands.json عند بدء التشغيل. لإضافة أمر، أضف كائنًا جديدًا إلى قائمة commands الخاصة بقسم ما. سيظهر الأمر في المرة التالية التي يتم فيها تشغيل POC.
مثال:
{
"label": "GET Channel",
"cmd_set": "0x07",
"cmd_id": "0x2c",
"receiver": "0x07",
"payload": "",
"tier": "read",
"bt_reply": true,
"note": "wms_evt_get_chan -> wifi_mgmt_get_chan."
}
المستقبل الافتراضي هو 0x07 (network:0) والمرسل الافتراضي هو 0x02 (mobile:0).
تُعرّف منشئات الحمولة التفاعلية في payload_builders.py.
تشمل المنشئات المتاحة:
ssidpskcountrymacchannelbss_typepower_levelrawلإضافة منشئ جديد، نفّذ الدالة، وسجّلها في BUILDERS، وأشر إلى اسمها من commands.json.
الأوامر المصنّفة على أنها 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:
تُؤخذ معلومات DOES من حقل note الخاص بالأمر، بينما تُؤخذ التحذيرات الإضافية من حقل warn في commands.json.
توفر وظيفة Change a parameter وصولًا إلى معاملات الإعدادات المعروفة المدرجة في flyc_parameters.txt.
يمكن اختيار معامل بالاسم، وتزويده بقيمة، وتحويله إلى عرض little-endian المحدد، وإرساله باستخدام set_cfg_item (0x03/0xf9).
تستخدم Reset a parameter الأمر reset_cfg_item (0x03/0xfa) لإعادة المعامل المحدد إلى الوضع الافتراضي للبرنامج الثابت.
يوفر POC أيضًا عدة وحدات ماكرو معرّفة مسبقًا:
| الماكرو | الوصف |
|---|---|
| Restart Wifi | يوقف ويبدأ Wi-Fi (0x42 متبوعًا بـ 0x41). |
| SET NEW PSK + Restart wifi | يغيّر PSK ثم يعيد تشغيل Wi-Fi. |
| Probe read commands | يرسل أوامر القراءة المسجلة ويبلّغ عن الأوامر التي تستجيب. |
تُعرّف وحدات الماكرو بشكل منفصل عن إدخالات الأوامر الفردية.
⚠️ تحذير: هذا الإثبات العملي مخصص بشكل صارم للأغراض التعليمية، والبحث الأمني، واختبار الاختراق المصرح به.
يوضح POC هذا مشكلات أمنية في واجهة معالجة أوامر DJI Bluetooth/DUML. يمكن لبعض الأوامر تعديل إعدادات الجهاز، أو تعطيل واجهات الراديو، أو مقاطعة الاتصال، أو إعادة تشغيل الطائرة أو إيقاف تشغيلها، أو إعادة تعيين الإعدادات، أو حذف البيانات المخزنة.
⚠️ لا تستخدم POC هذا ضد أي طائرة أو جهاز أو شبكة أو نظام لا تملكه أو لا تملك تفويضًا صريحًا لاختباره.
قد تتسبب بعض الأوامر في فقدان البيانات، أو تغييرات في الإعدادات، أو فقدان الاتصال، أو تعطيل الجهاز، أو غيرها من العواقب غير المقصودة. يجب إجراء الاختبار فقط في بيئة خاضعة للرقابة حيث لا تكون الطائرة والأشخاص والممتلكات المحيطة في خطر.
المؤلفون غير مسؤولين عن أي ضرر أو فقدان بيانات أو انقطاع خدمة أو تشغيل طائرة أو أي عواقب أخرى ناتجة عن استخدام أو إساءة استخدام POC هذا.
⚠️ باستخدامك POC هذا، فإنك تتحمل مسؤولية ضمان أن اختبارك مصرح به ويمتثل لجميع القوانين واللوائح ومتطلبات الإفصاح المسؤول المعمول بها.
| الأمر | ما الذي يفعله |
|---|
| 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 بالإضافة إلى مسح سجل النظام. |
| الحقل | مطلوب | المعنى |
|---|
label | نعم | النص المعروض في القائمة. |
cmd_set | نعم | معرّف مجموعة أوامر DUML. |
cmd_id | نعم | معرّف أمر DUML. |
receiver | نعم | بايت المستقبل على السلك، (index << 5) | type. |
payload | لا | حمولة سداسية عشرية. |
tier | لا | read أو write أو danger. |
builder | لا | منشئ حمولة تفاعلي. |
auth | لا | يشير إلى أن UUID موثوقًا مطلوب. |
bt_reply | لا | يتحكم فيما إذا كان POC ينتظر استجابة Bluetooth. |
sender | لا | بايت المرسل؛ القيمة الافتراضية 0x02. |
after | لا | إجراء متابعة اختياري. |
note | لا | وصف الهندسة العكسية المعروض بواسطة POC. |
warn | لا | نص تحذير إضافي يُعرض للأوامر الخطيرة. |
| الملف | الدور |
|---|
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. |