Spring4Shell - RCE i Spring

calendar last update on Friday Apr 1, 2022 08:42
Patch er tilgjengelig
Oppgrader til Spring Framework 5.3.18 / 5.2.20 for å tette denne sårbarheten.
Les mer på spring.io
Spring publiserer nå oppdatert informasjon selv, så best informasjon finner du på spring.io.

Spring Core på JDK9+ har en RCE-sårbarhet (Remote Code Execution) som følge av en bypass for CVE-2010-1622. Det finnes i skrivende stund ingen patch for denne såbarheten, og det finnes en offentlig tilgjengelig proof-of-concept. Dette er altså en 12 år gammel sårbarhet!

Ifølge Praetorian krever sårbarheten et endepunkt med DataBinder aktivert (som f.eks. en POST-request som automatisk dekoder data fra body). Hvor mye sårbarheten kan utnyttes avhenger av hvordan du kjører applikasjonen. Hvis du bruker Apache Tomcat f.eks., vil WebAppClassLoader være tilgjengelig, som tillater en angriper å skrive en ondsinnet JSP til disk ved hjelp av gettere og settere. Kjører du derimot Embedded Tomcat Servlet Container vil classloaderen være en LaunchedURLClassLoader, som har langt mer begrenset tilgang.

Det er en annen RCE-sårbarhet også nå, for Spring Cloud, som mange forveksler med denne. Det er fortsatt mye forvirring rundt hva som faktisk er sårbart, og hvor kritisk det er. Men det er nå flere rapporter om vellykkede proof-of-concepts, så noe er i alle fall sårbart.

Vårt råd er derfor å følge nøye med, og være klare til å gjennomføre nødvendige tiltak så fort som mulig.

Er jeg sårbar?

Følgende krav må være på plass for at du skal være sårbar:

  • Du bruker en Spring-app (opp til og med versjon 5.3.17)
  • Du kjører JDK9 eller høyere
  • Du bruker form bindings med name=value (ikke JSON/XML)
  • Du bruker ikke en allowlist eller du har en denylist som ikke blokkerer class, module, classLoader

Merk at denne sårbarheten er generell, det kan dukke opp flere relaterte sårbarheter, eller alternative måter å utnytte denne på. Så det er ingen garanti for at du er trygg selv om du ikke oppfyller alle kravene fra listen over.

Patch

Oppgrader til Spring Framework 5.3.18 / 5.2.20 for å tette denne sårbarheten.

Midlertidige tiltak

Frem til du får patchet kan følgende tiltak forhindre, eller i det minste bremse, potensiell utnyttelse:

Opprett en ControllerAdvice-komponent (som er en Spring-komponent som er delt på tvers av kontrollere) og legg potensielt skadelige pattern i denylist:

 1import org.springframework.core.Ordered;
 2import org.springframework.core.annotation.Order;
 3import org.springframework.web.bind.WebDataBinder;
 4import org.springframework.web.bind.annotation.ControllerAdvice;
 5import org.springframework.web.bind.annotation.InitBinder;
 6
 7
 8@ControllerAdvice
 9@Order(10000)
10public class BinderControllerAdvice {
11    @InitBinder
12    public void setAllowedFields(WebDataBinder dataBinder) {
13         String[] denylist = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"};
14         dataBinder.setDisallowedFields(denylist);
15    }
16}

Kode hentet fra Praetorian

WAF-regler

Du kan prøve å filtrere på class., Class., .class., og .Class.. Pass på at du tester dette før du kjører det ut i prod!

Kilder

Sårbarhet nummer 2 - Spring Cloud Function

Spring Cloud Function har som nevnt også en RCE-sårbarhet, denne har CVE-2022-22963, og en patch.

Det beste å gjøre her er å oppdatere til 3.1.7, 3.2.3, eller høyere.

Sårbarhet nummer 3 - DoS i Spring Framework

Det finnes i tillegg en DoS (Denial of Service) sårbarhet, med kritikalitet medium, i Spring Framework version 5.3.0 til 5.3.16.

Den har CVE-2022-22950.