
تحليل متعمق لـ CVE-2024-38819، وهي ثغرة اجتياز ملفات في Spring WebFlux، مع تحليل على مستوى الكود وPoC واستراتيجيات التخفيف بما في ذلك عوامل التصفية وقواعد IPS.
تُعد ثغرة File-Traversal (استكشاف المسار، Path Traversal) نوعًا من الهجمات المصنفة بـ CWE-22، والتي تتيح للمهاجم تجاوز صلاحيات نظام الملفات في تطبيق الويب والوصول إلى ملفات عشوائية.
Spring WebFlux هو وحدة تدعم البرمجة التفاعلية (Reactive Programming) تم تقديمها في Spring 5، وتدعم تطوير التطبيقات غير المتزامنة غير الحاجبة (Non-blocking). كما يوفر WebFlux.fn توجيهًا وظيفيًا لنقاط النهاية (Functional Endpoint Routing) مما يتيح تكوين مسارات موجزة ومرنة باستخدام تعبيرات اللامدا (Lambda).
تحدث الثغرة CVE-2024-38819 في التطبيقات التي تستخدم WebFlux.fn وWebMVC.fn، ويهدف هذا المستند إلى دراسة تدفق الكود لكيفية حدوث هذه الثغرة في بيئة WebFlux والبحث عن إجراءات التخفيف المناسبة.
[الشكل 1] FileApplication.java
[الشكل 2] PathResourceLookupFunction.class - apply
[الشكل 3] PathResourceLookupFunction.class - isInvalidPath
[الشكل 4] StringUtils.class - cleanPath
[الشكل 5] PathResourceLookupFunction.class - apply - 2
[الشكل 6] PathResourceLookupFunction.class - isResourceUnderLocation
[الشكل 7] StringUtils.class - cleanPath -2
حاليًا، تم إجراء الاختبار على نظام Windows باستخدام C:/file، لكن هذه الحالة تصبح خطيرة جدًا عند عملها مع الروابط الرمزية (Symbolic Links) على Linux.
(عند تعيين ../../ مرتين يعمل المنطق الطبيعي، لكن الثغرة تحدث فقط عند استخدام ../ مرة واحدة.)

هجوم على خادم Linux باستخدام رابط رمزي
public RouterFunction<ServerResponse> staticResourceRouter() {
return RouterFunctions.resources("/static/**", new FileSystemResource("/app/static/"));
}
بعد إضافة الرابط الرمزي ln -s /static /app/static/link، يتم تنفيذ الهجوم

لقد استعرضنا حتى الآن تدفق تنفيذ File Traversal (CVE-2024-38819) في بيئة Spring WebFlux. ونظرًا لأن هذا الهجوم يؤدي إلى سرقة معلومات الخادم، فإن إجراءات التخفيف مهمة. لذلك، سنقترح تحديث الإصدارات الأحدث، وإنشاء منطق فحص إضافي، وطرق الحظر عبر IPS.
@Bean
public RouterFunction<ServerResponse> staticResourceRouter() {
return RouterFunctions.resources("/static/**", new FileSystemResource("C:/file"))
.filter((request, next) -> {
String path = request.path();
if (path.contains("..")) {
if(!StringUtils.cleanPath(path).contains("../")) {
return ServerResponse.status(HttpStatus.FORBIDDEN).bodyValue("Vuln path access.");
}
}
return next.handle(request);
});
}
حظر جميع طلبات URL التي تسبب الانتقال إلى مسار أعلى باستخدام ../
لقد تعرفنا حتى الآن على File Traversal عبر WebFlux. هذه الثغرة ناتجة عن استخدام StringUtils.cleanPath() دون إدراك المشكلة النابعة من منطقها.
(POC)
https://github.com/masa42/CVE-2024-38819-POC
(الموقع الرسمي لـ Spring)
https://spring.io/security/cve-2024-38819
(CVE-DETAIL)
https://www.cvedetails.com/cve/CVE-2024-38819/
(NIST)
https://nvd.nist.gov/vuln/detail/cve-2024-38819