
تحليل متعمق لـ 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
يُظهر [الشكل 1] أن Spring WebFlux يخدم جميع الطلبات الواردة إلى /static/** من الدليل C:/file على الخادم. هنا
[الشكل 2] PathResourceLookupFunction.class - apply
يقوم [الشكل 2] PathResourceLookupFunction - apply بالتحقق مما إذا كان المسار المعطى يشير إلى مورد صالح في Spring WebFlux، وإرجاع هذا المورد
[الشكل 3] PathResourceLookupFunction.class - isInvalidPath
عند النظر إلى [الشكل 3] PathResourceLookupFunction - isInvalidPath، نجد وجود شرط StringUtils.cleanPath(path).contains("../")،
[الشكل 4] StringUtils.class - cleanPath
من [الشكل 4] StringUtils.class - cleanPath، نرى أن StringUtils.cleanPath(path) يزيل TOP_PATH("..") ويضع المسار في pathElements، ويصبح top صفرًا،
[الشكل 5] PathResourceLookupFunction.class - apply - 2
[الشكل 6] PathResourceLookupFunction.class - isResourceUnderLocation
من خلال استدعاء cleanPath في isResourceUnderLocation في [الشكل 5]، يتم إجراء تحقق آخر عبر cleanPath كما في [الشكل 6]، والمسار الذي تم تمريره في [الشكل 5] هو C:/file../Windows/System32/drivers/etc/hosts.
[الشكل 7] StringUtils.class - cleanPath -2
من خلال الكود في [الشكل 7]، يصبح prefix هو C:/، ويتغير المسار إلى /Windows/System32/drivers/etc/hosts عبر [الشكل 4]، وبالتالي تكون القيمة النهائية المُرجعةحاليًا، تم إجراء الاختبار على نظام 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