
Scripts de detecção e orientação para a vulnerabilidade CVE-2022-22965 (Spring4Shell) no Spring Framework, incluindo scanners em PowerShell e Bash para arquivos JAR/WAR vulneráveis e verificações de versão do JDK.
https://github.com/NCSC-NL/spring4shell/blob/main/software/README.md
Pré-requisitos para ser vulnerável ao CVE-2022-22965:
Veja os scripts PowerShell e bash mais abaixo.
Hilko Bengen publicou um scanner que procura por versões vulneráveis do CachedIntrospectionResults.class com base nas versões aqui: https://github.com/hillu/local-spring-vuln-scanner
Isso pode ser descoberto executando:
java -version
nos sistemas relevantes.
Note que aplicações Java podem ser executadas de várias maneiras diferentes, e podem ter várias versões diferentes instaladas simultaneamente. Para ter certeza de qual versão do Java está em execução, pode-se primeiro identificar de onde o binário Java está sendo executado e depois verificar qual versão o referido binário Java possui.
No Linux, isso pode ser feito executando:
ps aux | grep java
onde se encontra, por exemplo, /usr/lib/jvm/java-11-openjdk-amd64/bin/java, e pode-se então executar o seguinte comando usando o caminho absoluto:
$ /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)
Da mesma forma no Windows, pode-se encontrar o caminho absoluto para processos Java em execução usando WMI ou PowerShell:
WMI: C:\> wmic process where "name='java.exe'" get ExecutablePath
PowerShell: PS C:\> Get-Process java | Select-Object Path
A JFrog publicou código Python que identifica o uso disso, e isso pode ser usado diretamente em programas Java compilados sem necessidade de extrair arquivos .jar/.war: https://github.com/jfrog/jfrog-spring-tools
Quanto à identificação do Spring Framework no sistema, isso depende de qual sistema operacional está em execução:
Os seguintes scripts PowerShell para encontrar aplicações potencialmente vulneráveis, ou seja, aplicações que utilizam ou são baseadas no Spring Framework. Note que estes scripts não distinguirão versões atualizadas ou não, mas identificarão sistemas que provavelmente podem ter a vulnerabilidade atualmente, conforme ponto 1 acima.
Pesquise por spring-beans*.jar e cachedintrospectionresults.class em arquivos *.war no 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/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" }
Além disso, pesquisar por cachedintrospectionresults.class em todos os arquivos .jar é útil, e sabemos que nem sempre é o spring-beans*.jar que contém esta 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/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" }
Para pesquisa no Linux, pode-se procurar pela classe cachedintrospectionresults.class em todos os arquivos .jar e .war no disco, bem como procurar por spring-beans*.jar em arquivos *.war:
find / -name '*.jar' -exec grep -Fi 'cachedintrospectionresults.class' {} \;
find / -name '*.war' -exec grep -Ei 'cachedintrospectionresults\.class|spring-beans.*\.jar' {} \;
bem como procurar pelo mesmo nome de classe em arquivos .jar que estão dentro de arquivos .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/