Skip to content
KitploitKITPLOIT
ToolsBlog
Log in
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
study-struts2-s2-054_055-jackson-cve-2017-7525_cve-2017-15095 — Untersuchungsbericht zu den Struts2-Schwachstellen S2-045, S2-055 und den Jackson-Schwachstellen CVE-2017-7525, CVE-2017-15095 | Kitploit
Tools/GitHubGitHub/secureskytechnology/study-struts2-s2-054_055-jackson-cve-2017-7525_cve-2017-15095
SchwachstellenanalyseCode-AnalyseWebanwendungs-ExploitationPapers & ForschungLernen & BildungArchived
GitHubsecureskytechnology/study-struts2-s2-054_055-jackson-cve-2017-7525_cve-2017-15095

study-struts2-s2-054_055-jackson-cve-2017-7525_cve-2017-15095

Untersuchungsbericht zu den Struts2-Schwachstellen S2-045, S2-055 und den Jackson-Schwachstellen CVE-2017-7525, CVE-2017-15095

Repository anzeigen
1062114vor 8 JahrenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Untersuchungsbericht zu Struts2-Schwachstellen S2-054, S2-055 und Jackson-Schwachstellen CVE-2017-7525, CVE-2017-15095

Eine Zusammenfassung der wichtigsten Punkte in lesbarer Form wurde veröffentlicht. Empfohlen für alle, die zuerst einen Überblick benötigen oder wenig Zeit haben.

  • SSTtechlog 08 zu S2-054, S2-055 und der jackson-databind-Schwachstelle CVE-2017-7525, CVE-2017-15095 | SST SecureSky Technology Co., Ltd.
    • https://www.securesky-tech.com/column/techlog/08.html

Am 1. Dezember 2017 wurde ein Sicherheitsupdate für Struts2 veröffentlicht. Bereits vor der Veröffentlichung kursierte in der Mailingliste das Gerücht, dass die Schwachstelle von Jackson (einer beliebten JSON-Bibliothek in Java) damit zusammenhänge. Auch der Autor, der Jackson in internen Systemen und Tools verwendet, war gespannt auf die genauen Details.

  • https://lists.apache.org/thread.html/ed74083f2d7187e71ee5ed644c5e45ba58d0792b515d1d1cc28bfadf@%3Cdev.struts.apache.org%3E

Die tatsächlich veröffentlichten Inhalte umfassten Korrekturen für die folgenden zwei Sicherheitsprobleme. Nur S2-055 ist von der Schwachstelle in jackson-databind, einer Komponente von Jackson, betroffen.

  • S2-055 : https://cwiki.apache.org/confluence/display/WW/S2-055
    • Dies ist die Korrektur zu CVE-2017-7525 von jackson-databind.
    • Die Abhängigkeit jackson-databind wurde auf Struts-Seite auf 2.9.2 aktualisiert. Damit ist auch der unten genannte CVE-2017-15095 abgedeckt.
    • https://cwiki.apache.org/confluence/display/WW/Version+Notes+2.5.14.1
  • S2-054 : https://cwiki.apache.org/confluence/display/WW/S2-054
    • Hier wurde im REST-Plugin die alte JSON-Bibliothek JSON-lib ( http://json-lib.sourceforge.net/ ) verwendet, aufgrund eines gemeldeten DoS-Problems jedoch auf Jackson umgestellt.

Im REST-Plugin waren bereits seit längerem sowohl ein Handler mit JSON-lib als auch ein Handler mit Jackson integriert, sodass der Benutzer wählen konnte. Die gesamte Korrektur scheint darin zu bestehen, dass in S2-054 der Standard-Handler auf Jackson umgestellt und in S2-055 die zuvor veraltete Jackson-Version aktualisiert wurde.

Was genau ist also die Schwachstelle CVE-2017-7525? Da der Autor selbst bei der JSON-Verarbeitung in Java üblicherweise Jackson verwendet, wurde dieses Problem am Wochenende des 2. und 3. Dezembers untersucht – dies ist der vorliegende Artikel.


Umgebung des Autors zur Überprüfung des Beispielcodes:

  • OS : Windows 10 Pro 64bit
  • Java : Oracle JDK 1.8.0_92 64bit
  • Groovy : 2.3.1

Über die jackson-databind-Schwachstelle CVE-2017-7525

Im Blog von Adam Caudill wurde eine Erläuterung zu CVE-2017-7525 veröffentlicht.

  • https://adamcaudill.com/2017/10/04/exploiting-jackson-rce-cve-2017-7525/

Zusammengefasst in den eigenen Worten des Autors: jackson-databind bietet eine Funktion zum Mapping von JSON auf Java-Objekte (Klasse ObjectMapper). Durch den Aufruf von ObjectMapper.enableDefaultTyping() wird es möglich, über einen in JSON eingebetteten Klassennamen zu mappen. Viele werden bereits bei dem Punkt „Klassennamen direkt aus der JSON-Eingabe angeben zu können“ ein ungutes Gefühl bekommen – genau diese böse Vorahnung bestätigt sich bei CVE-2017-7525.

Bevor wir auf die Schwachstelle eingehen, erklären wir, warum diese Funktion überhaupt implementiert wurde.

Zur Funktion ObjectMapper.enableDefaultTyping()

Die grundlegende Verwendung der Deserialisierung mit jackson-databind ist im folgenden Beispielcode zu sehen. (In diesem Artikel wird für den Jackson-Beispielcode Groovy verwendet. Praktisch ist, dass man mit @Grab einfach die Version von jackson-databind wechseln kann.)

  • objectmapper-demo.groovy

Im obigen Beispielcode kann der Schlüssel "animal" direkt auf die Klasse Animal gemappt werden. Wie verhält es sich jedoch in folgendem Fall?```java class Zoo { Animal animal; }

abstract class Animal { String name; protected Animal() { } }

class Dog extends Animal { double barkVolume; Dog() { } }

class Cat extends Animal { boolean likesCream; int lives; Cat() { } }

Bei dieser Konfiguration gibt es zwei Fälle: Der Inhalt des Schlüssels "animal" zeigt entweder auf die Dog-Klasse oder auf die Cat-Klasse. Daher sind zusätzliche Informationen erforderlich, um zu bestimmen, welche Klasse für die Zuordnung verwendet werden soll.

Um dieses Problem zu lösen, hat jackson-databind eine eigene Verarbeitung integriert, die den Namen der zuzuordnenden Klasse in das JSON einbetten kann.

Zum Beispiel wie folgt, indem der Inhalt des Schlüssels "animal" in ein Array umgewandelt wird und das erste Element den Klassennamen angibt.```
{"animal":["Dog",{"name":"dog1","barkVolume":1.2}]}

Dadurch erkennt ObjectMapper.readValue(), dass der Inhalt des Schlüssels "animal" die Klasse Dog ist, und führt die Zuordnung durch. Natürlich kann man ohne weitere Maßnahmen nicht unterscheiden, ob der Inhalt des "animal"-Schlüssels ursprünglich ein Array war oder ob er die jackson-databind-eigenen Klassenname-Informationen enthält. Der Wechsel zwischen diesen Modi erfolgt über die Methode ObjectMapper.enableDefaultTyping(). Es gibt auch die Möglichkeit, die Annotation @JsonTypeInfo in der Klasse zu definieren. Weitere Einzelheiten finden Sie in der folgenden Jackson-Dokumentation.

  • JacksonPolymorphicDeserialization
    • https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization

Im Folgenden finden Sie einen Beispielcode, der die Methode ObjectMapper.enableDefaultTyping() verwendet.

  • enable-default-type-demo.groovy

Behandlung von CVE-2017-7525 durch Blacklist-Prüfung von Klassennamen

Wie wir oben gesehen haben, ist es möglich, durch Angabe eines Klassennamens und dessen Eigenschaften im JSON – wenn auch mit gewissen Einschränkungen – beliebige Klassen mit beliebigen Eigenschaften zu instanziieren. Diese Schwachstelle wurde durch CVE-2017-7525 ausgenutzt. Der Auslöser war vermutlich der folgende Bericht:

  • Java Unmarshaller Security - Turning your data into code execution
    • https://github.com/mbechler/marshalsec

Für häufig in Java verwendete Serialisierungs-/Deserialisierungsbibliotheken wie Jackson wurde über die Gefahr berichtet, dass eine Manipulation von Klassennamen zu beliebiger Codeausführung führen kann. Es wurden konkrete gefährliche Klassennamen aufgelistet.

Ob dies der Auslöser war, ist nicht sicher, aber zeitlich kurz nach dem ersten Commit des obigen Repositories wurde das folgende Issue für jackson-databind erstellt und die Behebung begann.

  • Jackson Deserializer security vulnerability
    • https://github.com/FasterXML/jackson-databind/issues/1599

Wie sehen eigentlich JSON-Daten und Java-Code aus, die diese Schwachstelle ausnutzen? Einen Hinweis gibt der Testcode von jackson-databind 2.8.9, der in diesem Issue behandelt wurde:

  • https://github.com/FasterXML/jackson-databind/blob/jackson-databind-2.8.9/src/test/java/com/fasterxml/jackson/databind/interop/IllegalTypesCheckTest.java

Basierend auf diesem Testcode wird im Folgenden ein angepasster Beispielcode gezeigt, mit dem Sie die Funktionsweise überprüfen können:

  • cve-2017-7525-check.groovy
Tool herunterladen