2011-12-19 14 views
21

प्रामाणिक कोड कोडिंग और मजबूत नामकरण के आसपास अपना सिर प्राप्त करने का प्रयास कर रहा है।क्या मजबूत-नामकरण के बिना कोड-हस्ताक्षर आपके ऐप को दुरुपयोग के लिए छोड़ देता है?

क्या मैं यह सोचने में सही हूं कि यदि मैं कुछ डीएलएस (मजबूत नाम नहीं) का संदर्भ देता हूं तो एक दुर्भावनापूर्ण उपयोगकर्ता मेरे डीएलएल को प्रतिस्थापित कर सकता है और ऐप को ऐसे तरीके से वितरित कर सकता है जो ऐसा लगता है कि यह मेरे द्वारा हस्ताक्षरित है , लेकिन उनका कोड चल रहा है?

मान लीजिए कि यह सच है, ऐसा लगता है कि आप वास्तव में पूरी चीज़ को मजबूत किए बिना .NET ऐप पर हस्ताक्षर नहीं करना चाहते हैं, अन्यथा आप लोगों को आपके द्वारा लिखे गए ऐप की नींव के तहत कोड निष्पादित करने की क्षमता दे रहे हैं ?

कारण मैं अनिश्चित हूं, यह है कि मुझे कोई भी लेख ऑनलाइन नहीं मिला है (एसएन + प्रामाणिकोड का उपयोग करने के बारे में एमएसडीएन दस्तावेज़ सहित) इसका उल्लेख है, और यह समझने के लिए एक काफी महत्वपूर्ण बिंदु जैसा लगता है (अगर मैं ' सही ढंग से समझा है)?

उत्तर

15

क्या मैं सही हूँ यह सोच कर कि अगर मैं एक exe में कुछ DLLs (मजबूत नहीं नाम) है कि एक दुर्भावनापूर्ण उपयोगकर्ता मेरी DLLs की जगह और एक तरीका है कि के रूप में अगर प्रकट होता है में एप्लिकेशन वितरित कर सकता है संदर्भ कोड-हस्ताक्षर में यह मेरे द्वारा हस्ताक्षरित है, लेकिन अपना कोड चला रहा है?

हाँ अगर DLLs के शेष केवल प्रवेश किया हुआ है और मजबूत नाम नहीं वे नेट एक अपवाद को ऊपर उठाने के बिना बदला जा सकता है। आप exe के अंदर, डीएलएल को exe के समान कुंजी द्वारा हस्ताक्षरित कर सकते हैं सत्यापित कर सकते हैं। इनमें से कोई भी दृष्टिकोण किसी को आपके डीएलएल या EXE को बदलने से रोकता है।

मान लिया जाये कि यह सच है, ऐसा लगता है तुम सच में बिना एक .NET अनुप्रयोग पर हस्ताक्षर नहीं करना चाहेंगे की तरह मजबूत नामकरण पूरी बात, अन्यथा आप लोगों की आड़ में कोड निष्पादित करने की क्षमता दे रहे हैं एक ऐप आपने लिखा था?

आम तौर पर मुझे लगता है कि 'सबसे अच्छा अभ्यास' है, लेकिन फिर आप कुछ भी रोका नहीं है। एक बार जब उपयोगकर्ता को स्थानीय सिस्टम पर फ़ाइलों को बदलने का अधिकार होता है तो आप उन्हें दुर्भावनापूर्ण गतिविधि से रोकने के लिए बहुत कुछ नहीं कर सकते हैं।

कई कहानियो प्रौद्योगिकियों कि एक एकल exe में पूरा नेट परियोजनाओं का निर्माण कर रहे हैं, यह 'सबसे सुरक्षित' दृष्टिकोण बना सकता है, लेकिन अभी भी साथ छेड़छाड़ कर सकते हैं।

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

अपडेट किया गया

तो बाध्यकारी रीडायरेक्ट केवल विधानसभाओं एक ही कुंजी के साथ मजबूत नाम है, और इसलिए DLLs से बचाने करता है के साथ काम करेंगे बदला जा रहा?

सही है, प्रख्यात अपवाद के साथ कि कोड इंजेक्शन अभी भी कई तरीकों से किया जा सकता है।

... और वापस मूल प्रश्न के, बिना कोड पर हस्ताक्षर करता है मजबूत नामकरण थोड़े कोड हस्ताक्षर की बात को कमजोर?

वास्तव में नहीं। कोड हस्ताक्षर (मजबूत नामकरण नहीं) के दो अलग-अलग उद्देश्य हैं:

  1. प्रमाणीकरण। यह सत्यापित करना कि सॉफ्टवेयर का लेखक कौन है।
  2. ईमानदारी। यह सत्यापित करना कि सॉफ़्टवेयर पर हस्ताक्षर किए जाने के बाद छेड़छाड़ नहीं हुई है।

अक्सर यह केवल प्रमाणीकृत और स्थापना के दौरान मान्य है। यही कारण है कि हम अपने setup.exe पर हस्ताक्षर करते हैं, यह सुनिश्चित करने के लिए कि ग्राहक को हमारे द्वारा अनमोडेड इंस्टॉलर प्राप्त हुआ है। उन्हें "क्या आप XXXX कंपनी पर भरोसा करते हैं" के साथ संकेत दिए जाते हैं और इस प्रकार प्रमाणित/हस्ताक्षरित इंस्टॉलर को प्राधिकरण प्रदान करते हैं। एक बार इंस्टॉल हो जाने के बावजूद ओएस द्वारा कोड हस्ताक्षर करने में थोड़ा अंतर्निहित उपयोग होता है (ड्राइवरों और कुछ अन्य अस्पष्ट मामलों को छोड़कर)।

दूसरे पर मजबूत नामकरण के अस्तित्व के लिए एक पूरी तरह से अलग उद्देश्य था। यह पूरी तरह से आवेदन की 'अखंडता' पर केंद्रित है। इसके खिलाफ सत्यापित करने के लिए कोई प्रमाणपत्र नहीं, कोई हस्ताक्षर प्राधिकरण (सीए) नहीं है, उनके लिए पुष्टि करने के लिए कोई उपयोगकर्ता द्वारा प्रदर्शित जानकारी नहीं है, और कुछ भी ओएस निष्पादन योग्य के बारे में सत्यापित नहीं कर सकता है जो इसे चलाने जा रहा है।

.NET फ़्रेमवर्क कई बातों के लिए मजबूत नामों का उपयोग उन सभी को मैं शिथिल आवेदन अखंडता के रूप में वर्गीकृत:

  1. dll की सामग्री/exe एक हस्ताक्षरित हैश इतना है कि यह साथ छेड़छाड़ नहीं की जा सकता है।
  2. निर्भरता लोड करते समय प्रत्येक संदर्भ को मजबूत और सत्यापित किया जाना चाहिए।
  3. असेंबली जीएसी में पंजीकृत हो सकते हैं और प्रकाशक नीतियों का उपयोग किया जा सकता है।
  4. असेंबली के आईएल की संकलित छवि बनाने के लिए मूल छवियों को ngen'd किया जा सकता है।

मुझे यकीन है कि यहां कुछ अन्य चीजें हैं जो मुझे याद आ रही हैं, लेकिन ये प्राथमिक उपयोग हैं जिन्हें मैं जानता हूं।हस्ताक्षर और मजबूत नामकरण

  • एक हस्ताक्षरित संस्थापक
  • एक मजबूत नाम निष्पादन
  • मजबूत नाम का प्रयोग करें एक कोड-हस्ताक्षरित निष्पादन
  • उपयोग का उपयोग करें के लिए

    सर्वश्रेष्ठ अभ्यास सभी निर्भरता और उनके संदर्भ

  • कोड हस्ताक्षर निर्भरता आमतौर पर आवश्यक नहीं है *
  • पर विचार करें GAC स्थापित समय में विधानसभाओं दर्ज की

* ध्यान दें: कोड पर हस्ताक्षर करने, एक DLL के लिए कुछ मामलों में उपयोगी हो सकता है के लिए उदाहरण COM ऑब्जेक्ट चिह्नित 'सुरक्षित' और एक ब्राउज़र में एम्बेडेड हस्ताक्षर किया जाना चाहिए और के रूप में मजबूत के नाम अगर यह एक निष्पादन योग्य था। कोड हस्ताक्षर असेंबली लोड किए बिना या इसके गुणों को प्रतिबिंबित किए बिना बाहरी रूप से निर्भरताओं को सत्यापित करने में भी उपयोगी हो सकता है।

+0

मेरे पास कोई उदाहरण नहीं है जिसे मैं सुरक्षित करने की कोशिश कर रहा हूं, मैं बस कोड हस्ताक्षर/एसएन को पूरी तरह से समझने की कोशिश कर रहा हूं :-) आप सुझाव देते हैं कि एसएन को रीडायरेक्ट बाइंडिंग के साथ बाईपास किया जा सकता है ... क्या वह दयालु हार नहीं है एसएन का बिंदु पूरी तरह से? –

+0

आप सही हैं, बाध्यकारी रीडायरेक्ट हस्ताक्षर कुंजी को बदल नहीं सकता है। मैं पोस्ट करने के बाद अपने तथ्यों की जांच करने के लिए सलाह देता हूं लेकिन विचलित हो गया। –

+0

तो बाध्यकारी रीडायरेक्ट केवल उसी कुंजी के साथ मजबूत नामित असेंबली के साथ काम करेगा, और इसलिए * डीएलएल से आपको बदलता है? (और मूल प्रश्न पर वापस, कोड-हस्ताक्षर के बिना कोड-हस्ताक्षर कोड-हस्ताक्षर के बिंदु को कमजोर करता है?) –

1

कोई आपकी मशीन पर dll का या चलाने के कोड की जगह ले सकता एक बार वहाँ नहीं हैं कि कई सुरक्षा उपायों को आप के लिए छोड़ दिया है। मेरे मामले में सभी डीएल के कोड व्यक्तिगत रूप से हस्ताक्षरित हैं। मेरा कोड डीएलएस डाउनलोड करने से इनकार करता है जो स्वयं अपडेट के हिस्से के रूप में हस्ताक्षरित नहीं हैं। हालांकि किसी भी अनुप्रयोग मेरी ईमानदारी स्तर अपने सिस्टम पर या उच्चतर पर चल रहे (> = विस्टा विंडोज के मामले में) अभी भी CreateRemoteThread आदि (http://www.codeguru.com/Cpp/WP की तरह कुछ के साथ मेरी exe में एक dll इंजेक्षन कर सकते हैं /dll/article.php/c105) लेकिन फिर से यह मानते हुए कि कोई सिस्टम में विदेशी कोड प्राप्त कर सकता है वह कठिन हिस्सा है। बाकी आसान है।

0

आपको यह भी याद रखना चाहिए कि कोड के हस्ताक्षर अक्सर आवेदन के अन्य हिस्सों को तैनात किए बिना डीएलएल को अपग्रेड करते समय बहुत दर्द का परिचय देते हैं।

यही कारण है कि कई लोकप्रिय पुस्तकालयों दृढ़ता से नाम नहीं dll के

0

उसी के लिए खोज की जा रही है और कई सामान को पढ़ने के बाद। अंत में मैं आपके प्रश्न से कह सकता हूं, हां, निर्भरताओं के लिए मजबूत नाम जरूरी है यदि आप अपने ऐप एक्सई पर डिजिटल हस्ताक्षर करने जा रहे हैं।

यह मान लें, अगर आपकी निर्भरताओं का मजबूत नाम नहीं है। और वे बदल जाते हैं। आपका आवेदन बिना किसी समस्या के उन्हें लोड करेगा। और उपयोगकर्ता "सत्यापित प्रकाशक: आपका नाम" संवाद देखेंगे। जबकि निष्पादन योग्य छेड़छाड़ की गई थी लेकिन निर्भरता बदल गई थी।

समस्या वह उपयोगकर्ता नहीं है लेकिन उस पैकेज का वितरण बदलती निर्भरताओं के साथ है जबकि हर कोई आपका नाम देखेगा।

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