
Eine Sammlung von Schwachstellen und Exploits gegen moderne GCS
Angriffsvektoren, Schwachstellen und Exploits von Drohne zu Bodenkontrollstation
Drohnenflotten bestehen heute aus einem Operator, der Dutzende oder Hunderte von Drohnen von einer einzigen Bodenstation aus fliegt. Dadurch wird die Bodenkontrollstation zu einem wertvollen Ziel für Angreifer. Dort befindet sich üblicherweise der Pilot, dort werden oft Missionsdaten gespeichert, und sie ist ein erstklassiger Vektor für laterale Bewegung über UxS-Netzwerke und andere Drohnen in einer Flotte.
Der Großteil der Drohnensicherheitsforschung hat sich auf die Drohne als Ziel konzentriert. Die Infected Drone-Forschung wählt einen alternativen Ansatz und zeigt, wie eine einzelne kompromittierte Drohne Bodenstationen angreifen kann, die sich mit ihr verbinden. Da die meiste Bodenkontrollsoftware allem vertraut, was die Drohne sendet, fehlen Authentifizierung, Validierung und Sanitisierung, wodurch Daten von einer kompromittierten Drohne zu Datei-CRUD, Codeausführung oder einem Absturz auf dem Rechner des Operators führen können.
Dieses Repository dokumentiert Schwachstellen in Bodenkontrollstationssoftware und liefert funktionierenden Proof-of-Concept-Code dafür. Es wird ausschließlich zu Bildungszwecken veröffentlicht und damit Operatoren ihre Exposition verstehen und Maintainer diese Probleme reproduzieren und beheben können.
Führe die PoCs nur gegen Systeme aus, die dir gehören oder für die du eine schriftliche Testgenehmigung hast. Jeder einzelne davon ist für einen Prüfstand geschrieben: Die Payloads sind harmlose Marker, und nichts hier ist für den Einsatz gegen die Luftfahrzeuge oder Bodenstationen anderer Personen paketiert. Die Verwendung dieses Materials gegen Systeme, die du nicht kontrollierst, ist wahrscheinlich illegal, wo auch immer du dich befindest.
Der Abschnitt „Reproduction" jedes Findings gibt an, was es benötigt und was es tut. Lies ihn, bevor du irgendetwas ausführst.
Legende:
Die Delivery-Klasse beschreibt, was der Angreifer auf der Verbindung tun muss, und sie entscheidet, welche Vektoren funktionieren. Push-Findings benötigen lediglich ein Frame, das an der GCS ankommt, sodass jeder injektionsfähige Vektor ausreicht. Handshake- und Request/Response-Findings erfordern, dass der Angreifer der kommunizierende Peer ist oder diesen vollständig kontrolliert, was ein On-Bus-Peripheriegerät, einen kompromittierten Companion, die Lieferkette oder einen vollständigen MITM begünstigt.
Die Spalte Fix verlinkt den Upstream-Pull-Request, sofern einer eingereicht wurde. Zehn der fünfzehn Findings werden mit einem Patch ausgeliefert, der gegen das Repository des Herstellers selbst eingereicht wurde.
Die Matrix bewertet sieben Spalten pro Finding: die fünf untenstehenden Vektoren plus die beiden SiK-Funk- (RF-Telemetrie-)Modi, die angesichts der Injektion-vs-MITM-Nuance unten einen eigenen Abschnitt erhalten.
Infizierter Flight Controller, serielle Verbindung oder Lieferkette. Ein lokaler Angreifer oder ein bösartiger Flight Controller wird physisch mit dem GCS-Host oder dem Funkgerät verbunden. Das Luftfahrzeug oder die Firmware ist etwas, das der Operator nicht gebaut hat: eine Demo-Einheit, ein Mietgerät, ein beschlagnahmtes Luftfahrzeug oder ein gebrauchtes Fluggerät, dessen Firmware implantiert wurde, um feindseliges MAVLink zu senden, sobald sich eine GCS verbindet. Die eigene GCS des Operators ist das Opfer; das „Luftfahrzeug" war feindselig, bevor es überhaupt eingeschaltet wurde. Gilt für jedes Finding und ist der sauberste Weg, um Connect-Time-Handshake-Exploits zu liefern. Dies erstreckt sich auf Forensik-Analysten, die sich möglicherweise direkt mit einem infizierten Luftfahrzeug verbinden oder Daten daraus extrahieren. Diese Artefakte könnten, wenn sie nicht ordnungsgemäß behandelt werden, den Computer und das Netzwerk des Analysten infizieren oder sich darauf ausbreiten.
Bösartiges / gefälschtes MAVLink-Peripheriegerät am eigenen Bus des Luftfahrzeugs. Eine Drittanbieter-Kamera, ein Gimbal, ADSB-in, ein Entfernungsmesser oder jedes Gerät, das MAVLink spricht und selbst der Angreifer ist. Es ist ein legitimer Teilnehmer auf der Verbindung, der feindselige Frames sendet. Eine gefälschte „Smart Camera", die vergiftete Nachrichten ankündigt, tut genau das, was eine echte tut, nur mit feindseligen Werten.
Kompromittierter Companion-Computer an Bord (Raspberry Pi / Jetson mit mavlink-router / MAVProxy). Einmal kompromittiert, wird er zum Luftfahrzeug-Endpunkt, mit vollem bidirektionalem Zugriff auf die Verbindung und Sichtbarkeit ihres Live-Zustands. Er kann jeden Handshake beantworten und jedes Push-Frame senden, was ihn für jedes Finding in diesem Set nutzbar macht.
WiFi-/UDP-Telemetrie-Bridge (ESP8266 / ESP32 „Wifi-Telemetrie"). Jeder im Access Point oder LAN kann MAVLink-Daten injizieren. Dies senkt die Kosten der Injektionsvektoren auf nahezu null und ermöglicht für einen Angreifer, der auch abfangen kann (ARP/AP-MITM), zusätzlich volle Handshake-Kontrolle.
TCP-/Cloud-Relay (SITL, mavlink-router TCP, mavp2p, 4G/LTE-Cloud-GCS wie kommerzielle UAV-Cloud-Dienste). MITM am Relay oder jeder, der den exponierten TCP-Port erreichen kann, kann den Stream umschreiben. Cloud-/4G-Verbindungen vergrößern den geografischen Wirkungsradius enorm und entbehren häufig gegenseitiger Authentifizierung.
Der dominierende echte RF-Telemetriepfad für ArduPilot/PX4-Hobby- und Prosumer-Fluggeräte ist ein SiK-Funkgerätepaar, eine transparente serielle Bridge, die MAVLink weder parst noch validiert, sodass sie der GCS keinerlei Schutz gegen feindselige Inhalte bietet. Ein bösartiges SiK-Modul tritt einer bestehenden Verbindung bei oder überbrückt sie mit sikw00f. Zwei Angriffsmodi mit sehr unterschiedlicher Zuverlässigkeit:
STATUSTEXT, PARAM_VALUE,
CAMERA_INFORMATION usw.), keine Antwort nötig. Unzuverlässig für Handshake-
Protokolle (MAVFTP, Parameter-/Log-Download), da der Injector ein Airtime-
Race gewinnen und eine Session/Sequenz treffen muss, die er nicht kontrolliert.Hinweis: SiK-Verschlüsselung (AES-128, wo unterstützt) ist standardmäßig deaktiviert und verwendet einen statischen gemeinsamen Schlüssel.
| ID | Produkt | Sev | CWE | Sink-Klasse | Delivery-Klasse | Infizierte FC / Lieferkette? | Bösartiges On-Bus-Peripheriegerät? | Kompromittierter Companion? | WiFi/UDP-Injektion? | TCP/Cloud-MITM? | SiKW00F-Injektion? | SiK Full-MITM? | Fix |
|---|
| QGC-01 | QGroundControl | 🟠 HIGH | 22/73/170 | CAMERA_INFORMATION → Path-Traversal-Write (Zero-Click-Write beim Verbinden) | push (CAMERA_INFORMATION) + Inhalt via cam_definition_uri | ✅ | ✅ am natürlichsten (Kamera) | ✅ | ✅ | ✅ | ✅ Trigger ist Push; Namensfelder inline | ✅ | PR #15083 |
| QGC-02 | QGroundControl | 🔴 CRITICAL | 22/73/494/918 | COMPONENT_METADATA uri → beliebiger Datei-Write → Zero-Click-RCE beim Verbinden | request/response (URI-Fetch über IP) | ✅ | ✅ sendet Metadata-URI | ✅ | ✅ für Trigger | ✅ | ⚠️ Push-Trigger ja; Fetch läuft über IP | ✅ | PR #15084 |
| QGC-03 | QGroundControl | 🟠 HIGH | 22/770 | FTP-Listing → Traversal-Write + Offset-Disk-Fill | handshake (MAVFTP-Listing/Download) | ✅ | ✅ Peer beantwortet FTP | ✅ | ⚠️ Injektion ja, eigener Handshake schwieriger | ✅ | ⚠️ racy Session/Seq | ✅ Bridge liefert Listing | PR #15085 |
| QGC-04 | QGroundControl | 🟡 MED | 191/125 | DataFlash-.bin-Parser OOB-Read + Underflow | handshake (Log-Download einer bösartigen .bin) | ✅ | ✅ Peer liefert DataFlash | ✅ | ⚠️ | ✅ | ⚠️ muss Log-Chunks liefern | ✅ Bridge speist .bin ein | PR #15086 |
| MP-01 | Mission Planner | 🟠 HIGH | 22→94 | MAVFTP-Traversal → Plugin-Loader-RCE | handshake (MAVFTP req/ack → RCE) | ✅ | ✅ Peer beantwortet Listing | ✅ volle Link-Kontrolle | ⚠️ Injektion einfach, aber Handshake muss selbst kontrolliert werden | ✅ Rewrite am Relay | ⚠️ muss Race gewinnen + Session/Seq treffen | ✅ Bridge besitzt FTP-Konversation | PR #3774 |
| MP-02 | Mission Planner | 🟠 HIGH | 94/78 | gst:// → gst_parse_launch (Datei-r/w + Exfil) | push (VIDEO_STREAM_INFORMATION → gst) | ✅ | ✅ Kamera kündigt URI an | ✅ | ✅ UDP-Datagramm | ✅ | ✅ One-Shot-Stream-Frame | ✅ trivial | PR #3775 |
| MP-03 | Mission Planner | 🟠 HIGH | 74/601 | STATUSTEXT-Markup → Process.Start | push (STATUSTEXT → ShellExecute) | ✅ | ✅ jede Komponente sendet | ✅ | ✅ | ✅ | ✅ Fire-and-Forget-Text | ✅ | PR #3776 |
| MP-04 | Mission Planner | 🟡 MED | 248/20/1050 | RALLY_TOTAL/FENCE_TOTAL → unvalidiertes int.Parse + O(n²) auf dem UI-Thread (Zero-Click beim Verbinden) | push (PARAM_VALUE, automatisch nach Verbindung) | ✅ | ✅ sendet PARAM_VALUE | ✅ | ✅ | ✅ | ⚠️ muss den Parameter in MPs Dict platzieren | ✅ | PR #3777 |
| MAVSDK-01 | MAVSDK | 🟡 MED | 918/749 | Component-Metadata-curl-SSRF + file:// (keine Protokoll-Allowlist) | request/response (COMPONENT_METADATA.uri-Fetch über IP) | ✅ | ✅ sendet Metadata-URI | ✅ | ✅ für Trigger | ✅ | ⚠️ Push-Trigger ja; Fetch über IP | ✅ | keine |
| MAVSDK-02 | MAVSDK | 🟠 HIGH | 22/73/918 | Cam-Definition-SSRF + mftp://-Traversal → Zero-Click-Zerstörung einer Datei außerhalb der Sandbox | push (CAMERA_INFORMATION.cam_definition_uri, automatisch) | ✅ | ✅ am natürlichsten (Kamera) | ✅ | ✅ | ✅ | ✅ automatisch konsumierter Push | ✅ | PR #3073 |
| MAVSDK-03 | MAVSDK | 🟠 HIGH | 409/400/770/459 | .xz-Cam-Definition oder COMPONENT_METADATA → unbegrenzte Dekompression → persistente Disk-Erschöpfung | push (CAMERA_INFORMATION.cam_definition_uri, automatisch) — ein bloßes HEARTBEAT startet es | ✅ | ✅ am natürlichsten (Kamera) | ✅ | ✅ | ✅ | ✅ automatisch konsumierter Push; ~50 s bei 57,6 kbps Airtime pro 2 GiB | ✅ | PR #3074 |
| MAVPROXY-01 | MAVProxy | 🟠 HIGH | 502 | asterix pickle.loads über UDP → RCE | IP-Seitenkanal (UDP, NICHT die MAVLink-RF-Verbindung) | ❌ nicht auf der MAVLink-Verbindung | ❌ separater UDP-Socket | ⚠️ nur wenn es :45454 erreichen kann | ✅ UDP an Host:45454 | ❌ eigener UDP-Socket, kein Relay | ❌ nicht auf RF/MAVLink-Verbindung | ❌ nicht auf RF/MAVLink-Verbindung | upstream behoben durch #1728, unveröffentlicht |
| MAVROS-01 | mavros | 🟡 MED | 345/770 | PARAM_VALUE → gefälschte globale /parameter_events + unbegrenzte Map | push/stream (PARAM_VALUE injizieren, kein Handshake) | ✅ | ✅ sendet PARAM_VALUE | ✅ | ✅ UDP-Flood | ✅ | ✅ PARAM_VALUE fluten | ✅ | keine |
| MAVROS-02 | mavros | 🟠 HIGH | 125/617/248 | FTP-Write-Ack → unbegrenztes std::advance → Heap-Disclosure + Prozessabbruch | handshake (vergiftete FTP-Antwort → Crash) | ✅ | ✅ Peer sendet fehlerhaftes FTP | ✅ | ⚠️ | ✅ | ⚠️ muss fehlerhafte Antwort platzieren | ✅ Bridge injiziert fehlerhafte Antwort | keine |
| DRONEKIT-01 | DroneKit | ⚪ INFO | 20 | Trust-Boundary-Übergabe (param_id / STATUSTEXT) | push (Telemetrie → App-Callbacks; by-design-Übergabe) | ✅ | ✅ jede Komponente | ✅ | ✅ | ✅ | ✅ jedes Push-Frame erreicht Callback | ✅ | n/a |