
Spring Framework CVE-2022-22965 lokale Auswirkungsbedingungen-Verifizierung, Versions-Upgrade-Fix und erneutes Testprojekt
Dieses Projekt dient dem Lernen und Verifizieren von Spring Framework CVE-2022-22965, auch bekannt als die Spring4Shell-Sicherheitslücke, einschließlich der Auswirkungsbedingungen, der Risikodarstellung, der Behebungsmethoden und des Wiederholungstestprozesses nach der Behebung.
Das Projekt wurde in einer eigens eingerichteten lokalen autorisierten Umgebung durchgeführt. Der Schwerpunkt liegt nicht auf Angriffen auf reale Ziele, sondern darauf, durch den Aufbau einer Spring MVC-Testumgebung vor und nach der Behebung die relevanten Auswirkungsbedingungen der Sicherheitslücke Punkt für Punkt zu bestätigen und auf sichere, kontrollierbare, schreibgeschützte Weise die Unterschiede im Zugriff auf interne Eigenschaftspfade der Spring-Datenbindung vor und nach dem Versionsupgrade zu beobachten.
Dieses Projekt hat folgende Abläufe durchgeführt:
Dieses Projekt ist ausschließlich für die eigene lokale Testumgebung oder ausdrücklich autorisierte Sicherheitstestumgebungen bestimmt.
Das Projekt führt keine Scans, Erkundungen oder Exploits gegen öffentliche Websites, Server oder Drittanbieter-Systeme durch und enthält keine echten Benutzerdaten oder Geschäftsdaten.
Während des Tests wurden keine der folgenden Aktionen durchgeführt:
Es ist untersagt, die Testmethoden dieses Projekts gegen nicht autorisierte Ziele einzusetzen.
CVE-2022-22965, allgemein als Spring4Shell bezeichnet, ist eine Sicherheitslücke zur Remote-Code-Ausführung im Spring Framework, die mit dem Datenbindungsmechanismus von Anfrageparametern zusammenhängt.
Spring MVC unterstützt die automatische Bindung von HTTP-Anfrageparametern an Java-Objekteigenschaften. Beispielsweise empfängt dieses Projekt über die folgende Methode Name- und E-Mail-Parameter:
@ModelAttribute("profile") UserProfile profile
Normalerweise werden die Anfrageparameter name und email gemäß dem Eigenschaftsnamen an das UserProfile-Objekt gebunden.
In den betroffenen Versionen sind die Zugriffsbeschränkungen auf einige interne Eigenschaftspfade nicht streng genug. Bei Verwendung von JDK 9 oder höher und unter bestimmten Servlet-Container-, Bereitstellungs- und Datenbindungsbedingungen können externe Anfrageparameter von normalen Geschäftsobjekten aus auf Java Class, Module, Klassenlader oder containerbezogene interne Objekte zugreifen.
In bestimmten ausnutzbaren Umgebungen könnte ein Angreifer die Serverkonfiguration ändern oder Dateien auf dem Server schreiben, wodurch ein Risiko für Remote-Code-Ausführung entsteht.
Dieses Projekt führt keine vollständige Remote-Code-Ausführung durch, sondern verwendet den folgenden Eigenschaftspfad für eine sichere, schreibgeschützte differenzielle Diagnose:
class.module.name
Dieses Projekt wurde in einer isolierten lokalen VMware-Testumgebung durchgeführt.
127.0.0.1Normale Funktionstestdaten:
Alice[email protected]Sicherheitsdiagnose-Eigenschaftspfad:
class.module.name
spring4shell-local-verification-lab/
README.md: Projektbeschreibung, Testansatz, Verifizierungsergebnisse und Behebungsbeschreibungdocs/: Spring4Shell Lokale Auswirkungsbedingungen - Verifizierungs-, Behebungs- und Wiederholungstestberichtimages/: Screenshots der Laborumgebung, des Testprozesses und der Wiederholungstestsvulnerable-demo/: Projekt vor der Behebung mit Spring Framework 5.3.17fixed-demo/: Projekt nach der Behebung mit Spring Framework 5.3.18notes/: Lernnotizen und ProzessaufzeichnungenWichtige Quellcode-Struktur:
config/: Spring MVC-Konfigurationsklassen und Applikationsinitialisierungsklassencontroller/: Controller für Formularverarbeitung und Eigenschaftspfaddiagnosemodel/: UserProfile-Klasse zum Empfang von Name- und E-Mail-ParameternWEB-INF/views/: JSP-Seiten für Startseite, Sendeergebnis und DiagnoseergebnisDieses Projekt hat zwei Spring MVC-Anwendungen eingerichtet: eine vor und eine nach der Behebung.
Projektverzeichnis:
vulnerable-demo
Verwendete Version:
Spring Framework 5.3.17
Generierte WAR-Datei:
spring4shell-vulnerable-demo.war
Zugriffsadresse:
http://127.0.0.1:8080/spring4shell-vulnerable-demo/
Diagnoseseite:
http://127.0.0.1:8080/spring4shell-vulnerable-demo/binding-probe
Projektverzeichnis:
fixed-demo
Verwendete Version:
Spring Framework 5.3.18
Generierte WAR-Datei:
spring4shell-fixed-demo.war
Zugriffsadresse:
http://127.0.0.1:8080/spring4shell-fixed-demo/
Diagnoseseite:
http://127.0.0.1:8080/spring4shell-fixed-demo/binding-probe
Das Testprojekt bietet ein einfaches Benutzerprofil-Formular mit:
Der Controller empfängt die Anfrageparameter wie folgt:
@ModelAttribute("profile") UserProfile profile
Wenn der Benutzer Name und E-Mail sendet, bindet Spring MVC die Parameter name und email automatisch an das UserProfile-Objekt.
Die Ergebnis-Seite liest das gebundene Objekt und zeigt den gesendeten Namen und die E-Mail des Benutzers an.
Diese Funktion dient der Bestätigung, dass das Projekt ordnungsgemäß läuft und dass ein gültiger Einstiegspunkt für die Datenbindung von Spring MVC-Anfrageparametern in der Anwendung vorhanden ist.
Dieses Projekt folgt dem Ansatz „zuerst normale Funktionalität bestätigen, dann die Auswirkungsbedingungen bestätigen, danach eine schreibgeschützte Risikodiagnose durchführen und schließlich beheben und wiederholt testen".
@ModelAttribute an das UserProfile-Objekt.class.module.name mit Spring BeanWrapper.Dieses Projekt hat die folgenden Auswirkungsbedingungen Punkt für Punkt bestätigt:
spring-webmvc-Komponente@ModelAttributeDie tatsächlich bereitgestellten Spring-Abhängigkeiten des Projekts vor der Behebung umfassen:
spring-beans-5.3.17.jarspring-core-5.3.17.jarspring-web-5.3.17.jarspring-webmvc-5.3.17.jarDieses Projekt bewertet die Sicherheitslücke nicht allein anhand der Spring Framework-Version, sondern führt eine umfassende Analyse unter Berücksichtigung von JDK, Spring MVC, Tomcat, WAR-Bereitstellung und Datenbindungseinstieg durch.
Um destruktive Exploits zu vermeiden, verwendet dieses Projekt den von Spring Framework bereitgestellten BeanWrapper für eine schreibgeschützte Überprüfung des folgenden Eigenschaftspfads:
class.module.name
Dieser Pfad repräsentiert:
class: Zugriff auf das Java Class-Objekt, das dem aktuellen Geschäftsobjekt entsprichtmodule: Zugriff auf das Java-Modul, zu dem diese Klasse gehörtname: Lesen des ModulnamensDer Diagnoseprozess ruft nur die Lesbarkeitsprüfung der Eigenschaft und die Methode zum Lesen des Eigenschaftswerts auf:
Daher kann diese Diagnose nur dazu dienen, den Zugriffsunterschied auf den internen Eigenschaftspfad vor und nach der Behebung zu beobachten, und kann nicht allein den Nachweis einer erfolgreichen Remote-Code-Ausführung erbringen.
Umgebung vor der Behebung mit:
Spring Framework 5.3.17
Überprüfter Eigenschaftspfad:
class.module.name
Diagnoseergebnis:
truenulltrue bedeutet, dass die aktuelle Umgebung über die class-Eigenschaft des normalen Geschäftsobjekts weiter zum Auflösen von module.name gelangen kann.
Das Leseergebnis ist null, weil die aktuelle WAR-Anwendung in einem unbenannten Java-Modul läuft und der Modulname leer ist; dies bedeutet nicht, dass der Eigenschaftspfad nicht gelesen werden kann.
Umgebung nach der Behebung mit:
Spring Framework 5.3.18
Erneute Diagnose mit demselben Eigenschaftspfad:
class.module.name
Diagnoseergebnis:
falseNot readableDie Ergebnisse vor und nach der Behebung zeigen einen klaren Kontrast:
Dieses Ergebnis zeigt, dass der Zugriff auf den ursprünglich diagnostizierten Eigenschaftspfad nach dem Versionsupgrade eingeschränkt wurde und das zuvor beobachtete Risiko nicht mehr besteht.
Dieses Projekt verwendet die Methode des Upgrades der Spring Framework-Version zur Behebung.
Konfiguration vor der Behebung:
<spring.version>5.3.17</spring.version>
Konfiguration nach der Behebung:
<spring.version>5.3.18</spring.version>
Während des Behebungsprozesses wurden die folgenden Aktionen durchgeführt:
fixed-demo.Die tatsächlich bereitgestellten Spring-Abhängigkeiten des behobenen Projekts umfassen:
spring-beans-5.3.18.jarspring-core-5.3.18.jarspring-web-5.3.18.jarspring-webmvc-5.3.18.jarDieses Ergebnis beweist, dass die behobene Version neu erstellt und tatsächlich bereitgestellt wurde, und nicht nur die Versionsnummer in der pom.xml geändert wurde.
Nach dem Upgrade auf Spring Framework 5.3.18 wurde die Startseite des behobenen Projekts erneut aufgerufen und die folgenden Testdaten gesendet:
Alice[email protected]Nach dem Senden zeigte die Seite weiterhin normal an:
Alice[email protected]Dieses Ergebnis zeigt, dass das Versionsupgrade die ursprüngliche normale Anfrageparameterbindung und die Seitenanzeigefunktion des Projekts nicht beeinträchtigt hat.
Der automatische Datenbindungsmechanismus von Spring MVC kann gemäß dem Namen des HTTP-Anfrageparameters auf Java-Objekteigenschaften zugreifen.
Normale Geschäftsparameter wie name und email müssen nur auf die entsprechenden normalen Eigenschaften in UserProfile zugreifen.
Allerdings unterstützt Spring's Eigenschaftszugriffsmechanismus auch verschachtelte Eigenschaftspfade mit Punkten. In den betroffenen Versionen sind die Beschränkungen für einige interne Eigenschaftspfade nicht streng genug, sodass externe Parameter in bestimmten Umgebungen von normalen Geschäftsobjekten weiter auf Java Class, Module, Klassenlader oder servlet-containerbezogene Objekte zugreifen können.
Wenn interne Objekte beschreibbare Eigenschaften haben, die die Serverkonfiguration oder das Dateisystem beeinflussen können, und wenn die Anwendung gleichzeitig die Bedingungen wie JDK, Tomcat, WAR-Bereitstellung und Datenbindung erfüllt, kann dies zu einem Risiko für Remote-Code-Ausführung führen.
Diese Sicherheitslücke besteht nicht, weil die Eigenschaften name oder email selbst problematisch sind, und nicht alle Projekte, die Spring MVC verwenden, sind zwangsläufig ausnutzbar. Für die Wirksamkeit der Sicherheitslücke sind in der Regel mehrere Bedingungen gleichzeitig erforderlich.
In realen Geschäftssystemen wird empfohlen, die folgenden Maßnahmen zu ergreifen:













Dieses Projekt hat in einer lokalen isolierten Umgebung die Bestätigung der Auswirkungsbedingungen, die Diagnose der Risikodarstellung, das Versionsupgrade und den Wiederholungstest für Spring Framework CVE-2022-22965 durchgeführt.
Das Projekt vor der Behebung verwendete Spring Framework 5.3.17. In der Umgebung mit JDK 11, Spring MVC, Apache Tomcat 9.0.60 und traditioneller WAR-Bereitstellung wurde der Eigenschaftspfad class.module.name als lesbar eingestuft.
Das Projekt nach der Behebung führte ein Upgrade von Spring Framework auf 5.3.18 durch. Der gleiche Eigenschaftspfad wurde als nicht lesbar eingestuft, während die normale Datenbindungsfunktion für Name und E-Mail weiterhin nutzbar blieb.
Dieses Projekt hat keine vollständige Remote-Code-Ausführung durchgeführt, sondern mit einer sicheren, kontrollierbaren, schreibgeschützten Methode die Differenz vor und nach der Behebung verifiziert.
Das Projekt zeigt die folgenden Fähigkeiten: