In de Spring Core-module, die wordt geleverd met het Spring Framework, is een kritieke 0-dagen kwetsbaarheid ontdekt, waarmee een niet-geauthenticeerde externe aanvaller zijn code op de server kan uitvoeren. Het is nog onduidelijk hoe catastrofaal de gevolgen van het ontdekte probleem kunnen zijn en of de aanvallen net zo massaal zullen zijn als in het geval van de kwetsbaarheid in Log4j 2. De kwetsbaarheid heeft de codenaam Spring4Shell gekregen, maar er is nog geen CVE-identificator toegewezen. In het Spring Framework blijft het probleem onopgelost en er zijn al verschillende werkende prototypes van exploits beschikbaar op het internet (1, 2, 3, 4). Het probleem wordt verergerd door het feit dat veel bedrijfs-Java-applicaties op basis van het Spring Framework met root-rechten worden uitgevoerd en de kwetsbaarheid de mogelijkheid biedt om het systeem volledig te compromitteren.
Volgens sommige schattingen wordt de Spring Core-module gebruikt in 74% van de Java-applicaties. Het gevaar van de kwetsbaarheid wordt verminderd doordat alleen applicaties die de annotatie "@RequestMapping" gebruiken bij het aansluiten van verzoekverwerkers en het binden van webformulierparameters in het formaat "name=value" (POJO, Plain Old Java Object) kwetsbaar zijn, in plaats van het gebruik van JSON/XML.
Het is nog niet duidelijk welke specifieke Java-applicaties en frameworks aan het probleem onderhevig zijn. De kwetsbaarheid blokkeert het toevoegen van de velden "class", "module" en "classLoader" aan de zwarte lijst of het gebruik van een expliciete witte lijst van toegestane velden. Exploitatie van de kwetsbaarheid is alleen mogelijk bij gebruik van Java/JDK 9 of een nieuwere versie. Het probleem wordt veroorzaakt door de mogelijkheid om de bescherming tegen de kwetsbaarheid CVE-2010-1622 te omzeilen, die in 2010 al in het Spring Framework was verholpen en verband hield met de uitvoering van de classLoader-handler bij het parseren van queryparameters.
De werking van de exploit bestaat uit het versturen van een verzoek met de parameters «class.module.classLoader.resources.context.parent.pipeline.first.*», waarvan de verwerking leidt tot het creëren van een jsp-bestand in de hoofdomgeving van Apache Tomcat en het schrijven van de door de aanvaller opgegeven code in dit bestand. Het gemaakte bestand wordt toegankelijk voor directe verzoeken en kan worden gebruikt als web shell. Om een kwetsbare toepassing in de Apache Tomcat-omgeving aan te vallen, is het voldoende om een verzoek met bepaalde parameters te verzenden met behulp van de curl-tool. curl -v -d «class.module.classLoader.resources.context.parent.pipeline.first.pattern=code_om_in_het_bestand_te_plakken &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
Het probleem dat we in Spring Core bespreken, moet niet verward worden met de onlangs ontdekte kwetsbaarheden CVE-2022-22963 en CVE-2022-22950. Het eerste probleem heeft betrekking op het Spring Cloud-pakket en is verholpen in versies 3.1.7 en 3.2.3. Het tweede probleem is aanwezig in Spring Expression en is gecorrigeerd in Spring Framework 5.3.17. Dit zijn fundamenteel verschillende kwetsbaarheden. De ontwikkelaars van Spring Framework hebben nog geen verklaringen afgelegd of oplossingen gepubliceerd voor de nieuwe kwetsbaarheid.
Als een tijdelijke maatregel voor bescherming wordt aanbevolen een zwarte lijst van onaanvaardbare verzoekparameters in de code te gebruiken: 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); } }
Bron: opennet.ru
