
Script di rilevamento e guida per la vulnerabilità CVE-2022-22965 (Spring4Shell) nel framework Spring, inclusi scanner PowerShell e Bash per file JAR/WAR vulnerabili e controlli della versione JDK.
https://github.com/NCSC-NL/spring4shell/blob/main/software/README.md
Prerequisiti per essere vulnerabili a CVE-2022-22965:
Vedere gli script Powershell e bash più avanti.
Hilko Bengen ha pubblicato uno scanner che cerca versioni vulnerabili di CachedIntrospectionResults.class basandosi sulle versioni qui: https://github.com/hillu/local-spring-vuln-scanner
Questo si può scoprire eseguendo:
java -version
sui sistemi interessati.
Nota che le applicazioni Java possono essere eseguite in vari modi, e si possono avere diverse versioni installate contemporaneamente. Per essere sicuri di quale versione Java è in esecuzione, si può prima identificare da dove viene eseguito il binario Java, e poi vedere quale versione è quel binario.
In Linux si può fare eseguendo:
ps aux | grep java
dove ad esempio si trova /usr/lib/jvm/java-11-openjdk-amd64/bin/java, e si può quindi eseguire il seguente comando usando il percorso assoluto:
$ /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)
Analogamente in Windows si può trovare il percorso assoluto per i processi Java in esecuzione usando WMI o PowerShell:
WMI: C:\> wmic process where "name='java.exe'" get ExecutablePath
PowerShell: PS C:\> Get-Process java | Select-Object Path
JFrog ha pubblicato codice Python che identifica l'uso di ciò, e può essere usato direttamente su programmi Java compilati senza dover estrarre file .jar/.war: https://github.com/jfrog/jfrog-spring-tools
Per quanto riguarda l'identificazione di Spring Framework sul sistema, dipende dal sistema operativo in esecuzione:
I seguenti script PowerShell per trovare potenziali applicazioni vulnerabili, cioè applicazioni che utilizzano o sono basate su Spring Framework. Nota che questi script non distingueranno tra versioni aggiornate o meno, ma identificheranno i sistemi che probabilmente possono avere la vulnerabilità al momento, rif. punto 1 sopra.
Cerca spring-beans*.jar e cachedintrospectionresults.class nei file *.war sul sistema:
$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](https://github.com/helsecert/cve-2022-22965/blob/main/%5BSystem.IO.Compression.ZipFile%5D%3A%3AOpenRead%28%24war))).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" }
Inoltre, la ricerca di cachedintrospectionresults.class in tutti i file .jar è utile, e sappiamo che non è sempre spring-beans*.jar a contenere questa classe.
$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](https://github.com/helsecert/cve-2022-22965/blob/main/%5BSystem.IO.Compression.ZipFile%5D%3A%3AOpenRead%28%24war))).Entries
foreach ($entry in $entries){
if ($entry.Name -like $search1) {
"$($war)\$($entry.FullName)"
$hits = $hits +1
}
}
}
}
}
If ($hits){ "Vulnerable" }
Else { "Compliant" }
Per la ricerca su Linux, si può cercare la classe cachedintrospectionresults.class in tutti i file .jar e .war su disco, e anche cercare spring-beans*.jar nei file *.war:
find / -name '*.jar' -exec grep -Fi 'cachedintrospectionresults.class' {} \;
find / -name '*.war' -exec grep -Ei 'cachedintrospectionresults\.class|spring-beans.*\.jar' {} \;
e anche cercare lo stesso nome di classe nei file .jar all'interno dei file .war:
#!/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