
https://github.com/NCSC-NL/spring4shell/blob/main/software/README.md
Conditions préalables pour être vulnérable à CVE-2022-22965 :
Voir les scripts PowerShell et bash plus bas.
Hilko Bengen a publié un scanner qui recherche les versions vulnérables de CachedIntrospectionResults.class à partir des versions ici : https://github.com/hillu/local-spring-vuln-scanner
On peut le déterminer en exécutant :
java -version
sur les systèmes concernés.
Notez que les applications Java peuvent être exécutées de différentes manières, et différentes versions peuvent être installées simultanément. Pour être sûr de la version Java utilisée, on peut d'abord identifier l'emplacement du binaire Java, puis vérifier la version de ce binaire.
Sous Linux, cela peut être fait en exécutant :
ps aux | grep java
où l'on trouve par exemple /usr/lib/jvm/java-11-openjdk-amd64/bin/java, et on peut alors exécuter la commande suivante en utilisant le chemin absolu :
$ /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)
Sous Windows, on peut trouver le chemin absolu des processus Java en cours d'exécution soit avec WMI, soit avec PowerShell :
WMI : C:\> wmic process where "name='java.exe'" get ExecutablePath
PowerShell : PS C:\> Get-Process java | Select-Object Path
JFrog a publié du code Python qui identifie l'utilisation de ces méthodes, et il peut être utilisé directement sur des programmes Java compilés sans avoir besoin d'extraire les fichiers .jar/.war : https://github.com/jfrog/jfrog-spring-tools
En ce qui concerne l'identification de Spring Framework sur le système, cela dépend du système d'exploitation utilisé :
Scripts PowerShell suivants pour trouver les applications potentiellement vulnérables, c'est-à-dire les applications qui utilisent ou sont basées sur Spring Framework. Notez que ces scripts ne feront pas la distinction entre les versions mises à jour ou non, mais ils identifieront les systèmes susceptibles d'être vulnérables actuellement, cf. point 1 ci-dessus.
Recherche de spring-beans*.jar et cachedintrospectionresults.class dans les fichiers *.war sur le système :
$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" }
De plus, la recherche de cachedintrospectionresults.class dans tous les fichiers .jar est utile, car cette classe n'est pas toujours contenue dans spring-beans*.jar.
$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" }
Pour une recherche sous Linux, on peut chercher la classe cachedintrospectionresults.class dans tous les fichiers .jar et .war sur le disque, ainsi que spring-beans*.jar dans les fichiers .war :
find / -name '*.jar' -exec grep -Fi 'cachedintrospectionresults.class' {} \;
find / -name '*.war' -exec grep -Ei 'cachedintrospectionresults\.class|spring-beans.*\.jar' {} \;
ainsi que chercher le même nom de classe dans les fichiers .jar contenus dans les fichiers .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
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/