
وفقًا للمعلومات التي اطلعت عليها، هذه ثغرة تتعلق بالفئة RegexRequestMatcher في إطار عمل Spring Security. تحديدًا، التطبيقات التي تستخدم RegexRequestMatcher مع تعبير نمطي يحتوي على نقطة (.) يمكن تجاوزها باستخدام الأحرف \r(%0a) و \n(%0d)؛ وبذلك يمكن للمهاجمين الوصول إلى المسارات غير المسموح بها دون مصادقة.
الإصدارات المتأثرة بالثغرة من إطار عمل Spring Security:
5.5.x قبل 5.5.75.6.x قبل 5.6.4نحتاج إلى الوصول إلى الكود المصدري لـ Spring Security لتحليل هذه الثغرة بشكل ثابت. تحديدًا، استخدمت ميزة مقارنة الـ commits بين الإصدارين 5.6.3 (الإصدار المتأثر بالثغرة) و5.6.4 (الإصدار الذي تم إصلاحه) على Github. انظر الرابط التالي: Comparing 5.6.3...5.6.4 · spring-projects/spring-security (github.com)

قمت بفحص التغييرات في الفئة RegexRequestMatcher. يمكن ملاحظة أنه في الإصدار 5.6.4، تستخدم هذه الفئة Pattern.DOTALL بدلاً من . الافتراضي كما في الإصدار 5.6.3.
حيث:
Pattern: هي إحدى الفئات الثلاث الموجودة في الحزمة java.util.regex، وتتمثل وظيفتها في معالجة التعبيرات النمطية.Pattern.DOTALL: عند استخدام هذا العلم، فإن . في التعبير النمطي يطابق جميع الأحرف، بما في ذلك أحرف السطر الجديد مثل \n , \r.Pattern.CASE_INSENSITIVE: تجاهل حالة الأحرف (الأحرف الكبيرة أو الصغيرة).
افتراضيًا، تطابق النقطة . في التعبير النمطي جميع الأحرف باستثناء أحرف السطر الجديد مثل \n, \r. وفي هذه الحالة، إذا كانت هناك دالة regex تتحقق من نمط سلسلة معينة، فلن يطابق التعبير النمطي إذا كانت السلسلة تحتوي على أحرف سطر جديد. لتجنب ذلك، يمكن استخدام العلم Pattern.DOTALL.
ومع ذلك، إذا تعمد شخص استخدام %0d بدلاً من \n أو %0a بدلاً من \r، فإن التعبير النمطي أعلاه لن يطابق. لذلك، في الإصدار 5.6.4، أُضيف فحص لهذه الحالة في RegexRequestMatcherTests.java. تحديدًا، يقوم بتحويل %0d و%0a على التوالي إلى \n و\r ثم يفحص باستخدام التعبير النمطي.

الخطوة 1: أنشئ تطبيق ويب Spring Boot باستخدام Spring Initializr مع اعتماديتين هما Spring Security وSpring Web.

الخطوة 2: أنشئ Controller يطبع النص This is a CVE-2022-22978 demo عند وصول طلب إلى المسار /admin/*

الخطوة 3: قم بإعداد آلية مصادقة عند وصول المستخدم إلى المسار /admin/<bất kì> باستخدام regexMatchers("/admin/.*").authenticated(). هذه هي الثغرة التي يستغلها المهاجمون لعرض محتوى صفحات /admin/<bất kì> دون مصادقة.

الخطوة 4: في ملف الإعدادات، قم بتعريف إصدار Spring Security الذي يحتوي على الثغرة. هنا اخترت الإصدار 5.6.3.

الخطوة 5: شغّل التطبيق باستخدام الأمر gradlew bootRun، يستخدم البرنامج افتراضيًا Apache Tomcat للاستماع على المنفذ 8080. نصل إلى المسار /admin/xyz (أي مسار يبدأ بـ /admin/).

تُرجع النتيجة رمز 403 Forbidden، مما يعني أنه لا يمكنني الوصول بسبب عدم المصادقة.
في هذه المرحلة، نستغل ثغرة دالة regexMatchers في Sping Security (الإصدار 5.6.3) عندما لا تطابق أحرف السطر الجديد مثل \r(%0d) و\n(%0a) → يمكنني الوصول إلى المسار أعلاه دون مصادقة باستخدام الحمولة /admin/%0dxyz

وبالمثل مع الحمولة /admin/%0axyz

وهكذا نجحنا في استغلال ثغرة CVE-2022-22978 بمجرد حمولة بسيطة للغاية.
5.7.1
جرّب مهاجمة الويب بنفس الحمولة السابقة: /admin/%0dxyz

في هذه الحالة، لم يعد التطبيق يُرجع استجابة كما يتوقع المهاجم.
git clone https://github.com/ducluongtran9121/CVE-2022-22978-PoC.git
cd CVE-2022-22978-PoC
gradlew bootRun
Java 18
Gradle 7.4.1