
जावा अनुप्रयोगों में डिसीरियलाइज़ेशन गैजेट चेन खोजने के लिए एक बाइट कोड विश्लेषक
यह प्रोजेक्ट जावा लाइब्रेरीज़ और क्लासपाथ में गैजेट चेन की जांच करता है। गैजेट चेन का उपयोग डिसीरियलाइज़ेशन कमजोरियों के लिए एक्सप्लॉइट बनाने में किया जाता है। किसी एप्लिकेशन के क्लासपाथ में संभावित गैजेट चेन को स्वचालित रूप से खोजकर, पेनिट्रेशन टेस्टर जल्दी से एक्सप्लॉइट बना सकते हैं और एप्लिकेशन सुरक्षा इंजीनियर किसी डिसीरियलाइज़ेशन कमजोरी के प्रभाव का आकलन कर सकते हैं और उसके सुधार को प्राथमिकता दे सकते हैं।
यह प्रोजेक्ट ब्लैक हैट यूएसए 2018 में प्रस्तुत किया गया था। वहां इसके बारे में और जानें! (लिंक बाकी हैं)
अस्वीकरण: यह प्रोजेक्ट अल्फा अवस्था में है, बहुत बढ़िया नहीं है। इसमें परीक्षण और दस्तावेज़ीकरण जोड़े जाने की आवश्यकता है। इनमें से कोई भी जोड़कर मदद करने में संकोच न करें!
मान लें कि आपके सिस्टम पर JDK स्थापित है, तो आपको बस ./gradlew shadowJar चलाने में सक्षम होना चाहिए। उसके बाद आप java -jar build/libs/gadget-inspector-all.jar <args> के साथ एप्लिकेशन चला सकते हैं।
यह एप्लिकेशन तर्क के रूप में या तो एक war फ़ाइल का पथ (उस स्थिति में war को विस्तारित किया जाएगा और उसकी सभी कक्षाएं और लाइब्रेरीज़ को क्लासपाथ के रूप में उपयोग किया जाएगा) या फिर किसी भी संख्या में jar फ़ाइलों की अपेक्षा करता है।
ध्यान दें कि विश्लेषण मेमोरी गहन हो सकता है (और अब तक गैजेट इंस्पेक्टर को मेमोरी लालची होने से रोकने के लिए बिल्कुल भी अनुकूलित नहीं किया गया है)। छोटी लाइब्रेरीज़ के लिए आप शायद कम से कम 2GB हीप आकार आवंटित करना चाहेंगे (यानी -Xmx2G फ्लैग के साथ)। बड़े एप्लिकेशन के लिए आप जितनी मेमोरी दे सकते हैं, उतनी उपयोग करें।
टूलकिट बाद के चरणों में उपयोग के लिए डेटासेट बनाने के लिए क्लासपाथ निरीक्षण के कई चरणों से गुज़रेगा। ये डेटासेट .dat एक्सटेंशन वाली फ़ाइलों में लिखे जाते हैं और आपके रन के बाद त्यागे जा सकते हैं (ये ज्यादातर इसलिए लिखे जाते हैं ताकि विकास के दौरान पिछले चरणों को छोड़ा जा सके)।
विश्लेषण चलने के बाद फ़ाइल gadget-chains.txt लिखी जाएगी।
निम्नलिखित commons-collections-3.2.1.jar के विरुद्ध चलाने का एक उदाहरण है, जैसे कि
wget http://central.maven.org/maven2/commons-collections/commons-collections/3.2.1/commons-collections-3.2.1.jar
java -Xmx2G -jar build/libs/gadget-inspector-all.jar commons-collections-3.2.1.jar
gadget-chains.txt में निम्नलिखित चेन है:
com/sun/corba/se/spi/orbutil/proxy/CompositeInvocationHandlerImpl.invoke(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object; (-1)
com/sun/corba/se/spi/orbutil/proxy/CompositeInvocationHandlerImpl.invoke(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object; (0)
org/apache/commons/collections/map/DefaultedMap.get(Ljava/lang/Object;)Ljava/lang/Object; (0)
org/apache/commons/collections/functors/InvokerTransformer.transform(Ljava/lang/Object;)Ljava/lang/Object; (0)
java/lang/reflect/Method.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (0)
इस चेन का एंट्री पॉइंट JDK InvocationHandler वर्ग का एक कार्यान्वयन है। मूल commons-collections गैजेट चेन की तरह ही चाल का उपयोग करते हुए, इस वर्ग का कोई भी क्रमबद्ध करने योग्य कार्यान्वयन गैजेट चेन में पहुंच योग्य है, इसलिए खोजी गई चेन यहां से शुरू होती है। यह विधि classToInvocationHandler.get() को आमंत्रित करती है। खोजी गई गैजेट चेन इंगित करती है कि classToInvocationHandler को एक DefaultedMap के रूप में क्रमबद्ध किया जा सकता है ताकि यह आमंत्रण DefaultedMap.get() पर कूद जाए। चेन में अगला कदम इस विधि से value.transform() को आमंत्रित करता है। इस वर्ग में पैरामीटर value को एक InvokerTransformer के रूप में क्रमबद्ध किया जा सकता है। इस वर्ग के transform विधि के अंदर हम देखते हैं कि हम cls.getMethodName(iMethodName, ...).invoke(...) को कॉल करते हैं। गैजेट इंस्पेक्टर ने निर्धारित किया कि iMethodName हमलावर द्वारा नियंत्रणीय एक क्रमबद्ध सदस्य है, और इस प्रकार हमलावर कक्षा पर कोई भी मनमाना विधि निष्पादित कर सकता है।
यह गैजेट चेन Frohoff द्वारा खोजी गई पूर्ण commons-collections गैजेट चेन का निर्माण खंड है। उपरोक्त मामले में, गैजेट इंस्पेक्टर ने AnnotationInvocationHandler और LazyMap के बजाय CompositeInvocationHandlerImpl और DefaultedMap के माध्यम से प्रवेश पाया, लेकिन यह काफी हद तक समान है।
यदि आप इस उपकरण द्वारा खोजी जा सकने वाली चेन के और उदाहरण खोज रहे हैं, तो निम्नलिखित लाइब्रेरीज़ के भी कुछ दिलचस्प परिणाम हैं:
यह न भूलें कि आप गैजेट इंस्पेक्टर को पूर्ण एप्लिकेशन (JAR या WAR के रूप में पैकेज्ड) पर भी इंगित कर सकते हैं। उदाहरण के लिए, Zksample2 एप्लिकेशन की war का विश्लेषण करने पर हमें निम्नलिखित गैजेट चेन मिलती है:
net/sf/jasperreports/charts/design/JRDesignPieDataset.readObject(Ljava/io/ObjectInputStream;)V (1)
org/apache/commons/collections/FastArrayList.add(Ljava/lang/Object;)Z (0)
java/util/ArrayList.clone()Ljava/lang/Object; (0)
org/jfree/data/KeyToGroupMap.clone()Ljava/lang/Object; (0)
org/jfree/data/KeyToGroupMap.clone(Ljava/lang/Object;)Ljava/lang/Object; (0)
java/lang/reflect/Method.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (0)
जैसा कि आप देख सकते हैं, यह चेन बनाने के लिए एप्लिकेशन में निहित कई अलग-अलग लाइब्रेरीज़ का उपयोग करता है।
प्रश्न: यदि गैजेट इंस्पेक्टर को कोई गैजेट चेन मिलती है, तो क्या उससे एक्सप्लॉइट बनाया जा सकता है?
उत्तर: हमेशा नहीं। विश्लेषण कुछ सरलीकृत मान्यताओं का उपयोग करता है और झूठी सकारात्मक रिपोर्ट कर सकता है (गैजेट चेन जो वास्तव में मौजूद नहीं होती हैं)। एक सरल उदाहरण के रूप में, यह शाखा शर्तों की संतुष्टि के लिए हल करने का प्रयास नहीं करता है। इस प्रकार यह निम्नलिखित को गैजेट चेन के रूप में रिपोर्ट करेगा:
public class MySerializableClass implements Serializable {
public void readObject(ObjectInputStream ois) {
if (false) System.exit(0);
ois.defaultReadObject();
}
}
इसके अलावा, गैजेट इंस्पेक्टर की उन फंक्शनों पर काफी व्यापक शर्तें हैं जिन्हें वह दिलचस्प मानता है। उदाहरण के लिए, यह रिफ्लेक्शन को दिलचस्प मानता है (यानी Method.invoke() के कॉल जहां हमलावर विधि को नियंत्रित कर सकता है), लेकिन अक्सर अनदेखी धारणाओं का मतलब है कि हमलावर आमंत्रित विधि को प्रभावित कर सकता है लेकिन पूर्ण नियंत्रण नहीं रखता। उदाहरण के लिए, हमलावर किसी भी वर्ग में "getError()" विधि को आमंत्रित करने में सक्षम हो सकता है, लेकिन कोई अन्य विधि नाम नहीं।
प्रश्न: यदि कोई गैजेट चेन नहीं मिली, तो क्या इसका मतलब है कि मेरा एप्लिकेशन शोषण से सुरक्षित है?
उत्तर: नहीं! एक तो, गैजेट इंस्पेक्टर के पास "सिंक" फंक्शन्स का एक बहुत ही संकीर्ण सेट है जिसे वह "दिलचस्प" दुष्प्रभाव मानता है। इसका निश्चित रूप से यह मतलब नहीं है कि सूची में अन्य दिलचस्प या खतरनाक व्यवहार नहीं हैं।
इसके अलावा, स्टैटिक विश्लेषण की कई सीमाएँ हैं जिसका अर्थ है कि गैजेट इंस्पेक्टर में हमेशा अंधे धब्बे होंगे। उदाहरण के रूप में, गैजेट इंस्पेक्टर वर्तमान में इसे नहीं पकड़ पाएगा क्योंकि यह रिफ्लेक्शन कॉल का अनुसरण नहीं करता है।
public class MySerializableClass implements Serializable {
public void readObject(ObjectInputStream ois) {
System.class.getMethod("exit", int.class).invoke(null, 0);
}
}