
https://github.com/NCSC-NL/spring4shell/blob/main/software/README.md
Voraussetzungen, um für CVE-2022-22965 anfällig zu sein:
Siehe weiter unten die PowerShell- und Bash-Skripte.
Hilko Bengen hat einen Scanner veröffentlicht, der nach anfälligen Versionen von CachedIntrospectionResults.class sucht, ausgehend von Versionen hier: https://github.com/hillu/local-spring-vuln-scanner
Dies kann man herausfinden, indem man ausführt:
java -version
auf den betreffenden Systemen.
Beachten Sie, dass Java-Anwendungen auf verschiedene Weise ausgeführt werden können und dass mehrere verschiedene Versionen gleichzeitig installiert sein können. Um sicherzugehen, welche Java-Version ausgeführt wird, kann man zuerst identifizieren, von wo die Java-Binärdatei ausgeführt wird, und dann prüfen, welche Version die betreffende Java-Binärdatei hat.
Unter Linux kann dies durch Ausführen von:
ps aux | grep java
wobei man z. B. /usr/lib/jvm/java-11-openjdk-amd64/bin/java findet, und man kann dann den folgenden Befehl unter Verwendung des absoluten Dateipfads ausführen:
$ /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)
Entsprechend kann man unter Windows den absoluten Dateipfad für laufende Java-Prozesse entweder mithilfe von WMI oder PowerShell ermitteln:
WMI: C:\> wmic process where "name='java.exe'" get ExecutablePath
PowerShell: PS C:\> Get-Process java | Select-Object Path
JFrog hat Python-Code veröffentlicht, der die Verwendung davon identifiziert, und dieser kann direkt auf kompilierte Java-Programme angewendet werden, sodass man .jar/.war-Dateien nicht entpacken muss: https://github.com/jfrog/jfrog-spring-tools
Was die Identifizierung des Spring Framework auf dem System betrifft, hängt dies davon ab, welches Betriebssystem ausgeführt wird:
Die folgenden PowerShell-Skripte dienen zum Auffinden potenziell anfälliger Anwendungen, d. h. Anwendungen, die das Spring Framework verwenden oder darauf basieren. Beachten Sie, dass diese Skripte nicht zwischen aktualisierten Versionen und anderen unterscheiden, aber sie identifizieren Systeme, bei denen die Schwachstelle derzeit wahrscheinlich vorhanden ist – siehe Punkt 1 oben.
Suche nach spring-beans*.jar und cachedintrospectionresults.class in *.war-Dateien`auf dem System:
$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/HEAD/%5BSystem.IO.Compression.ZipFile%5D::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" }
Darüber hinaus ist die Suche nach cachedintrospectionresults.class in allen .jar-Dateien nützlich, und uns ist bekannt, dass es nicht immer spring-beans*.jar ist, das diese Klasse enthält.
$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/HEAD/%5BSystem.IO.Compression.ZipFile%5D::OpenRead($war))).Entries
foreach ($entry in $entries){
if ($entry.Name -like $search1) {
"$($war)\$($entry.FullName)"
$hits = $hits +1
}
}
}
}
}
If ($hits){ "Vulnerable" }
Else { "Compliant" }
Für die Suche unter Linux kann man nach der Klasse cachedintrospectionresults.class in allen .jar- und .war-Dateien auf der Festplatte suchen und außerdem nach spring-beans*.jar in *.war-Dateien:
find / -name '*.jar' -exec grep -Fi 'cachedintrospectionresults.class' {} \;
find / -name '*.war' -exec grep -Ei 'cachedintrospectionresults\.class|spring-beans.*\.jar' {} \;
sowie nach demselben Klassennamen in .jar-Dateien suchen, die sich in .war-Dateien befinden:
#!/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
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/