Skip to main content

Java-Sicherheitsprobleme in meiner Spring-MVC-Anwendung beheben

Artikel von
Blog Header Spring MVC

15. März 2021

0 Min. Lesezeit

Das Spring-MVC-Framework ist ein bekanntes Java-Framework zum Erstellen interaktiver Webanwendungen. Es setzt das Model-View-Controller-Architekturmuster um, um die verschiedenen Aspekte Ihrer Anwendung voneinander zu trennen. Die Trennung der einzelnen Logikelemente wie Darstellungs-, Eingabe- und Geschäftslogik gilt allgemein als gute Architekturpraxis. Diese Trennung der Zuständigkeiten bietet Ihnen bei korrekter Umsetzung beispielsweise weniger doppelten Code und mehrere Ansichten für dasselbe Modell.

Spring MVC ist Teil des Spring-Frameworks und konzentriert sich auf die Entwicklung von Java-Webanwendungen. Dabei kann es sich entweder um eine eigenständige Anwendung handeln, die einen separaten Webserver wie Tomcat nutzt, oder um eine Spring-Boot-Anwendung.

Für diesen Artikel habe ich eine Spring-MVC-Anwendung mit JSP-Webseiten (Java Server Pages) erstellt, die auf einem Tomcat-Server läuft. Der Code, den ich geschrieben habe, ist sehr einfach und unkompliziert. Obwohl er einwandfrei funktioniert, habe ich einige sicherheitsrelevante Fehler gemacht. Sehen wir uns an, wie wir diese Fehler in meiner Spring-MVC-Anwendung mithilfe einer statischen Java-Codeanalyse erkennen und beheben können.

Meine Spring-MVC-Java-Anwendung

Die von mir erstellte Spring-MVC-Java-Anwendung ist sehr einfach gehalten. Es handelt sich um eine Java-11-basierte Anwendung mit einer sehr aktuellen Version von spring-web-mvc. Die Implementierung folgt dem Model-View-Controller-Muster und interagiert über einfache JSP-Seiten mit den Benutzern. Sie finden diese Beispielanwendung auf GitHub und können sie mit mvn tomcat7:run ausführen.

Die grundlegenden Funktionen der Anwendung sind:

  • Eine Datei in einen Ordner hochladen

  • Eine Datei hochladen und entpacken

  • Hochgeladene Dateien auflisten

  • Eine Nachricht im Nachrichtenforum verfassen

  • Alle Nachrichten auflisten

  • Nach einer bestimmten Nachricht suchen.

Ich habe die Abhängigkeiten auf das absolute Minimum beschränkt. Zwar hätte ich einige bekannte Bibliotheken für die aufwendige Arbeit verwenden können, doch ich habe die gesamte Geschäftslogik selbst geschrieben. Neben spring-web-mvc verwende ich:

  • commons-fileupload zum Hochladen der Dateien

  • jstl für die Logik in meinen JSP-Dateien

  • h2 als In-Memory-Datenbank für die Nachrichten.

Ich weiß, dass diese Anwendung einige Sicherheitsfehler im Code enthält. Probieren wir das brandneue Snyk Code aus und sehen wir, wie effektiv die statische Java-Codeanalyse die von mir eingebauten Sicherheitslücken findet.

Snyk Code – Tool zur statischen Java-Codeanalyse

Snyk Code ist ein neues Snyk-Produkt, das darauf spezialisiert ist, anfällige Codekonstrukte in verschiedenen Programmiersprachen zu finden, darunter Java. Die Java-Codeanalyse von Snyk Code unterstützt auch wichtige Frameworks wie Spring MVC, das ich derzeit verwende. Snyk Code ist ein Tool für statische Anwendungssicherheitstests (SAST). SAST ist zwar ein Begriff, der hauptsächlich in der InfoSec-Welt verwendet wird, doch das Tool tut genau das, was der Name verspricht: Es analysiert Ihren Java-Code statisch und sucht nach potenziellen Sicherheitslücken. Snyk Code nutzt maschinelles Lernen, um Sicherheitslücken in Ihrem Code besonders schnell und entwicklerfreundlich zu finden. Für diesen Blogbeitrag verwenden wir die GitHub-Integration mit Snyk, um Snyk Code zu nutzen.

Hinweis: Ich verwende derzeit eine frühe Version von Snyk Code. Die allgemeine Verfügbarkeit ist voraussichtlich im April.

Meine Java-Spring-MVC-Anwendung mit Snyk Code scannen

Ich habe Snyk Code in den Einstellungen meines Snyk-Kontos aktiviert. Sobald die Aktivierung abgeschlossen ist, werden alle Repositorys, die Sie ab jetzt importieren, von Snyk Code gescannt. Das bedeutet auch, dass ich Snyk erlaube, meinen Code aktiv zu überprüfen. Das ist nicht erforderlich, wenn Sie nur Snyk Open Source verwenden und nach anfälligen Abhängigkeiten suchen. In diesem Fall müssen wir nur die Manifestdatei lesen, beispielsweise Ihre pom.xml- oder build.gradle-Datei.

Snyk-Einstellungsseite mit ausgewähltem und per Schalter aktiviertem Snyk Code sowie einer Schaltfläche „Änderungen speichern“

Nachdem ich das GitHub-Repository mit meiner Spring-MVC-Java-Anwendung importiert hatte, sah ich fast sofort, dass Snyk Code seine Arbeit getan und die Java-Codeanalyse Sicherheitsprobleme gefunden hatte.

Das Tool fand einige Path-Traversal-Probleme im Zusammenhang mit der Datei-Upload-Logik. Snyk Code entdeckte außerdem mehrere SQL-Injection-Sicherheitslücken, einige Probleme mit Cookies und fest codierte Zugangsdaten. Sehen wir uns ein paar davon kurz an.

Path-Traversal-Sicherheitslücke beim Datei-Upload

Beim Hochladen einer Datei in meine Spring-MVC-Anwendung stellte Snyk Code fest, dass ich die eingehende Datei nicht bereinige. Wenn die Datei ohne Prüfung einfach auf das Dateisystem geschrieben wird, ist Path Traversal möglich. Kann ein Angreifer eine POST-Anfrage erstellen, bei der der Dateiname zu ../../../../../dir/file.x aufgelöst wird, verlassen wir den ursprünglichen Verzeichnisbereich und schreiben die Datei außerhalb der Anwendung. Das bedeutet auch, dass ein Angreifer möglicherweise eine vorhandene Datei überschreiben kann.

Snyk Code-Bericht zu Path Traversal: Nicht bereinigte HTTP-Eingaben fließen in UploadController.java zu Files.write

Zip-Slip-Path-Traversal-Sicherheitslücke

Ein ähnliches Path-Traversal-Problem tritt auf, wenn ich in meiner Spring-MVC-Anwendung ZIP-Dateien hochlade und entpacke. Ich erstelle Dateien auf dem Dateisystem anhand der Dateinamen im ZIP-Archiv, ohne diese zu bereinigen. Wenn Ihre ZIP-Datei wie die folgende aussieht, können Sie Dateien außerhalb des Anwendungsbereichs erstellen oder überschreiben.

-rw-r--r--  18-Apr-15 23:04 good.txt
-rwxrwxrwx  18-Jun-03 17:06 ../../../../../../../../../../../../dir/file.x

Diese spezielle Path-Traversal-Sicherheitslücke in einer ZIP-Datei wird als Zip-Slip-Sicherheitslücke bezeichnet. In der Vergangenheit enthielten viele ZIP- und Entpackbibliotheken eine solche Sicherheitslücke. Denken Sie daher daran, Ihre Abhängigkeiten mit Snyk Open Source zu scannen, um diese anfälligen Bibliotheken zu erkennen.

Snyk Code-Ansicht zu Path Traversal mit einer Erklärung der Sicherheitslücke und hervorgehobenem Datenfluss im Java-Code der UploadController.java

SQL-Injection-Sicherheitslücke bei der Nachrichtensuche

Im Nachrichten-Repository, das ich für diese Spring-MVC-Anwendung in Java geschrieben habe, erstelle ich die Suchabfrage manuell anhand des übergebenen Parameters. Wie Sie im Screenshot unten sehen, verwende ich keine Abfrageparametrisierung. Bei der Abfrageparametrisierung werden die Parameter von der eigentlichen Abfragezeichenfolge getrennt. Durch das Binden der Parameter können Sie sie beispielsweise auf einen bestimmten Typ beschränken und bereinigen. Derzeit füge ich den Parameter einfach an das vorhandene Abfrageliteral an und führe es aus. Dadurch kann ich die SQL-Abfrage manipulieren.

Probieren Sie den folgenden Suchparameter aus: '; UPDATE message SET text = 'EVIL. Ich breche aus der ursprünglichen Abfrage aus und starte eine neue Anweisung, die alle Nachrichten aktualisiert. Das ist wahrscheinlich nicht das, was Sie möchten – zum Glück hat Snyk Code uns geholfen, die Sicherheitslücke zu finden.

Snyk-Bericht zu SQL-Injection: Nicht bereinigte HTTP-Eingaben fließen in einen Java-executeQuery-Aufruf; der anfällige Code ist hervorgehoben.

Weitere durch die Java-Codeanalyse gefundene Sicherheitslücken

Snyk fand auch andere potenzielle Risiken. Beispielsweise sind die Verbindungseigenschaften meiner Datenbank, einschließlich Benutzername und Passwort, fest in meinem Repository codiert. Snyk Code wies mich darauf hin, dass ich das nicht tun sollte – und damit liegt das Tool richtig.

Der Sicherheitsscan markiert fest im Java-Code hinterlegte Datenbankzugangsdaten und zeigt einen Verbindungsaufruf mit DB_URL, USER und PASS.

Snyk Code fand außerdem ein Problem mit einem von mir gesetzten Cookie. Da es sich um eine Spring-MVC-Webanwendung handelt, setze ich auf dem Clientsystem ein Komfort-Cookie, um die userID zu speichern. Die maximale Lebensdauer dieses Cookies ist jedoch auf ein Jahr festgelegt. Wenn Sie vertrauliche Informationen in einem Cookie speichern, ist eine lange maxAge-Angabe nicht ratsam. Wenn Sie Cookies zum vorübergehenden Speichern von Daten verwenden, sollte das Cookie nur begrenzte Zeit gültig sein. Snyk Code weist mich aus gutem Grund darauf hin.

Sicherheitsbefund zu unzureichendem Sitzungsablauf: Ein Spring-MVC-Codeausschnitt aus CookieUtil.java zeigt ein Cookie mit einer MaxAge von einem Jahr.

Fazit

Bei der Entwicklung einer sehr einfachen Java-Webanwendung mit Spring MVC kann vieles schiefgehen. Beachten Sie, dass ich nicht alle Probleme besprochen habe, die Snyk Code in dieser Demo-Anwendung gefunden hat. Diese Aufgabe überlasse ich Ihnen.

Wenn Sie die gesamte Geschäftslogik selbst schreiben, können sich Sicherheitsprobleme einschleichen. Denken Sie daran, dass es gut gepflegte Bibliotheken gibt, mit denen Sie dasselbe Ziel erreichen können. Ein gutes Beispiel im Spring-Framework sind die spring-data-Bibliotheken, die Sie bei Datenbankabfragen unterstützen. Wenn Sie externe Bibliotheken verwenden, sollten Sie sie mit Snyk Open Source scannen, damit Sie keine anfällige Bibliothek einbinden. Dennoch kann es schnell passieren, dass Sicherheitsprobleme in Ihren eigenen Java-Code gelangen – das kann jedem passieren. Diese Sicherheitslücken bei einer Codeüberprüfung zu erkennen, ist schwierig. Zum Glück gibt es Tools wie Snyk Code, die Sie mit einer hervorragenden statischen Java-Codeanalyse unterstützen.

Sichern Sie Ihren Code mit modernsten Erkenntnissen

Lernen Sie in nur 30 Minuten das gesamte Funktionsspektrum von Snyk Code SAST kennen.