Schwerwiegende Sicherheitslücke beim Entpacken von Zip-Archiven in Bower
31. Januar 2019
0 Min. LesezeitAnfang des Monats wurde entdeckt, dass Bower, ein beliebter Paketmanager für Webanwendungen, durch das Entpacken von Archiven verwundbar ist. Derzeit sind zwei Sicherheitsvorfälle bekannt, für die inzwischen Updates zur Behebung verfügbar sind:
Das beliebige Schreiben von Dateien mit potenzieller Befehlsinjektion aus der Ferne, das in Bower 1.8.6 behoben wurde, ging auf die Zip-Slip-Sicherheitslücken in der Abhängigkeit decompress-zip zurück, einer von Bower verwendeten Open-Source-Abhängigkeit.
Das beliebige Schreiben von Dateien aufgrund von Sicherheitslücken mit symbolischen Links (Symlinks) in .tar.gz-Archiven, die durch die Art und Weise ausgenutzt werden, wie Bower solche Archive entpackt, wurde in Bower 1.8.8 behoben.
Webpack, yarn und die npm-Registry haben die Spielregeln für Bower vielleicht verändert, doch Bower wird weiterhin verwendet. Obwohl es heutzutage beliebtere Paketmanager gibt und npm die De-facto-Registry für JavaScript ist, verlassen sich nach wie vor sehr viele auf Bower als Paketmanager. Fast 2 Millionen Downloads pro Monat verdeutlichen die Schwere eines solchen Sicherheitsproblems.
Am 1. Januar 2019 meldete ein Sicherheitsforscher namens skyn3t der Node.js Security Working Group auf HackerOne ein beliebiges Schreiben von Dateien, das durch unzureichende Validierung von Symlinks ermöglicht wurde und auf die Art und Weise zurückging, wie Bower tar-Archive entpackt.
Kurz nachdem der Fehler bewertet worden war, wurde Adam Stankiewicz aus dem Bower-Kernteam eingeladen, den Bericht zu prüfen. Er bestätigte das Problem umgehend und stellte in Bower 1.8.8 eine Fehlerbehebung bereit, um das Sicherheitsrisiko zu beseitigen.
Bösartige Pfadmanipulation beim Entpacken von Archiven
Wenn ein Angreifer ein speziell präpariertes Zip-Archiv für ein Paket erstellt, das anschließend mit Bower installiert wird, kann es zu einer Pfadmanipulation kommen. Dadurch werden Dateien außerhalb des Stammverzeichnisses entpackt, in das das Archiv eigentlich extrahiert werden soll.
Der folgende Proof of Concept (POC) stammt aus einem Sicherheitsbericht, der von skyn3t veröffentlicht wurde und an das Programm der Node.js Security Working Group auf HackerOne ging. Er zeigt, wie die unsichere Handhabung von Symlinks zum beliebigen Schreiben von Dateien führen kann.
Das bösartige Paketarchiv
Das Archiv muss einen Symlink zu einem Verzeichnis erstellen und anschließend eine Datei in diesem Zielverzeichnis ablegen. Um diese Verzeichnisstruktur nachzubilden, müssen wir jedoch ein bösartiges Archiv manuell erstellen.
Zunächst erstellen wir ein Verzeichnis für das bösartige Paket, eine standardmäßige package.json-Datei für Bower und einen Symlink zu /tmp:
Jetzt können wir für dieses Paket ein tar-Archiv erstellen und darauf achten, es nicht zu komprimieren:

Die knifflige Stelle ist, eine Datei unter unserer Kontrolle in das Verzeichnis /tmp und damit in mySpecialDirectory/ innerhalb des Archivs zu bekommen. Dieser Dateiname ist bereits als Link belegt, sodass wir ihn auf unserem eigenen Dateisystem nicht einfach wiederverwenden können.
Um diese Schwierigkeit zu umgehen, greifen wir auf die standardmäßigen Archivfunktionen zurück und bearbeiten die Daten direkt im Archiv. Mit tar-Dateien können wir ein bestehendes Archiv aktualisieren, etwa indem wir weitere Dateien hinzufügen. So lässt sich eine Hintertür schaffen.
Wir löschen den Link, erstellen an seiner Stelle ein Verzeichnis und legen darin unsere eigene Datei an. Anschließend fügen wir nur diese Datei mithilfe der tar-Aktualisierungsfunktion dem Archiv hinzu:
Wie im Screenshot zu sehen ist, enthält das Archiv einen Symlink zum Verzeichnis /tmp sowie eine von uns erstellte bösartige Datei:

Wichtig ist, dass sich komprimierte Archive nicht auf dieselbe Weise bearbeiten lassen wie tar-Archive. Deshalb komprimieren wir das Archiv erst jetzt mit gzip, nachdem es bösartig präpariert wurde:
Bower zur Installation veranlassen
Nachdem wir nun ein tar.gz-Archiv im Home-Verzeichnis ~/tmp haben, führen wir eine Bower-Installation aus dem lokalen Dateisystem aus, um zu zeigen, wie das Paket entpackt wird:

Wie zu sehen ist, kommt Bower 1.8.7 zum Einsatz. Bei der Installation des bösartigen Pakets wurde die von uns kontrollierte bösartige Datei anschließend im Systemverzeichnis /tmp abgelegt.
Behebung der Sicherheitslücke
Bower unterstützt die Archivtypen tar, tar.gz und zip. Eine ähnliche Sicherheitslücke bei Zip-Paketen wurde bereits durch eine Fehlerbehebung in decompress-zip behoben. tar- und tar.gz-Archive blieben jedoch verwundbar.
Die für die Sicherheitslücken in tar- und tar.gz-Archiven letztlich umgesetzte Fehlerbehebung entschärfte das Problem, indem Symlinks in zu installierenden Paketen ignoriert wurden. Inzwischen wurde Bower 1.8.8 veröffentlicht, auf das Nutzerinnen und Nutzer aktualisieren können, um das Sicherheitsproblem zu beheben.
Anfang 2018 prägte das Snyk-Sicherheitsforschungsteam den Begriff Zip Slip für eine Sicherheitslücke, nachdem es umfassend untersucht hatte, wie sich das Entpacken von Archiven ausnutzen lässt, um beliebige Dateien zu schreiben. Bei kritischem Schweregrad kann dies außerdem zur Ausführung von Befehlen aus der Ferne und zum Überschreiben vertraulicher Systemkonfigurationsdateien führen.
Die Zip-Slip-Forschung führte zur Entdeckung tausender verwundbarer Projekte in zahlreichen Ökosystemen, darunter Projekte von Apache, Pivotal, Amazon und anderen.
Zusammenfassung
Wir haben gesehen, wie sich ein gezielt bösartiges Paket erstellen lässt, das beliebige Dateien schreiben kann. Das Problem beschränkt sich jedoch nicht auf den Download bösartiger Pakete. Wird ein Paket über einen unsicheren Übertragungsweg wie eine Nicht-HTTPS-Verbindung abgerufen, kann ein Man-in-the-Middle-Angriff durchgeführt werden.
Probleme beim Entpacken von Dateien sind nicht neu und lassen sich möglicherweise bis zu einem Phrack-Artikel aus dem Jahr 1991 zurückverfolgen, der erklärte, wie man ein BBS mit solchen Angriffsmethoden beim Entpacken von Zip-Archiven hackt. Da weiter auf diesem Gebiet geforscht wird, werden wir wahrscheinlich auch künftig Zip-Slip-Sicherheitslücken in Bibliotheken und Anwendungen entdecken.
Denken Sie daran: Auch wenn Symlinks zulässig sind, ist der Umgang mit nutzerkontrollierten Archiven gefährlich. Gehen Sie dabei genauso sorgfältig vor wie bei jeder anderen Nutzereingabe.
Die wichtigsten Erkenntnisse
Aktualisieren Sie so bald wie möglich auf Bower 1.8.8.
In unserem Zip-Slip-Cheatsheet finden Sie Beispiele für verwundbaren Code in verschiedenen Sprachökosystemen und Hinweise dazu, wie Sie ähnliche Sicherheitslücken in Ihrem Code vermeiden können.



