तो कुछ घंटों के कामकाज के बाद वर्तमान में Google App Engine पर प्रतिबिंब की सीमा को अक्षम कर दिया गया है, मैं सोच रहा था कि कोई मुझे समझने में मदद कर सकता है कि ऑब्जेक्ट प्रतिबिंब खतरे क्यों हो सकता है। क्या ऐसा इसलिए है क्योंकि मैं कक्षा के निजी चर का निरीक्षण कर सकता हूं या क्या कोई और गहरा कारण है?ऑब्जेक्ट प्रतिबिंब का सुरक्षा जोखिम क्या है?
उत्तर
1 - प्रतिबिंब (एक अवधारणा के रूप में) सुरक्षा/सुरक्षा के लिए वास्तव में ऑर्थोगोनल है।
जावा के डिजाइन में एक बड़ा जोर है कि यह एक सुरक्षित मंच बनाने के लिए, स्थिर टाइपिंग साथ था, सुरक्षा प्रबंधक, वर्ग लोडर, और कोई रास्ता नहीं संकेत पेंच के लिए/स्मृति के अनुशासित उपयोग । आप Masterminds of programming में जेम्स गोस्लिंग के साक्षात्कार को पढ़ सकते हैं, जो इसके बारे में दिलचस्प है।
लेकिन प्रतिबिंबित शक्ति आपके पास कठिन है, यह सुनिश्चित करना है कि चीजें सुरक्षित हों। प्रतिबिंब विशेष रूप से स्थैतिक टाइपिंग हार जाता है और रन-टाइम त्रुटियों का कारण बन सकता है।
लेकिन अधिक सूक्ष्म चीजें भी हो सकती हैं। उदाहरण के लिए क्लास लोडर - जिसे सिस्टम में प्रतिबिंबित हुक के रूप में माना जा सकता है - जावा के शुरुआती संस्करण में उचित रूप से डिज़ाइन नहीं किया गया था जिससे संभावित प्रकार प्रतिस्थापन हो गया। गिलद ब्राचा द्वारा आलेख Dynamic class loading in the JVM,, इस तरह के मुद्दों पर अंतर्दृष्टिपूर्ण है।
प्रतिबिंब पूरी तरह से बंद नहीं किया जा सकता है; अपने सार्वजनिक क्षेत्रों/विधियों पर प्रतिबिंबित करना हमेशा संभव है। AccessibleObject.setAccessible
के साथ निजी संरचनाओं पर प्रतिबिंब हालांकि अक्षम किया जा सकता है, क्योंकि यह encapsulation तोड़ता है। निजी क्षेत्रों तक पहुंच के साथ, आदि आंतरिक डेटा का निरीक्षण और संशोधन संभव है। इससे दुर्भावनापूर्ण शोषण, उदाहरण के लिए हो सकता है
strings
अब और अपरिवर्तनीय नहीं हैं और बदला जा सकता है- आप वस्तुओं की समझदार जानकारी आप
- ... अन्य कारनामों के स्वामी नहीं हैं प्रकट कर सकते हैं ...
अंत में अन्य तंत्र हैं जो सुरक्षा को खतरे में डालते हैं, विशेष रूप से sun.misc.Unsafe
जो स्मृति-पॉइंटर्स तक सीधे पहुंच प्रदान करता है।
2 - अब सवाल यह है कि क्या प्रतिबिंब (अभ्यास में) कई जोखिमों को जन्म देता है।
मैंने @dbyrne द्वारा इंगित लिंक पढ़ा है लेकिन यह ज्यादातर .NET के बारे में है। साथ ही मुझे नहीं पता कि Google ऐप के लिए क्या अक्षम है। क्या यह केवल ReflectPermission
है, या सुरक्षा प्रबंधक की अन्य अनुमति है? फाइल सिस्टम और मैस के आसपास पहुंच पाने के लिए एक खतरे स्पष्ट रूप से है।
निजी डेटा और ब्रेकिंग इंकैप्यूलेशन तक पहुंच की समस्या अभ्यास में तर्क दिया जा सकता है। सुरक्षित कोड लिखना वास्तव में बेहद कठिन है, और यहां तक कि एक्सेस संशोधक को बदलने के बिना भी आप अनुचित तरीके से कक्षाओं को उप-वर्गीकृत कर सकते हैं - जब तक कि वे final
न हों, या इससे भी बेहतर, मुहरबंद हो जाएं - और उन्हें चारों ओर पास करें। उदाहरण के लिए यह defensive copying के खिलाफ सुरक्षा करने का प्रयास करें।
टाइप-सुरक्षा को भी डाउनकास्ट की वजह से रन-टाइम त्रुटि से खतरा है, इसलिए इस बिंदु पर भी तर्क दिया जा सकता है।
साझा/होस्ट किए गए वातावरण में, सुरक्षा संबंधित है। भाषा स्तर पर, उदाहरण के लिए आप 100% CPU का उपभोग करने वाले मॉड्यूल प्रपत्र को रोक नहीं सकते हैं या OutOfMemoryException
तक सभी मेमोरी का उपभोग नहीं कर सकते हैं। इस तरह की चिंताओं को वर्चुअलाइजेशन और कोटा के साथ आमतौर पर ओएस स्तर पर अन्य माध्यमों से संबोधित करने की आवश्यकता है।
तो मेरा निजी उत्तर होगा: प्रतिबिंब एक सुरक्षा जोखिम है, लेकिन अन्य संभावित हमले वैक्टरों की तुलना में अभ्यास में इतना बड़ा नहीं है।
+1। मैं सम्मान से आपके हमले के परिदृश्य से असहमत हूं हालांकि मैं मानता हूं कि हमारे पास अटकलें हैं। – rook
विस्तृत स्पष्टीकरण के लिए धन्यवाद। वास्तव में यह प्रश्न मेरे अन्य प्रश्न से उत्पन्न होता है: http://stackoverflow.com/questions/3002714/gson-on-google-app-engine-throws-a-security-exception। प्रदान किया गया उत्तर अन्यथा कहता है लेकिन मुझे अभी भी समझ में नहीं आता है कि जीएसओएन ऐसा क्यों करता है जिस तरह से यह कर रहा है। मैंने अपनी छोटी सी जेसन विधि लिखना समाप्त कर दिया लेकिन यह दृष्टिकोण बड़ी वस्तुओं के लिए स्वीकार्य नहीं है। यह मुझे मेरे अंतिम प्रश्न पर ले जाता है: यदि प्रतिबिंब नहीं है, तो क्या मैं ऐसा करने का कोई और तरीका कर सकता हूं जो मैं करने की कोशिश कर रहा था? कोई विचार? – Legend
@Legend स्पष्ट रूप से GSON अस्वीकृत होने पर 'AccessibleObject.setAccessible' का उपयोग करने का प्रयास करें। मैं जीएसओएन से परिचित नहीं हूं, और इसे एक्सेस संशोधक को बदलने की आवश्यकता क्यों है। मुझे लगता है कि अगर आप इसे समझना चाहते हैं तो आपको जीएसओएन कोड को देखना चाहिए। हो सकता है कि आप जीएसओएन का अपना संस्करण बना सकें जो प्रतिबिंब का उपयोग करता है लेकिन 'AccessibleObject.setAccessible' का उपयोग नहीं करता है और यह सुनिश्चित करता है कि आप धारावाहिकरण के लिए ऑब्जेक्ट पास करें जहां सभी फ़ील्ड/विधियां सार्वजनिक हों। – ewernli
एक एप्लिकेशन जावा प्रतिबिंब एपीआई का उपयोग फ़ील्ड तक पहुंचने और अपडेट करने के लिए कर सकता है, और सामान्य जावा एक्सेस/दृश्यता नियमों द्वारा प्रतिबंधित विधियों को निष्पादित कर सकता है।
- पहुँच जानकारी है कि छिपा हो माना जाता है,
- पर जावा सुरक्षा सैंडबॉक्स नष्ट ताकि आप JVM में चल रहे अन्य बातों के साथ हस्तक्षेप कर सकते, पहुँच फ़ाइलें: सरलता का एक सा के साथ, इस के लिए पर्याप्त है स्थानीय मशीन, और इतने पर।
कुछ परिस्थितियों में, यह दुर्भावनापूर्ण देशी कोड के इंजेक्शन को भी अनुमति दे सकता है।
दिलचस्प, क्या आप अधिक जानकारी प्रदान कर सकते हैं? शायद एक लिंक। एक उत्कृष्ट लिंक प्रदान करने के लिए – rook
मेरा एक सिद्धांत यह है कि Google कुछ छिपाने की कोशिश कर रहा है। Reflection अक्षम करके Google परिवर्तनीय नाम, फ़ंक्शन कॉल और यहां तक कि एक पूर्ण API को छुपा सकता है। अगर Google एपीआई की तरह कुछ छुपा रहा है, तो निश्चित रूप से वे आपको इसके बारे में बताने वाले नहीं हैं।
मुझे इस तथ्य के बारे में पता है कि प्रतिबिंब सुरक्षा परीक्षण में एक बहुत ही महत्वपूर्ण भूमिका निभाता है। उदाहरण के लिए आप प्रतिबिंब का उपयोग कर स्वचालित रूप से फ़ज़ परीक्षण उत्पन्न कर सकते हैं। AxMan सभी कक्षाओं और उनके विधि कॉल की पहचान करने के लिए टाइपलिब का उपयोग करता है जो COM ऑब्जेक्ट बनाता है। इस जानकारी का उपयोग करके एक्समैन प्रत्येक कक्षा को तुरंत चालू करेगा और लंबी विधि और बड़ी संख्या के क्रमिक क्रम के साथ प्रत्येक विधि को कॉल करेगा। इसी तरह के परीक्षण प्रतिबिंब के लिए WSDL फ़ाइल का उपयोग कर SOAP Fuzzers द्वारा आयोजित किया जाता है।
सबसे पहले, अगर आपने SecurityManager
इंस्टॉल नहीं किया है तो आप वैसे भी सुरक्षित नहीं हैं।
दूसरे, प्रतिबिंब महत्वपूर्ण छेद को खोलने नहीं है जब तक कि setAccessible()
सक्षम किया गया है, और खुद को है कि एक सुरक्षा जांच (setAccessChecks
reflection permission द्वारा नियंत्रित) के अधीन है। इसके बिना, जबकि आप यह जान सकेंगे कि निजी क्षेत्र या विधि मौजूद है (हालांकि स्वयं को accessDeclaredMembers
runtime permission की आवश्यकता है) आप उस ज्ञान के साथ कुछ भी नहीं कर सकते हैं। हमला करने के लिए आपकी सबसे अच्छी शर्त धारावाहिक वस्तुओं के साथ काम करना हो सकता है, लेकिन यह मोम की एक पूरी 'नोटर बॉल' है।
ध्यान दें कि एक सुरक्षित सुरक्षा प्रबंधक और कक्षा लोडर लिखना गैर-तुच्छ है। यदि आप मेगा-गुरु-डोम (या अधिक संभावना, असफलता के शर्मनाक स्तर) की आकांक्षा नहीं कर रहे हैं तो उन्हें दूसरों को छोड़ना सबसे अच्छा है।
जीएई एक साझा होस्टिंग वातावरण है, और कई उपयोगकर्ताओं से WAR फ़ाइलों को होस्ट करता है। यह अत्यधिक संभावना है कि एक ही JVM में एकाधिक WAR फ़ाइलें होस्ट की जाती हैं, क्योंकि प्रति WAR प्रक्रिया को हास्यास्पद करना हास्यास्पद है। इसलिए, प्रत्येक युद्ध फ़ाइल को सैंडबॉक्स करने का एकमात्र तरीका प्रत्येक WAR फ़ाइल के लिए कस्टम क्लासलोडर के माध्यम से होता है।
अब, मान लीजिए कि प्रतिबिंब की अनुमति थी। आप could then walk the classloader hierarchy और अलग-अलग उपयोगकर्ताओं से संबंधित WAR फ़ाइलों से कक्षाओं/विधियों की गणना करें। जाहिर है, यह एक बड़ी चिंता है।
- 1. ब्राउज़र सुरक्षा कितनी बड़ी सुरक्षा जोखिम है?
- 2. __func__ पहचान सुरक्षा सुरक्षा जोखिम कैसे है?
- 3. जावास्क्रिप्ट सुरक्षा जोखिम?
- 4. लिनक्स कर्नेल मॉड्यूल - सुरक्षा जोखिम?
- 5. जावास्क्रिप्ट टिप्पणियां सुरक्षा जोखिम हैं?
- 6. क्या जावास्क्रिप्ट "नकली गोपनीयता" सुरक्षा जोखिम उत्पन्न करता है?
- 7. ओपन प्रमाणीकरण 2.0 - अंतर्निहित सुरक्षा जोखिम
- 8. सत्यापन से AJAX के सुरक्षा जोखिम?
- 9. जावा प्रतिबिंब ढांचे और सुरक्षा
- 10. विस्तृत अपवाद/त्रुटि संदेशों को सुरक्षा जोखिम है?
- 11. जावा प्रतिबिंब - ऑब्जेक्ट कक्षा
- 12. सुरक्षा जोखिम की व्याख्या करने के लिए संसाधनों की तलाश
- 13. "monadic प्रतिबिंब" क्या है?
- 14. क्रॉस-डोमेन XMLHttpRequest का उपयोग करने में सुरक्षा जोखिम क्या हैं?
- 15. Emacs में 'जोखिम भरा' क्या है?
- 16. क्या @ Html.Raw का उपयोग करने में कोई जोखिम है?
- 17. PHP सत्रों के जोखिम क्या हैं?
- 18. क्या आपके फॉर्म फ़ील्ड का नामकरण समान है जैसे mysql वास्तव में कोई सुरक्षा जोखिम उत्पन्न करता है?
- 19. मैकपोर्ट का उपयोग कर कोई जोखिम?
- 20. सी # "है" ऑपरेटर - क्या वह प्रतिबिंब है?
- 21. 'थ्रेड सुरक्षित' ऑब्जेक्ट का क्या अर्थ है?
- 22. थ्रेड सुरक्षा का क्या अर्थ है?
- 23. "सुरक्षा चर" क्या है?
- 24. अविश्वसनीय जीपीजीपीयू कोड (ओपनसीएल आदि) - क्या यह सुरक्षित है? क्या जोखिम है?
- 25. मेटाप्रोग्रामिंग प्रतिबिंब का सबसेट है?
- 26. प्रतिबिंब
- 27. .NET प्रतिबिंब की "लागत" क्या है?
- 28. सी # प्रतिबिंब: क्या रनटाइम पर ऑब्जेक्ट का उदाहरण ढूंढना संभव है?
- 29. "प्रतिबिंब मशीन" बनाने के लिए प्रतिबिंब का उपयोग कैसे करें
- 30. विंडोज सेवा को "स्थानीय सिस्टम" के रूप में चलाने में सुरक्षा जोखिम क्या हैं?
क्या यह अक्षम है, या कोई सुरक्षा प्रबंधक है? – Bozho
+1 हत्यारा प्रश्न। इसे अभी बंद मत करो अभी तक मैं जवाब से संतुष्ट नहीं हूं। – rook
देखें [यह प्रश्न] (http://stackoverflow.com/questions/1160924/what-risk-does-reflection-pose-medium-trust)। – dbyrne