2013-02-22 10 views
13

संवेदनशील डेटा (== पासवर्ड) को संभालने के लिए एक सामान्य जावा सुरक्षा दिशानिर्देश डेटा को स्टोर करने के लिए स्ट्रिंग ऑब्जेक्ट का उपयोग कभी नहीं करता है, और इसके बजाय बाइट्स या वर्णों की सरणी का उपयोग करता है। मैं इस दिशानिर्देश को एक HttpServlet हैंडलर में लागू करने की कोशिश कर रहा हूं। विशेष रूप से, मैं एक बुनियादी प्रमाणीकरण-जैसे दृष्टिकोण का उपयोग कर रहा हूं जहां एक शीर्षलेख में प्रमाण पत्र पारित किए जाते हैं (यह एक अनुरोध है, इसलिए कोई शरीर नहीं)।जावा में, मैं एक स्ट्रिंग ऑब्जेक्ट उत्पन्न किए बिना HttpServletRequest शीर्षलेख से पासवर्ड कैसे निकालूं?

जिस समस्या में मैं चल रहा हूं वह यह है कि स्ट्रिंग ऑब्जेक्ट उत्पन्न किए बिना हेडर डेटा प्राप्त करना असंभव लगता है, जो गेट-इन से दिशानिर्देश का उल्लंघन करता है। मैंने एक समाधान की पूरी तरह से खोज की है, और कोई प्रासंगिक चर्चा नहीं मिली है। क्या किसी को इस मुद्दे में कोई अंतर्दृष्टि है?

नोट: यह HTTPS पर होता है, इसलिए यहां कोई कनेक्शन सुरक्षा समस्या नहीं है।

+0

सबकुछ 1s और 0s नहीं है .. एक बाइट [] से एक सुरक्षा खतरे की एक स्ट्रिंग कैसे है? – smk

+1

@ एसएमके: क्योंकि 'स्ट्रिंग का इंटर्न किया जा सकता है, जिसका मतलब है कि आप उनका उपयोग पूरा करने के बाद स्मृति में घूमते रहते हैं। –

+6

@ एसएमके स्ट्रिंग्स अपरिवर्तनीय हैं। एक बार आपके पास एक बार हो जाने पर, यह स्मृति में चारों ओर लटकने जा रहा है जब तक कि यह कचरा इकट्ठा न हो जाए (जब आप इसके साथ काम कर लेंगे)। एक बार बाइट [] 'के साथ, एक बार जब आप इसके साथ काम कर लेंगे, तो आप डेटा को पढ़ने से रोकने के लिए सामग्री को ओवरराइट कर सकते हैं। – cheeken

उत्तर

12

सरल उत्तर यह है कि आप स्ट्रिंग की तुलना में किसी भी अन्य रूप में पैरामीटर नहीं प्राप्त कर सकते हैं। कम से कम, मानक सर्वलेट एपीआई का उपयोग नहीं कर रहा है। लेकिन कुछ संभव "आउट हो जाओ" हैं।

  1. तुम सच में बदसूरत पाने के लिए तैयार कर रहे हैं, तो आप वास्तव में स्ट्रिंग वस्तु की अमूर्त तोड़ सकते हैं, और में पहुंच सकते हैं और पात्रों के ऊपर लिख। (यदि आप नियमों को तोड़ने के लिए तैयार हैं तो स्ट्रिंग वास्तव में उत्परिवर्तनीय हैं। यह कुछ स्थितियों में से एक है जहां इसे उचित ठहराया जा सकता है।)

  2. आपके वेब कंटेनर के कार्यान्वयन (कहने) में एक गैर-मानक API एक्सटेंशन हो सकता है ऐसा करने के लिए HttpServletRequest। यदि नहीं, तो आप स्रोत कोड को पकड़ने और एक जोड़ने में सक्षम हो सकते हैं। (आप एक खुला स्रोत वेब कंटेनर का उपयोग कर रहे मान लिया जाये।)


कहा करने के बाद कि, IMO जावा सुरक्षा के लिए "कोई तार" दृष्टिकोण गुमराह है, या क्या के मामले में कम से कम से अधिक रेटेड यह प्राप्त करता है।

संभावना के मुकाबले "कोई स्ट्रिंग्स" दृष्टिकोण गार्ड नहीं है कि आपके आवेदन के पता स्थान के माध्यम से कुछ ट्रैवल हो सकता है, तारों की तरह दिखने वाली चीज़ों का पता लगा सकता है, और संभव पासवर्ड को बाहर कर सकता है। सिद्धांत रूप में, इस के द्वारा किया जा सकता है:

  • एक हैक कि JVM के निष्पादन मॉडल टूट जाता है और कच्चे स्मृति को देखता है,
  • एक जावा डिबगर संलग्न और पहुंच योग्य वस्तुओं के माध्यम से trawling,
  • का उपयोग कर "/ dev/mem "या बाहर से प्रक्रिया स्मृति को पढ़ने के लिए समान है,
  • हार्ड ड्राइव पर एक कार्यक्रम की अदला-बदली छवि की बनी हुई है उन तक पहुंचने या
  • किसी भी तरह कोर डंप करने के लिए इसे पैदा कर रहा है और डंप पढ़ने।

हालांकि, इनमें से पहले लेकिन सभी को यह आवश्यक है कि बुरे आदमी ने सिस्टम पर सुरक्षा को तोड़ दिया हो। और यदि बुरे आदमी ने ऐसा किया है कि आपके प्रोग्राम से पासवर्ड चोरी करने के लिए अन्य (शायद सरल) तरीके हैं ... जो "तार नहीं" दृष्टिकोण नहीं रोकेगा।

और यदि आप एक हैक के बारे में चिंतित हैं जो कच्चे मेमोरी को पढ़ने के लिए जावा सुरक्षा दोष का शोषण करता है, तो वह दोष शायद अन्य तरीकों से उपयोग किया जा सकता है; जैसे पासवर्ड को कोड द्वारा नियंत्रित किए जाने वाले तरीके को बदलने के लिए कोड इंजेक्ट करने के लिए।

तो संक्षेप में, "कोई तार" या तो वास्तव में मुश्किल हैक्स के खिलाफ सुरक्षा नहीं कर रहा है, या उन मामलों के खिलाफ जहां आपकी सुरक्षा पहले से ही उड़ा दी गई है। आईएमओ, यह प्रयास के लायक नहीं है ... जब तक आप सैन्य ग्रेड सुरक्षा लागू करने के लिए आवश्यक हैं।

+0

जहां तक ​​# 1 जाता है, क्या जावा परिभाषित करता है कि वहां क्या संभावित परिणाम हो सकते हैं? आइए मान लें कि स्मृति में कहीं भी एक समान स्ट्रिंग मौजूद है, उदाहरण के लिए हैशटेबल में एक कुंजी के रूप में। जावा कार्यान्वयन को इस मामले में दोनों स्ट्रिंग्स को "टेक्स्ट बैकिंग स्टोर" में मैप करने की अनुमति है (क्षमा करें मुझे यहां सटीक जावा शब्दावली नहीं पता है)? यदि ऐसा है, तो HTTP पैकेट के साथ आने वाले तारों को स्पष्ट रूप से साफ़ करके मैं वास्तव में अपने आवेदन में एक दुष्चक्र डॉस सुरक्षा छेद खोल सकता हूं। –

+1

यह ऐसा कर सकता है। लेकिन व्यवहार में, यह केवल तभी होगा जब कुछ स्ट्रिंग्स पर 'String.intern() 'को कॉल करता है। दूसरी संभावना यह है कि पासवर्ड स्ट्रिंग एक बड़ी स्ट्रिंग के साथ बैकिंग शेयर करता है; जैसे स्ट्रिंग हेडर लाइन का प्रतिनिधित्व करती है। मैं इन परिदृश्यों में से किसी एक समस्या की अपेक्षा नहीं करता। –

+0

असल में, एक और परिदृश्य है। वह पुराना JVMs है जहां 'स्ट्रिंग' का कार्यान्वयन कुछ परिस्थितियों में विभिन्न तारों के बीच' char [] 'बैकिंग सरणी साझा करेगा। इसे ठीक करने के लिए स्ट्रिंग का कार्यान्वयन जावा 1.7.0_u6 में फिर से लिखा गया था। (यह स्मृति रिसाव का स्रोत था!) –

संबंधित मुद्दे