Share
## https://sploitus.com/exploit?id=0273F07C-E2F1-5454-85F6-6B58CCA854A3
# Sårbarheter i Spring Framework - CVE-2022-22965

## Liste over programvare som er / ikke er sårbar

https://github.com/NCSC-NL/spring4shell/blob/main/software/README.md

## Finne sårbar kode

Forutsetninger for å være sårbar for CVE-2022-22965:
#### 1) Bruk av Spring Framework
Se Powershell- og bash-scripts lenger ned.

#### 2) Versjonene av Spring Framework må være sårbare, dette gjelder i utgangspunktet alle versjoner tidligere enn 5.3.18 og 5.2.20. 

Hilko Bengen har publisert en scanner som søker etter sårbare versjoner av CachedIntrospectionResults.class med utgangspunkt i versjoner her: https://github.com/hillu/local-spring-vuln-scanner


#### 3) Bruk av JDK9 eller nyere, og at man kjører JRE 9 eller nyere. 

Dette kan man finne ut ved å kjøre:

```
java -version
```

på aktuelle systemer. 

Merk at java-applikasjoner kan kjøres på en rekke ulike måter, og man kan ha en rekke ulike versjoner installert samtidig. For å være sikker på hva slags java-versjon som kjører, kan man først identifisere hvor java-binærfilen kjøres fra, og deretter se hvilken versjon den aktuelle java-binærfilen er.

I Linux kan dette gjøres ved å kjøre:
```
ps aux | grep java
```
hvor man f.eks. finner `/usr/lib/jvm/java-11-openjdk-amd64/bin/java`, og man kan da kjøre følgende kommando ved bruk av absolutt filsti:

```
$ /usr/lib/jvm/java-11-openjdk-amd64/bin/java -version
openjdk version "11.0.14.1" 2022-02-08
OpenJDK Runtime Environment (build 11.0.14.1+1-Ubuntu-0ubuntu1.18.04)
OpenJDK 64-Bit Server VM (build 11.0.14.1+1-Ubuntu-0ubuntu1.18.04, mixed mode, sharing)
```

Tilsvarende i Windows kan man finne absolutt filsti for kjørende java-prosesser enten ved bruk av WMI eller Powershell:

```
WMI: C:\> wmic process where "name='java.exe'" get ExecutablePath
PowerShell: PS C:\> Get-Process java | Select-Object Path
```

#### 4) Koden som benytter Spring Framework må også benytte seg av bestemte metoder med bestemte parametere for at en angriper skal kunne utnytte sårbarheten.

JFrog har publisert Python-kode som identifiserer bruk av dette, og dette kan brukes direkte på kompilerte Javaprogrammer slik at man ikke trenger å pakke ut .jar/.war-filer: https://github.com/jfrog/jfrog-spring-tools


Når det gjelder identifikasjon av Spring Framework på systemet, så er det avhengig av hvilket operativsystem som kjøres:

### Windows

Følgende Powershell-scripts for å finne potensielt sårbare applikasjoner, dvs applikasjoner som benytter seg av, eller er basert på Spring Framework. Merk at disse scriptene ikke vil skille på oppdaterte versjoner eller ikke, men de vil identifisere systemer det er sannsynlig at kan ha sårbarheten p.t. ref pkt 1 over.

Søk etter `spring-beans*.jar` og `cachedintrospectionresults.class` i `*.war`-filer`på systemet:

```powershell
$SearchName = "*.war"
$Drives = Get-WmiObject Win32_LogicalDisk -Filter 'DriveType=3' | Select -ExpandProperty DeviceID
#$Drives = Get-CimInstance Win32_LogicalDisk -Filter 'DriveType=3' | Select-Object -ExpandProperty DeviceID 
#powershell version 6

$Vulnerable = $false
$entries = @()
$hits = @()
$search1 = "spring-beans*.jar"
$search2 = "cachedintrospectionresults.class"
Foreach ($drive in $drives) {
    $SearchDir = "$drive\"
    $wars= (&cmd /c pushd $searchDir `& robocopy /l "$searchDir" null "$searchName" /ns /njh /njs /np /nc /ndl /xjd /mt /s)  -replace '^\s+|\s+$'
        
    Foreach ($war in $wars){
        If($war) {
            #$war
            Add-Type -AssemblyName System.IO.Compression
            Add-Type -AssemblyName System.IO.Compression.FileSystem
            $entries = ([System.IO.Compression.ZipArchive]([System.IO.Compression.ZipFile]::OpenRead($war))).Entries
            foreach ($entry in $entries){
                if ($entry.Name -like $search1) {
                    "$($war)\$($entry.FullName)"
                    $hits = $hits +1
                    }
                if ($entry.Name -like $search2) {
                    "$($war)\$($entry.FullName)"
                    $hits = $hits +1
                    }
                }
            
        }
    
    }
    
}
If ($hits){ "Vulnerable" }
Else { "Compliant" }
```

Videre er søk etter `cachedintrospectionresults.class` på tvers av alt av `.jar`-filer nyttig, og vi kjenner til at det ikke alltid er `spring-beans*.jar` som inneholder denne klassen.

```powershell
$SearchName = "*.jar"
$Drives = Get-WmiObject Win32_LogicalDisk -Filter 'DriveType=3' | Select -ExpandProperty DeviceID
#$Drives = Get-CimInstance Win32_LogicalDisk -Filter 'DriveType=3' | Select-Object -ExpandProperty DeviceID 
#powershell version 6

$Vulnerable = $false
$entries = @()
$hits = @()
$search1 = "cachedintrospectionresults.class"
Foreach ($drive in $drives) {
    $SearchDir = "$drive\"
    $wars= (&cmd /c pushd $searchDir `& robocopy /l "$searchDir" null "$searchName" /ns /njh /njs /np /nc /ndl /xjd /mt /s)  -replace '^\s+|\s+$'
        
    Foreach ($war in $wars){
        If($war) {
            #$war
            Add-Type -AssemblyName System.IO.Compression
            Add-Type -AssemblyName System.IO.Compression.FileSystem
            $entries = ([System.IO.Compression.ZipArchive]([System.IO.Compression.ZipFile]::OpenRead($war))).Entries
            foreach ($entry in $entries){
                if ($entry.Name -like $search1) {
                    "$($war)\$($entry.FullName)"
                    $hits = $hits +1
                    }
                }
            
        }
    
    }
    
}
If ($hits){ "Vulnerable" }
Else { "Compliant" }
```

### Linux

For søk på Linux kan man se etter klassen `cachedintrospectionresults.class` i alle `.jar` og `.war` filer på disk, samt se etter spring-beans*.jar i `*.war`-filer:

```bash
find / -name '*.jar' -exec grep -Fi 'cachedintrospectionresults.class' {} \;
find / -name '*.war' -exec grep -Ei 'cachedintrospectionresults\.class|spring-beans.*\.jar' {} \;
```

samt se etter samme klassenavn i `.jar` filer som ligger inni `.war` filer:

```bash
#!/bin/bash

find / -name '*.war' -print0 2>/dev/null -print0 | while read -d $'\0' spring; do
        echo -en "${spring}: "$(unzip -p "${spring}" '*.jar' | strings | grep -Fi 'cachedintrospectionresults.class' | awk '{ print $NF }')"\n"
done
exit 0
```

## Ressurser

https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcement

https://www.praetorian.com/blog/spring-core-jdk9-rce/

https://bugalert.org/content/notices/2022-03-30-spring.html

https://www.rapid7.com/blog/post/2022/03/30/spring4shell-zero-day-vulnerability-in-spring-framework/

https://www.lunasec.io/docs/blog/spring-rce-vulnerabilities/