
أمثلة على سيناريوهات قابلة للاستغلال لـ CVE-2024-22243 التي تؤثر على Spring Framework (إعادة توجيه مفتوحة و SSRF).
المؤلف: Sean Pesce
يحتوي هذا المشروع على تطبيق ويب نموذجي يوضح السيناريوهات القابلة للاستغلال لـ CVE-2024-22243، وهي ثغرة أمنية في تحليل عناوين URL في إطار عمل Spring Framework الخاص بلغة Java (الإفصاح الرسمي هنا).
تقوم الإصدارات المتأثرة من Spring بتحليل المقطع "userinfo" لعناوين URL بطريقة فريدة، مما قد يؤدي إلى استخلاص مقطع اسم مضيف يختلف عن العديد من المكتبات الشائعة الأخرى.
يحدث السلوك غير الطبيعي بسبب التعبير النمطي ("regex") التالي في
الفئة UriComponentsBuilder
(التي تم تقديمها بواسطة
هذا الالتزام
في عام 2014):
private static final String USERINFO_PATTERN = "([^@\\[/?#]*)";
لا يسمح هذا التعبير النمطي بحرف "القوس الأيسر" ([) في مقطع معلومات المستخدم. ومع ذلك،
يبدو أن Spring متفرّد بهذا السلوك، لذا فإن استدعاء على كائن
الذي تم إنشاؤه باستخدام
أو
يمكن أن يؤدي إلى سلوك غير متوقع. كما تتأثر
الفئات
و
و
أيضًا بسبب استخدامها الداخلي لـ ؛ لذلك،
يمكن أن تصبح التطبيقات عرضة للخطر حتى بدون الاستخدام المباشر لـ .
getHost()UriComponentsBuilderUriComponentsBuilderبالنسبة للمدخلات المصممة خصيصًا، سيعيد Spring قيمة اسم مضيف تختلف عن جميع ما يلي:
java.net.URI (يُذكر فقط لإصدارات Java محددة؛ الإصدارات الأخرى تطرح URISyntaxException)java.net.URLcurlandroid.net.Uriokhttp3.HttpUrlurllib.parse.urlparse(لاحظ أن هذه القائمة غير شاملة.)
قد يؤدي هذا السلوك إلى جعل تطبيقات الويب المبنية على Spring عرضة لـ إعادة التوجيه المفتوحة و تزوير الطلب من جانب الخادم (SSRF) إذا كان التنفيذ المعتمد يستخدم أسماء المضيفين الموثوقة للترخيص أو آليات أخرى متعلقة بالأمان.
يحتوي تطبيق الويب النموذجي على نقطتي نهاية عرضة للخطر.
نقطة النهاية الأولى، /redirect، توضح كيف يمكن أن يؤدي تحليل Spring غير الطبيعي لعناوين URL إلى إعادة توجيه
مفتوحة. يمكن استغلالها باستخدام عنوان URL مثل التالي:
https://127.0.0.1[@evil.com
نقطة النهاية الثانية، /health-check، توضح كيف يمكن أن يؤدي عدم التطابق في تحليل عنوان URL بين Spring و
فئة مكتبة Java القياسية URL إلى تزوير الطلب من جانب الخادم (SSRF). يمكن استغلالها باستخدام
عنوان URL مثل التالي:
https://evil.com[@127.0.0.1
لبناء هذا المشروع باستخدام Maven، ما عليك سوى تشغيل الأمر التالي (تم اختباره مع OpenJDK 17):
mvn clean package
ثم ابدأ تشغيل تطبيق الويب بأمر مثل التالي:
java -jar seanpesce-cve-2024-22243.jar 9999
سيكون تطبيق الويب متاحًا على http://127.0.0.1:9999/.
لبناء صورة Docker، قم بتشغيل الأمر التالي:
docker build -t seanpesce-cve-2024-22243:latest .
ثم ابدأ تشغيل تطبيق الويب بأمر مثل التالي:
docker run -i -e PORT=9999 -p 9999:9999 seanpesce-cve-2024-22243:latest
سيكون تطبيق الويب متاحًا على http://127.0.0.1:9999/ على مضيف Docker.
يحتوي هذا المستودع أيضًا على قواعد semgrep للمساعدة في فحص
مسارات الكود التي قد تكون عرضة للخطر. spring-cve-2024-22243_loose.yaml
يقوم بعمليات فحص بسيطة لأي استخدام لواجهات برمجة التطبيقات (APIs) المعرضة للخطر؛ وبالتالي، سيعيد غالبًا عددًا كبيرًا
من النتائج الإيجابية الخاطئة. spring-cve-2024-22243_strict.yaml
يحاول استخدام منطق أكثر صرامة وتحليل التلوث؛ ومع ذلك، لم يتم
اختباره بدقة ولديه احتمالية كبيرة لتفويت بعض التطبيقات المعرضة للخطر (خاصة عند عدم استخدام
Semgrep Pro، وهو مطلوب للتحليل عبر الملفات).