flawopen.com/Java डीसिरियलाइज़ेशन/ObjectInputStream सुरक्षा
क्या ObjectInputStream अविश्वसनीय डेटा के लिए सुरक्षित है?
आमतौर पर नहीं: readObject() Java ऑब्जेक्ट फिर बनाता है और क्लास के डीसिरियलाइज़ेशन तरीके चला सकता है। यह ऐसा फ़ॉर्म है जिसके संलग्न हिस्सों को अपने निर्देश चलाने दिए जाते हैं। दुर्भावनापूर्ण stream ऐप में मौजूद क्लास व्यवहार तक पहुँच सकती है। निष्पादन क्लास, लाइब्रेरी, रास्ते और इनपुट सीमा पर निर्भर है; हर कॉल ऐसा नहीं करती।
// हमलावर-नियंत्रित bytes यहाँ न दें।
try (var in = new ObjectInputStream(untrustedStream)) {
Object value = in.readObject();
handle(value);
}
// अविश्वसनीय इनपुट के लिए व्यापक polymorphic typing बंद रखें।
ObjectMapper mapper = new ObjectMapper();
OrderRequest value = mapper.readValue(
untrustedBytes, OrderRequest.class
);
validate(value);
दोष तक पहुँचने का रास्ता
API, queue, cache या file import उपयोगकर्ता-नियंत्रित bytes लेता है। ObjectInputStream.readObject() तक पहुँचने पर JVM प्रक्रिया की serializable क्लास से ऑब्जेक्ट बनाती है। Gadget chain मौजूदा व्यवहार का संभावित रास्ता है, हर stream का payload नहीं। Oracle ने CVE-2015-4852 में सूचीबद्ध WebLogic संस्करणों पर T3 के ज़रिए बिना प्रमाणीकरण नेटवर्क हमले दर्ज किए। इसका अर्थ यह नहीं कि हर उपयोग दूर से पहुँच योग्य है।
native serialization हटाना संभव न हो तो
- ✓स्पष्ट schema वाला JSON या Protocol Buffers लें; तय DTO में बदलकर fields और authorization जाँचें।
- ✓अपरिहार्य हो तो
readObject()से पहले संदर्भ-विशिष्टObjectInputFilterलगाएँ और केवल आवश्यक सटीक क्लासें अनुमति दें। - ✓वैध इनपुट मापकर depth, references, arrays और stream bytes सीमित करें। allowlist अकेले संसाधन समाप्ति नहीं रोकती।
- ✓अविश्वसनीय JSON के लिए व्यापक polymorphic typing न खोलें; मनमाना subtype metadata फिर ऑब्जेक्ट बना सकता है।
- ✓Java व dependencies अपडेट करें, अनुपयोगी libraries हटाएँ और पुराने streams को न्यूनतम अधिकार व सीमित संसाधनों में चलाएँ।
आम सवाल
संकीर्ण allowlist और सीमाएँ जोखिम घटाते हैं, पर यह सार्वभौमिक sanitizer नहीं है। अनुमत क्लास, उनका व्यवहार, filter का सक्रिय होना, ऐप सत्यापन और authorization सभी महत्वपूर्ण हैं। जहाँ संभव हो उपयोगकर्ता-नियंत्रित डेटा के लिए native serialization से बचें।
प्राथमिक स्रोत
- Oracle Java SE सुरक्षित कोडिंग दिशानिर्देश — Serialization
- Oracle Java Serialization Filters (JDK 25)
- Oracle सुरक्षा चेतावनी — CVE-2015-4852
- OWASP Deserialization Cheat Sheet
- Jackson Databind — Polymorphic Deserialization