
CVE-2022-22965 (Spring4Shell) 취약점 탐지 스크립트 및 가이드 - Spring Framework 관련, 취약한 JAR/WAR 파일 및 JDK 버전 확인을 위한 PowerShell 및 Bash 스캐너 포함.
https://github.com/NCSC-NL/spring4shell/blob/main/software/README.md
CVE-2022-22965에 취약하기 위한 전제 조건:
아래의 PowerShell 및 bash 스크립트를 참조하세요.
Hilko Bengen이 CachedIntrospectionResults.class의 취약한 버전을 검색하는 스캐너를 게시했습니다. 버전 기준은 다음에서 확인할 수 있습니다: https://github.com/hillu/local-spring-vuln-scanner
다음을 실행하여 확인할 수 있습니다:
java -version
해당 시스템에서.
참고: Java 애플리케이션은 다양한 방식으로 실행될 수 있으며, 여러 버전이 동시에 설치되어 있을 수 있습니다. 실행 중인 Java 버전을 확실히 확인하려면 먼저 Java 바이너리가 실행되는 위치를 식별한 다음 해당 Java 바이너리의 버전을 확인하세요.
Linux에서는 다음을 실행하여 수행할 수 있습니다:
ps aux | grep java
예를 들어 /usr/lib/jvm/java-11-openjdk-amd64/bin/java를 찾았다면, 절대 경로를 사용하여 다음 명령을 실행할 수 있습니다:
$ /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)
Windows에서도 WMI 또는 PowerShell을 사용하여 실행 중인 Java 프로세스의 절대 경로를 찾을 수 있습니다:
WMI: C:\> wmic process where "name='java.exe'" get ExecutablePath
PowerShell: PS C:\> Get-Process java | Select-Object Path
JFrog는 이를 식별하는 Python 코드를 게시했으며, 컴파일된 Java 프로그램에 직접 사용할 수 있어 .jar/.war 파일을 추출할 필요가 없습니다: https://github.com/jfrog/jfrog-spring-tools
시스템에서 Spring Framework를 식별하는 것은 실행 중인 운영 체제에 따라 다릅니다:
다음 PowerShell 스크립트는 잠재적으로 취약한 애플리케이션, 즉 Spring Framework를 사용하거나 기반으로 하는 애플리케이션을 찾습니다. 이 스크립트는 업데이트된 버전과 그렇지 않은 버전을 구분하지 않지만, 위의 1번 항목을 기준으로 현재 취약점이 있을 가능성이 있는 시스템을 식별합니다.
시스템의 *.war 파일에서 spring-beans*.jar 및 cachedintrospectionresults.class 검색:
$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" }
또한, 모든 .jar 파일에서 cachedintrospectionresults.class를 검색하는 것이 유용합니다. 이 클래스가 항상 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" }
Linux 검색의 경우, 디스크의 모든 .jar 및 .war 파일에서 cachedintrospectionresults.class 클래스를 찾고, *.war 파일에서 spring-beans*.jar를 찾습니다:
find / -name '*.jar' -exec grep -Fi 'cachedintrospectionresults.class' {} \;
find / -name '*.war' -exec grep -Ei 'cachedintrospectionresults\.class|spring-beans.*\.jar' {} \;
또한 .war 파일 내부에 있는 .jar 파일에서 동일한 클래스 이름을 찾습니다:
#!/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/