Skip to main content

Schwachstellen in Maven-Projekten beheben

Artikel von
Maven feature

14. September 2020

0 Min. Lesezeit

Maven ist nach wie vor das meistgenutzte Build-System im Java-Ökosystem. Laut dem JVM-Bericht 2020 ist Maven mit einem Anteil von zwei Dritteln das führende Build-Tool im Ökosystem.

Deshalb ist es wichtig zu wissen, wie Maven funktioniert. Was können Sie zum Beispiel tun, wenn Sie mit Snyk Schwachstellen in Ihrem Maven-Projekt finden? In diesem Artikel erkläre ich, wie Sie Schwachstellen in Drittanbieterbibliotheken mit Maven beheben können, auch wenn die Lösung nicht offensichtlich ist.

Schwachstellen finden

Wenn Sie Maven zum Erstellen Ihres Projekts und Verwalten seiner Abhängigkeiten verwenden, gibt es verschiedene Möglichkeiten, Ihre Projekte mit Snyk zu scannen. Dabei spielt die verwendete Programmiersprache keine Rolle – ob Java, Kotlin, Scala, Groovy oder eine andere Sprache für die Java Virtual Machine (JVM).

Sie können Ihr Maven-Projekt mit Snyk auf Schwachstellen scannen, indem Sie Folgendes verwenden:

Am Beispiel der CLI zeigt Snyk Ihnen, ob und wie Sie Schwachstellen durch ein Update der direkten Abhängigkeiten beheben können. Gibt es jedoch keine verbesserte Version der direkten Abhängigkeiten, zeigt Snyk Ihnen, ob eine neuere Version der zugrunde liegenden Abhängigkeit verfügbar ist, die die Schwachstellen behebt.

Terminalausgabe mit einer Liste von Softwareschwachstellen, darunter die Deserialisierung nicht vertrauenswürdiger Daten und Denial-of-Service-Angriffe, sowie Empfehlungen für Upgrades.

Schwachstellen in direkten Abhängigkeiten beheben

Am einfachsten beheben Sie eine von Snyk gefundene Schwachstelle, indem Sie die direkte Bibliothek ändern, sofern das möglich ist. Hat die Bibliothek keine weiteren Abhängigkeiten, ist es naheliegend, auf eine neuere Version ohne das betreffende Problem zu aktualisieren. Dasselbe gilt, wenn eine zugrunde liegende Abhängigkeit ein Problem aufweist, aber bereits eine neuere Version der direkten Abhängigkeit verfügbar ist, die nicht betroffen ist.

Es gibt verschiedene Möglichkeiten, die Version zu ändern. Finden Sie zunächst heraus, wo die Version angegeben ist. Bei direkten Abhängigkeiten finden Sie sie meist an einer der folgenden Stellen:

  • in einer übergeordneten POM-Datei

  • in einer Property

  • direkt auf Ebene der Abhängigkeit

Übergeordnete POM-Datei

Wenn die Abhängigkeit, die Sie aktualisieren müssen, in einer übergeordneten POM-Datei definiert ist, suchen Sie zunächst nach einer neueren Version dieser POM-Datei. Nehmen wir Spring Boot als Beispiel: Gibt es bereits eine neuere Version der übergeordneten POM-Datei, sollten Sie zuerst ein Upgrade auf diese Version in Betracht ziehen und prüfen, ob das Problem dadurch behoben wird. So aktualisieren Sie den gesamten Satz an Abhängigkeiten. In den meisten Fällen harmonieren diese besser miteinander, als wenn Sie nur eine einzelne Abhängigkeit aktualisieren. Wenn Sie die übergeordnete POM-Datei nicht wechseln oder ändern können, verwenden Sie den direkten Ansatz.

<parent>
   <groupId>io.snyk</groupId>
   <artifactId>demo-parent</artifactId>
   <version>1.0.4.RELEASE</version>
</parent>

Properties

Wenn eine Property verwendet wird, aktualisieren Sie zunächst diese. Dadurch können möglicherweise auch andere Abhängigkeiten aktualisiert werden. Wie bei der übergeordneten POM-Datei hat das jedoch einen guten Grund: Werden Bibliotheken als Set veröffentlicht, funktionieren sie bekanntermaßen besser zusammen, wenn sie dieselbe Version haben.

<dependency>
  <groupId>org.eclipse.collections</groupId>
  <artifactId>eclipse-collections</artifactId>
  <version>10.4.0</version>
</dependency>

Direkt

Schließlich kann Ihre Abhängigkeit im Abschnitt „dependencies“ Ihrer Maven-POM-Datei deklariert sein. Dort geben Sie groupId, artifactId und in vielen Fällen auch die Version an. Ist die Version hier angegeben, aktualisieren Sie sie einfach. Andernfalls können Sie sie hinzufügen.

Beachten Sie, dass dies die niedrigste Ebene zum Deklarieren der Abhängigkeitsversion ist und alle anderen Möglichkeiten zur Festlegung der Version überschreibt.

<dependency>
  <groupId>org.eclipse.collections</groupId>
  <artifactId>eclipse-collections</artifactId>
  <version>10.4.0</version>
</dependency>

Schwachstellen in zugrunde liegenden Abhängigkeiten beheben

Nehmen wir an, es gibt noch keine neuere Version Ihrer direkten Abhängigkeit, aber eine der zugrunde liegenden Abhängigkeiten weist ein Problem auf, das Sie beheben müssen. Die CLI hat Sie bereits darüber informiert, dass eine neuere Version dieser zugrunde liegenden Abhängigkeit verfügbar ist, die das Problem behebt.

Bill of Materials

Viele Frameworks verwenden eine Bill of Materials (BOM), um zugrunde liegende Abhängigkeiten zu verwalten. Eine BOM ist eine spezielle Art von POM, mit der die Versionen der Abhängigkeiten eines Projekts gesteuert werden. Sie bietet einen zentralen Ort, an dem diese Versionen definiert und aktualisiert werden können.

Wenn eine zugrunde liegende Abhängigkeit in einem Framework wie Spring Boot ersetzt werden muss, prüfen Sie, ob diese Abhängigkeit Teil einer BOM ist. Falls ja, suchen Sie nach einer neueren Version dieser BOM und aktualisieren Sie die Version. In Spring Boot und vielen anderen bekannten Frameworks werden die BOM-Versionen als Property angegeben. Sie können diese Property in Ihrer eigenen Maven-POM-Datei überschreiben, indem Sie eine Property hinzufügen.

Im folgenden Beispiel überschreibe ich die BOM für Jackson in meinem Spring-Boot-Projekt:

<properties>
    <jackson.version>2.10.2.20200130</jackson.version>
</properties>

Abhängigkeitsverwaltung

In einer Maven-POM-Datei können Sie bestimmte zugrunde liegende Abhängigkeiten ausschließen und einschließen, wenn Sie eine direkte Abhängigkeit deklarieren. Das kann jedoch problematisch sein, wenn zwei Bibliotheken dieselbe zugrunde liegende Abhängigkeit verwenden. In Maven empfiehlt es sich, diese Deklarationen im Abschnitt „dependency management“ zusammenzufassen. In diesem Abschnitt können Projektverantwortliche direkt die Versionen der Artefakte festlegen, die bei transitive Abhängigkeiten verwendet werden sollen. Neben dem folgenden Beispiel erklärt die Dokumentation klar, wie dependencyManagement verwendet werden sollte:

<dependencyManagement>
   <dependencies>
       <dependency>
           <groupId>org.yaml</groupId>
           <artifactId>snakeyaml</artifactId>
           <version>1.26</version>
       </dependency>
   </dependencies>
</dependencyManagement>

Fazit

Wie Sie sehen, gibt es verschiedene Möglichkeiten, Sicherheitsprobleme in Open-Source-Abhängigkeiten eines Maven-basierten Projekts zu entschärfen. Selbst wenn sich das Problem nicht direkt durch ein Update einer direkten Abhängigkeit beheben lässt, können Sie eine zugrunde liegende transitive Abhängigkeit herausfiltern und auf die verfügbare neuere Version umstellen. Snyk Open Source liefert Ihnen Informationen dazu, auf welche Version Sie aktualisieren müssen. In diesem Artikel erfahren Sie, wie Sie Snyk in Ihrem Maven-Projekt richtig konfigurieren können.

Starten Sie mit Capture-the-Flag

Erfahren Sie in unserem virtuellen On-Demand-Workshop für Einsteiger, wie Sie Capture-the-Flag-Challenges lösen.