
एक प्रोजेक्ट जो उस ऐप को प्रदर्शित करता है जो Spring Security प्राधिकरण बायपास CVE-2022-31692 के लिए संवेदनशील है
एक सरल Spring Boot एप्लिकेशन जो CVE-2022-31692 के प्रति संवेदनशील कॉन्फ़िगरेशन प्रदर्शित करता है।
यह भेद्यता अपनी गंभीरता के कारण ध्यान आकर्षित कर सकती है - इसका CVSS 3.x बेस स्कोर 9.8 है क्योंकि यह प्रमाणीकरण बायपास की अनुमति देती है। इस परियोजना का उद्देश्य सलाह में वर्णित शर्तों को प्रदर्शित करना है, जो भेद्यता के लागू होने की ओर ले जाती हैं।
AuthorizationFilter का उपयोग या तो मैन्युअल रूप से या authorizeHttpRequests() विधि के माध्यम से करता है।FilterChainProxy को फॉरवर्ड और/या इनक्लूड अनुरोधों पर लागू करने के लिए कॉन्फ़िगर करता है (जैसे spring.security.filter.dispatcher-types = request, error, async, forward, include)।authorizeHttpRequests().shouldFilterAllDispatcherTypes(true) के माध्यम से Spring Security को हर डिस्पैचर प्रकार पर लागू करने के लिए कॉन्फ़िगर करता है।संदर्भ के लिए, मुझे पूरा यकीन है कि यह वह कमिट है जो भेद्यता को संबोधित करता है।
एप्लिकेशन में तीन URL हैं:
/ इंडेक्स पेज/admin एक एडमिन पेज, जिसके लिए उपयोगकर्ता को बेसिक प्रमाणीकरण (क्रेडेंशियल "user"/"pass") प्रदान करना और ROLE_ADMIN भूमिका सौंपी जाना आवश्यक है/forward एडमिन पेज पर एक सर्वर-साइड फॉरवर्डएक्सेस नियंत्रण SecurityConfig वर्ग में authorizeHttpRequests() के माध्यम से निर्दिष्ट किए गए हैं।
.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() के कारण मान्य के रूप में पास होते हैं। कंट्रोलर अनुरोध को संसाधित करता है, और Dispatcher को forward:/admin लौटाता है। जैसा कि spring.security.filter.dispatcher-types और .shouldFilterAllDispatcherTypes(true) सेटिंग्स द्वारा निर्देशित है, यह एक FORWARD प्रकार है, इसलिए इसे फ़िल्टर श्रृंखला के माध्यम से फिर से पास किया जाना चाहिए। फ़िल्टर के माध्यम से यह दूसरा पास अनुरोध को अस्वीकार करने का परिणाम देता है (फिर से, hasAuthority("ROLE_ADMIN") के कारण)।
उपयोगकर्ता /forward तक पहुँचता है, अनुरोध फ़िल्टर श्रृंखला के माध्यम से एक बार पास किया जाता है, और मान्य के रूप में पास होता है। फॉरवर्ड को संसाधित किया जाता है, लेकिन इसे फिर से श्रृंखला के माध्यम से पास करने के बजाय, इसे केवल मान्य के रूप में पास किया जाता है, और एडमिन पेज वापस कर दिया जाता है।