FTP-Clients angreifen: Mit MGET mehr herunterladen als erwartet
4. April 2018
0 Min. LesezeitEinführung
Wir hören oft von Sicherheitslücken in HTTP-Clients wie Webbrowsern, die in der Regel durch bösartige Webinhalte ausgenutzt werden. Das ist nichts Neues. Aber wussten Sie, dass auch FTP-Clients Sicherheitslücken aufweisen können, die sich ausnutzen lassen? FTP-Clients können von bösartigen Servern angegriffen werden, mit denen sie sich verbinden.
In diesem Blogbeitrag stelle ich eine interessante Path-Traversal-Sicherheitslücke vor, die wir im November 2017 entdeckt und den betroffenen Anbietern verantwortungsvoll offengelegt haben. Die Sicherheitslücke kann mehrere Anwendungen und Bibliotheken betreffen und es einem bösartigen FTP-Server ermöglichen, Dateien an beliebiger Stelle im lokalen Dateisystem zu erstellen oder zu überschreiben. Wie die folgenden Details zeigen, ist die Ursache eine fehlende Validierung. Davon sind nicht nur FTP-Clients betroffen, sondern auch viele andere Anwendungen und Bibliotheken in verschiedenen Ökosystemen, etwa Java, npm und weitere.
Die Sicherheitslücke
Sehen wir uns das Problem genauer an! Wir möchten eine Funktion programmieren, die den Inhalt eines Remote-FTP-Ordners in einen lokalen Ordner herunterlädt. Wie die meisten von uns wissen, bietet das FTP-Protokoll selbst keinen Befehl zum Herunterladen eines Ordners. Wir können jedoch mehrere andere Befehle kombinieren, um unser Ziel zu erreichen.
Wir können:
Alle Dateien im Remote-Ordner auflisten (FTP-Befehle
LISToderNLST)Für jede Datei in den obigen Listenergebnissen: Datei herunterladen und in einem lokalen Ordner speichern (FTP-Befehle
GEToderMGET)
Ein Beispiel für Java-Code, der dieses Verhalten mithilfe der Bibliothek Apache commons-net umsetzt, könnte so aussehen:
Der obige Code durchläuft jede vom Server zurückgegebene Datei und lädt sie in einen lokalen Zielordner herunter. Wenn beispielsweise die erste Datei im Remote-Ordner passwd heißt und unser lokaler Zielordner /var/data/sync/ lautet, wird die Datei nach /var/data/sync/passwd heruntergeladen.
Was aber, wenn der FTP-Server bösartig wird und als Antwort auf den LIST-Befehl nicht passwd, sondern ../../../../etc/passwd als Dateinamen zurückgibt? Der obige Code legt die Datei dann unter /var/data/sync/../../../../etc/passwd ab und überschreibt damit praktisch /etc/passwd mit der heruntergeladenen Datei.
Sie könnten einwenden, dass ../../../../etc/passwd kein gültiger Dateiname ist. Das stimmt. Doch im RFC steht nicht, dass dies kein gültiger Dateiname ist. Genau genommen macht das RFC keine Vorgaben zum Dateisystem und überlässt es Client und Server, dies selbst zu klären. Eine Antwort eines Windows-basierten FTP-Servers auf einen LIST-Befehl könnte beispielsweise so aussehen:
Ein Unix-basierter Server liefert dagegen:
Tatsächlich gibt es viele weitere Dateisystemformate. Hier ist eine Liste der Formate, die von der Apache-commons-net-Bibliothek unterstützt werden:
Der typische FTP-Client validiert Dateinamen also nicht, sondern gibt sie unverändert zurück, damit Entwickler sie validieren. Die Validierung wird dabei häufig übersehen. Das wird besonders deutlich, wenn man sich Projekte auf GitHub oder verschiedene Snippet- und Beispiel-Websites wie StackOverflow und CodeJava ansieht.
Fallstudie: Apache HIVE
Apache Hive ist ein Data-Warehouse-Softwareprojekt, das auf Apache Hadoop aufbaut und Datenzusammenfassungen, Abfragen und Analysen ermöglicht. Hive bietet eine SQL-ähnliche Schnittstelle für Abfragen von Daten, die in verschiedenen Datenbanken und Dateisystemen gespeichert sind, die sich in Hadoop integrieren lassen. Unter anderem unterstützt Hive das Kopieren von Daten aus FTP-Servern über den Befehl COPY-FROM-FTP.
Im Code sehen wir den Aufruf retrieveFileList().
In der Funktion retrieveFileList sehen wir, dass der vom Server zurückgegebene Dateiname ohne Validierung an den Verzeichnisnamen angehängt wird (name = dir + name;). Die Datei wird in eine Warteschlange gestellt und später heruntergeladen.
Später wird im Downloader-Thread die Datei aus der Warteschlange entnommen und vom Server heruntergeladen.
Ein möglicher Angriff besteht darin, die Datei authorized_keys des Root-Benutzers zu überschreiben und sich so später als Root anzumelden. Nehmen wir an, eine Apache-Hive-Instanz verbindet sich täglich mit unserem FTP-Server, um Händlerdaten herunterzuladen. Für diesen Angriff ändern wir unseren FTP-Server so, dass er dem Client bösartige Dateinamen mit Path Traversal zurückgibt. Beispielsweise könnten wir auf einen LIST-Befehl mit ../../../../../../../home/root/.ssh/authorized_keys antworten.
Wenn Hive diese Anweisung ausführt (und als Root läuft), wird die Datei authorized_keys des Root-Benutzers durch eine vom Angreifer kontrollierte Datei überschrieben.
Die oben beschriebene Sicherheitslücke wurde der Apache Foundation verantwortungsvoll offengelegt. Der zeitliche Ablauf:
Datum | Ereignis |
|---|---|
2.11.2017 | Sicherheitslücke von Snyk Security Research entdeckt |
8.11.2017 | Liste der betroffenen Apache-Produkte an die Foundation übermittelt. |
5.2.2018 | Apache teilte uns mit, dass bis Ende Februar eine korrigierte Version veröffentlicht werden soll. |
4.4.2018 | Beitrag veröffentlicht. |
Details zum Apache-Hive-Projekt wurden am 4.4.2018 auch in der CVE-Datenbank veröffentlicht.CVE-2018-1315: Die Anweisung „COPY FROM FTP“ in HPL/SQL kann an beliebige Speicherorte schreiben, wenn der FTP-Server kompromittiert wurde:
Schweregrad: Mittel
Anbieter: The Apache Software Foundation
Betroffene Versionen: Hive 2.1.0 bis 2.3.2
Beschreibung: Wird die Anweisung „COPY FROM FTP“ mit der HPL/SQL-Erweiterung für Hive ausgeführt, kann ein kompromittierter/bösartiger FTP-Server bewirken, dass die Datei an einen beliebigen Speicherort auf dem Cluster geschrieben wird, auf dem der Befehl ausgeführt wird. Der Grund: Der FTP-Client-Code in HPL/SQL überprüft nicht, an welchem Speicherort die heruntergeladene Datei abgelegt wird. Die Benutzer hivecli und hiveserver2 sind davon nicht betroffen, da hplsql ein separates Kommandozeilenskript ist, das auf andere Weise aufgerufen werden muss.
Abhilfe: Benutzer, die HPL/SQL mit Hive 2.1.0 bis 2.3.2 einsetzen, sollten auf Version 2.3.3 aktualisieren. Alternativ lässt sich die Verwendung von HPL/SQL auf anderem Wege deaktivieren.
Zusammenfassung
Wir haben gezeigt, dass eine Sicherheitslücke in einigen FTP-Client-Anwendungen und -Bibliotheken darauf zurückzuführen ist, dass Daten vom FTP-Server nicht korrekt validiert werden. Ähnliche Probleme sind bereits früher aufgetreten. So stellte Steve Christey, Principal Information Security Engineer bei MITRE, im Jahr 2002 fest, dass das Problem bei mehreren FTP-Clients auftrat, darunter dem nativen Linux-FTP-Client und wget.
Eingaben müssen unbedingt validiert werden – und zwar nicht nur aus Sicherheitsgründen. Als Entwickler denkt man leicht daran, wie eine durchschnittliche Person unsere APIs nutzen könnte. Genauso wichtig ist es jedoch, mit unerwarteten Eingaben zu rechnen, die von Angreifern stammen könnten. Wenn Sie Verzeichnislisten von FTP-Servern verarbeiten, validieren Sie sie unbedingt: Dateinamen, die mit / beginnen oder .. enthalten, müssen blockiert werden.
Starten Sie mit Capture the Flag
Erfahren Sie in unserem virtuellen On-Demand-Workshop für Einsteiger, wie Sie Capture-the-Flag-Herausforderungen lösen.