Goal Reached Thanks to every supporter — we hit 100%!

Goal: 1000 CNY · Raised: 1000 CNY

100.0%

CVE-2022-22965 PoC — Spring Framework 代码注入漏洞

Source
Associated Vulnerability
Title:Spring Framework 代码注入漏洞 (CVE-2022-22965)
Description: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.
Readme
# 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/
File Snapshot

[4.0K] /data/pocs/6e06bb1b7e8dc277f758b520ca8324641575c7c7 └── [6.7K] README.md 0 directories, 1 file
Shenlong Bot has cached this for you
Remarks
    1. It is advised to access via the original source first.
    2. Local POC snapshots are reserved for subscribers — if the original source is unavailable, the local mirror is part of the paid plan.
    3. Mirroring, verifying, and maintaining this POC archive takes ongoing effort, so local snapshots are a paid feature. Your subscription keeps the archive online — thank you for the support. View subscription plans →