
مشروع يوضح تطبيقًا معرضًا لثغرة تجاوز صلاحيات أمان Spring Security CVE-2022-31692
تطبيق Spring Boot بسيط يوضح تهيئة معرضة لـ CVE-2022-31692.
قد تجذب هذه الثغرة الانتباه بسبب شدتها - حيث حصلت على درجة أساسية 9.8 من CVSS 3.x لأنها تسمح بتجاوز المصادقة. الغرض من هذا المشروع هو توضيح الشروط الموصوفة في الإشعار، والتي تؤدي إلى قابلية تطبيق الثغرة.
AuthorizationFilter إما يدويًا أو عبر طريقة authorizeHttpRequests().FilterChainProxy ليطبق على طلبات forward و/أو include (مثل spring.security.filter.dispatcher-types = request, error, async, forward, include).authorizeHttpRequests().shouldFilterAllDispatcherTypes(true).كمرجع، أنا متأكد إلى حد كبير أن هذا هو الالتزام (commit) الذي يعالج الثغرة.
يحتوي التطبيق على ثلاثة عناوين URL:
/ صفحة الفهرس/admin صفحة إدارية، تتطلب من المستخدم تقديم مصادقة أساسية (بيانات الدخول "user"/"pass") وأن يكون لديه دور ROLE_ADMIN/forward إعادة توجيه من جانب الخادم إلى صفحة الإدارةيتم تحديد ضوابط الوصول عبر authorizeHttpRequests() في الفئة SecurityConfig.
.authorizeHttpRequests((authz) -> authz
.antMatchers("/").permitAll()
.antMatchers("/forward").permitAll()
.antMatchers("/admin").hasAuthority("ROLE_ADMIN")
.shouldFilterAllDispatcherTypes(true)
)
يصل المستخدم إلى / ولا يتم المصادقة (بفضل permitAll()).
يصل المستخدم إلى /admin . لا يقدم مصادقة، ويتم رفض الطلب (401 غير مصرح).
يصل المستخدم إلى /admin . يقدم مصادقة صالحة، ولكن الطلب لا يزال مرفوضًا (403 غير مرخص) لأنه لا يملك الدور المطلوب .hasAuthority("ROLE_ADMIN").
يصل المستخدم إلى /forward. تمر طلباته عبر سلسلة مرشح الأمان لـ GET /forward، والتي تمر كصحيحة (بفضل permitAll()). يعالج المتحكم (controller) الطلب، ويعيد forward:/admin إلى المرسل (Dispatcher). ووفقًا لإعدادات spring.security.filter.dispatcher-types و .shouldFilterAllDispatcherTypes(true)، هذا هو نوع FORWARD، لذا يجب تمريره عبر سلسلة المرشح مرة أخرى. يؤدي هذا المرور الثاني عبر المرشح إلى رفض الطلب (مرة أخرى، بفضل hasAuthority("ROLE_ADMIN")).
يصل المستخدم إلى /forward، يتم تمرير الطلب عبر سلسلة المرشح مرة واحدة، ويمر كصحيح. تتم معالجة إعادة التوجيه (forward)، ولكن بدلاً من تمريره عبر السلسلة مرة أخرى، يتم تمريره فقط كصحيح، ويتم إرجاع صفحة الإدارة.