
مجموعة من الثغرات والاستغلالات ضد أنظمة GCS الحديثة
نواقل هجوم الطائرة بدون طيار إلى محطة التحكم الأرضية، والثغرات & والاستغلالات
أسطول الطائرات بدون طيار اليوم هو مشغل واحد يطير العشرات أو المئات من الطائرات بدون طيار من محطة أرضية واحدة. هذا يجعل محطة التحكم الأرضية هدفًا قيمًا للخصوم. فهي المكان الذي يوجد فيه الطيار عادةً، وغالبًا ما تخزن بيانات المهمة، وهي ناقل رئيسي للحركة الجانبية عبر شبكات UxS والطائرات بدون طيار الأخرى في الأسطول.
ركزت معظم أبحاث أمن الطائرات بدون طيار على استهداف الطائرة بدون طيار. يتبنى بحث Infected Drone نهجًا بديلًا ويسلط الضوء على كيف يمكن لطائرة بدون طيار واحدة مخترقة أن تهاجم المحطات الأرضية التي تتصل بها. نظرًا لأن معظم برامج التحكم الأرضي تثق في أي شيء ترسله الطائرة بدون طيار، فهناك نقص في المصادقة والتحقق والتعقيم، مما يسمح للبيانات من طائرة بدون طيار مخترقة بأن تؤدي إلى CRUD للملفات، أو تنفيذ التعليمات البرمجية، أو تعطل جهاز المشغل.
يوثق هذا المستودع الثغرات في برامج محطة التحكم الأرضية ويشحن كود إثبات مفهوم عامل لها. يتم نشره لأغراض تعليمية فقط وللمشغلين لفهم تعرضهم ولتمكين المشرفين من إعادة إنتاج هذه المشكلات وإصلاحها.
قم بتشغيل PoCs فقط ضد الأنظمة التي تملكها أو لديك إذن كتابي لاختبارها. كل واحد منها مكتوب لمنصة اختبار: الحمولات هي علامات حميدة، ولا شيء هنا معبأ للاستخدام ضد طائرة أو محطة أرضية لشخص آخر. استخدام هذه المواد ضد أنظمة لا تتحكم بها من المحتمل أن يكون غير قانوني أينما كنت.
يذكر قسم إعادة الإنتاج لكل اكتشاف ما يحتاجه وما يفعله. اقرأه قبل تشغيل أي شيء.
المفتاح:
فئة التسليم هي ما يجب على المهاجم فعله على الرابط، وهي تحدد النواقل التي تعمل. اكتشافات Push تحتاج فقط إلى إطار يصل إلى GCS، لذا أي ناقل قادر على الحقن يكفي. اكتشافات Handshake و request/response تحتاج إلى أن يكون المهاجم، أو يتحكم بالكامل في، النظير التحاوري، مما يفضل طرفية على الناقل، أو رفيق مخترق، أو سلسلة التوريد، أو MITM كامل.
عمود Fix يربط طلب السحب upstream حيث تم تقديمه. عشرة من الخمسة عشر اكتشافًا تأتي مع تصحيح مقدم ضد مستودع البائع نفسه.
تقيّم المصفوفة سبعة أعمدة لكل اكتشاف: النواقل الخمسة أدناه، بالإضافة إلى وضعي راديو SiK (قياس عن بعد RF)، والذين يحصلان على تنبيه خاص بهما أدناه نظرًا لفارق الحقن مقابل MITM.
وحدة تحكم طيران مصابة، اتصال تسلسلي، أو سلسلة توريد. مهاجم محلي أو وحدة تحكم طيران خبيثة يتم توصيلها ماديًا بمضيف GCS أو الراديو. المركبة أو البرنامج الثابت شيء لم يقم المشغل ببنائه: وحدة عرض توضيحي، إيجار، هيكل جوي مصادَر، أو مركبة مستعملة، يتم زرع برنامجها الثابت لإصدار MAVLink عدائي في اللحظة التي تتصل فيها GCS. GCS الخاصة بالمشغل هي الضحية؛ كانت "المركبة" عدائية قبل تشغيلها. ينطبق على كل اكتشاف، وهو أنظف طريقة لتسليم استغلالات handshake وقت الاتصال. يمتد هذا إلى محللي الطب الشرعي الذين قد يتصلون مباشرة بـ أو يستخرجون البيانات من مركبة مصابة. تلك القطع الأثرية، إذا لم يتم التعامل معها بشكل صحيح، يمكن أن تصيب أو تنتشر إلى كمبيوتر المحلل وشبكته.
طرفية MAVLink خبيثة / مزيفة على ناقل المركبة نفسه. كاميرا طرف ثالث، gimbal، ADSB-in، محدد مدى، أو أي جهاز يتحدث MAVLink وهو نفسه المهاجم. إنه مشارك شرعي على الرابط يصدر إطارات عدائية. كاميرا "ذكية" مزيفة تعلن عن رسائل مسمومة تفعل بالضبط ما تفعله كاميرا حقيقية، فقط بقيم عدائية.
كمبيوتر رفيق مخترق على متن المركبة (Raspberry Pi / Jetson يشغل mavlink-router / MAVProxy). بمجرد اختراقه يصبح نقطة نهاية المركبة، مع وصول ثنائي الاتجاه كامل للرابط ورؤية لحالته الحية. يمكنه الإجابة على أي handshake وإصدار أي إطار push، مما يجعله قابلاً للتطبيق على كل اكتشاف في هذه المجموعة.
جسر قياس عن بعد WiFi / UDP (ESP8266 / ESP32 "wifi telemetry"). أي شخص على نقطة الوصول أو LAN يمكنه حقن بيانات MAVLink. هذا يقلل تكلفة نواقل الحقن إلى الصفر تقريبًا، وبالنسبة لمهاجم يمكنه أيضًا الاعتراض (ARP/AP MITM)، يمكّن التحكم الكامل في handshake أيضًا.
TCP / مرحل سحابي (SITL، mavlink-router TCP، mavp2p، GCS سحابي 4G/LTE مثل خدمات UAV-cloud التجارية). MITM عند المرحل، أو أي شخص يمكنه الوصول إلى منفذ TCP المكشوف، يمكنه إعادة كتابة التدفق. روابط السحابة/4G توسع نطاق التأثير الجغرافي بشكل هائل وغالبًا ما تفتقر إلى المصادقة المتبادلة.
المسار السائد لقياس عن بعد RF الحقيقي لمركبات ArduPilot/PX4 للهواة والمحترفين هو زوج راديو SiK، جسر تسلسلي شفاف لا يحلل أو يتحقق من MAVLink، لذا فهو يوفر لـ GCS حماية صفرية ضد المحتوى العدائي. وحدة SiK مارقة تنضم أو تجسر رابطًا موجودًا باستخدام sikw00f. وضعان للهجوم، بموثوقية مختلفة جدًا:
STATUSTEXT، PARAM_VALUE،
CAMERA_INFORMATION، إلخ)، لا حاجة للرد. غير موثوق لبروتوكولات
handshake (MAVFTP، تنزيل param/log) حيث يجب على الحاقن الفوز بسباق
وقت البث ومطابقة جلسة/تسلسل لا يتحكم به.ملاحظة: تشفير SiK (AES-128، حيث مدعوم) يُشحن معطلاً افتراضيًا بمفتاح مشترك ثابت.
| ID | Product | Sev | CWE | Sink class | Delivery class | Infected FC / supply chain? | Malicious on-bus peripheral? | Compromised companion? | WiFi/UDP inject? | TCP/cloud MITM? | SiKW00F injection? | SiK full-MITM? | Fix |
|---|
| QGC-01 | QGroundControl | 🟠 HIGH | 22/73/170 | CAMERA_INFORMATION → path-traversal write (zero-click write upon connection) | push (CAMERA_INFORMATION) + content via cam_definition_uri | ✅ | ✅ most natural (camera) | ✅ | ✅ | ✅ | ✅ trigger is push; name fields inline | ✅ | PR #15083 |
| QGC-02 | QGroundControl | 🔴 CRITICAL | 22/73/494/918 | COMPONENT_METADATA uri → arbitrary file write → zero-click RCE upon connection | request/response (URI fetch over IP) | ✅ | ✅ emits metadata uri | ✅ | ✅ for trigger | ✅ | ⚠️ push trigger yes; fetch is over IP | ✅ | PR #15084 |
| QGC-03 | QGroundControl | 🟠 HIGH | 22/770 | FTP listing → traversal write + offset disk-fill | handshake (MAVFTP listing/download) | ✅ | ✅ peer answers FTP | ✅ | ⚠️ inject yes, own-handshake harder | ✅ | ⚠️ racy session/seq | ✅ bridge serves listing | PR #15085 |
| QGC-04 | QGroundControl | 🟡 MED | 191/125 | DataFlash .bin parser OOB read + underflow | handshake (log download of malicious .bin) | ✅ | ✅ peer serves DataFlash | ✅ | ⚠️ | ✅ | ⚠️ must serve log chunks | ✅ bridge feeds .bin | PR #15086 |
| MP-01 | Mission Planner | 🟠 HIGH | 22→94 | MAVFTP traversal → plugin-loader RCE | handshake (MAVFTP req/ack → RCE) | ✅ | ✅ peer answers listing | ✅ full link control | ⚠️ inject easy, but need to own handshake | ✅ rewrite at relay | ⚠️ must win race + match session/seq | ✅ bridge owns FTP convo | PR #3774 |
| MP-02 | Mission Planner | 🟠 HIGH | 94/78 | gst:// → gst_parse_launch (file r/w + exfil) | push (VIDEO_STREAM_INFORMATION → gst) | ✅ | ✅ camera announces uri | ✅ | ✅ UDP datagram | ✅ | ✅ one-shot stream frame | ✅ trivially | PR #3775 |
| MP-03 | Mission Planner | 🟠 HIGH | 74/601 | STATUSTEXT markup → Process.Start | push (STATUSTEXT → ShellExecute) | ✅ | ✅ any component emits | ✅ | ✅ | ✅ | ✅ fire-and-forget text | ✅ | PR #3776 |
| MP-04 | Mission Planner | 🟡 MED | 248/20/1050 | RALLY_TOTAL/FENCE_TOTAL → unvalidated int.Parse + O(n²) on the UI thread (zero-click on connect) | push (PARAM_VALUE, auto post-connect) | ✅ | ✅ emits PARAM_VALUE | ✅ | ✅ | ✅ | ⚠️ must land the param in MP's dict | ✅ | PR #3777 |
| MAVSDK-01 | MAVSDK | 🟡 MED | 918/749 | component-metadata curl SSRF + file:// (no protocol allowlist) | request/response (COMPONENT_METADATA.uri fetch over IP) | ✅ | ✅ emits metadata uri | ✅ | ✅ for trigger | ✅ | ⚠️ push trigger yes; fetch over IP | ✅ | none |
| MAVSDK-02 | MAVSDK | 🟠 HIGH | 22/73/918 | cam-definition SSRF + mftp:// traversal → zero-click destruction of a file outside the sandbox | push (CAMERA_INFORMATION.cam_definition_uri, auto) | ✅ | ✅ most natural (camera) | ✅ | ✅ | ✅ | ✅ auto-consumed push | ✅ | PR #3073 |
| MAVSDK-03 | MAVSDK | 🟠 HIGH | 409/400/770/459 | .xz cam-definition or COMPONENT_METADATA → unbounded decompression → persistent disk exhaustion | push (CAMERA_INFORMATION.cam_definition_uri, auto) — a bare HEARTBEAT starts it | ✅ | ✅ most natural (camera) | ✅ | ✅ | ✅ | ✅ auto-consumed push; ~50 s of 57.6 kbps airtime per 2 GiB | ✅ | PR #3074 |
| MAVPROXY-01 | MAVProxy | 🟠 HIGH | 502 | asterix pickle.loads over UDP → RCE | IP side-channel (UDP, NOT the MAVLink RF link) | ❌ not on the MAVLink link | ❌ separate UDP socket | ⚠️ only if it can reach :45454 | ✅ UDP to host:45454 | ❌ own UDP socket, not relay | ❌ not on RF/MAVLink link | ❌ not on RF/MAVLink link | fixed upstream by #1728, unreleased |
| MAVROS-01 | mavros | 🟡 MED | 345/770 | PARAM_VALUE → forged global /parameter_events + uncapped map | push/stream (inject PARAM_VALUE, no handshake) | ✅ | ✅ emits PARAM_VALUE | ✅ | ✅ UDP flood | ✅ | ✅ flood PARAM_VALUE | ✅ | none |
| MAVROS-02 | mavros | 🟠 HIGH | 125/617/248 | FTP write-ack → unbounded std::advance → heap disclosure + process abort | handshake (poison FTP reply → crash) | ✅ | ✅ peer sends bad FTP | ✅ | ⚠️ | ✅ | ⚠️ must land malformed reply | ✅ bridge injects bad reply | none |
| DRONEKIT-01 | DroneKit | ⚪ INFO | 20 | trust-boundary handoff (param_id / STATUSTEXT) | push (telemetry → app callbacks; by-design handoff) | ✅ | ✅ any component | ✅ | ✅ | ✅ | ✅ any push frame reaches callback | ✅ | n/a |