Einführung in die Schwachstelle
Kürzlich wurde von Spring eine schwerwiegende CVE-Schwachstelle veröffentlicht. Die CVE-Informationen besagen: „A Spring MVC or Spring WebFlux application running on JDK 9+ may be vulnerable to remote code execution (RCE) via data binding. The specific exploit requires the application to run on Tomcat as a WAR deployment. If the application is deployed as a Spring Boot executable jar, i.e. the default, it is not vulnerable to the exploit. However, the nature of the vulnerability is more general, and there may be other ways to exploit it. (Eine Spring-MVC- oder Spring-WebFlux-Anwendung, die auf JDK 9+ läuft, kann möglicherweise anfällig für Remote-Code-Ausführung (RCE) durch Datenbindung sein. Der spezifische Exploit erfordert, dass die Anwendung als WAR-Deployment auf Tomcat ausgeführt wird. Wenn die Anwendung als ausführbares Spring-Boot-JAR bereitgestellt wird, also der Standardfall, ist sie nicht anfällig für den Exploit. Die Art der Schwachstelle ist jedoch allgemeiner, und es könnte andere Möglichkeiten geben, sie auszunutzen.)“. In dieser Analyse wird das Prinzip der Schwachstelle durch die Reproduktion dieser CVE untersucht.
Java-Bean-API
Bevor wir uns das Prinzip der Parameterbindung von Spring MVC ansehen, schauen wir uns zunächst einige APIs im Zusammenhang mit Java Beans an.
- Java Bean: Eigentlich handelt es sich um eine Spezifikation. Wenn eine Klasse diese Spezifikation erfüllt, kann diese Klasse von anderen bestimmten Klassen aufgerufen werden. Wenn eine Klasse als Java Bean verwendet wird, enthält sie eine Reihe privater Eigenschaften, die über öffentliche get/is() oder set()-Methoden gelesen und geschrieben werden.
- Introspector (Introspektion): The Introspector class provides a standard way for tools to learn about the properties, events, and methods supported by a target Java Bean.
For each of those three kinds of information, the Introspector will separately analyze the bean's class and superclasses looking for either explicit or implicit information and use that information to build a BeanInfo object that comprehensively describes the target bean. (Java bietet eine Standardbehandlung für Eigenschaften, Ereignisse und Methoden von Java-Bean-Klassen. Wenn beispielsweise eine Eigenschaft/Methode einer Bean-Klasse gesucht wird und diese Eigenschaft in der aktuellen Bean-Klasse nicht gefunden wird, wird in der Elternklasse der Bean-Klasse gesucht usw.)
- BeanInfo: Introspect on a Java Bean and learn about all its properties, exposed methods, and events. If the BeanInfo class for a Java Bean has been previously Introspected then the BeanInfo class is retrieved from the BeanInfo cache. (Führt eine Introspektion einer Java Bean durch und ermittelt alle ihre Eigenschaften, öffentlichen Methoden und Ereignisse. Wenn die BeanInfo-Klasse einer Java Bean zuvor einer Introspektion unterzogen wurde, wird die BeanInfo-Klasse aus dem BeanInfo-Cache abgerufen.)
- PropertyDescriptor: Wird verwendet, um die Eigenschaften zu beschreiben, die eine Java Bean über eine Gruppe von Accessor-Methoden bereitstellt.