
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، يمكنك العثور على المسار المطلق لعمليات java قيد التشغيل إما باستخدام WMI أو PowerShell:
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 أعلاه.
ابحث عن spring-beans*.jar و cachedintrospectionresults.class داخل ملفات *.war-ملفات` على النظام:
$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" }
علاوة على ذلك، من المفيد البحث عن cachedintrospectionresults.class في جميع ملفات .jar، ونحن نعلم أن 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، يمكنك البحث عن الفئة cachedintrospectionresults.class في جميع ملفات .jar و .war على القرص، وكذلك البحث عن spring-beans*.jar في ملفات *.war:
find / -name '*.jar' -exec grep -Fi 'cachedintrospectionresults.class' {} \;
find / -name '*.war' -exec grep -Ei 'cachedintrospectionresults\.class|spring-beans.*\.jar' {} \;
وكذلك البحث عن اسم الفئة نفسه في ملفات .jar الموجودة داخل ملفات .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/