निम्नलिखित प्रतिलिपि सुरक्षा को क्रैक करना कितना आसान है? [बन्द है]


11

मैं कुछ काम को कॉपी-प्रोटेक्ट करने की कोशिश कर रहा हूं, जो एआरएम डिवाइस (रास्पबेरी पाई) पर एक लिनक्स कर्नेल बूट करने वाला एक बूट करने योग्य एसडी कार्ड है। मैं इस दृष्टिकोण का उपयोग कर रहा हूं:

  1. एक एन्क्रिप्टेड रूट फाइल सिस्टम को माउंट करने के लिए दृष्टिकोण एक initrd का उपयोग करता है।
  2. Initrd एसडी कार्ड के सीआईडी ​​के अनुसार फाइलसिस्टम का पासवर्ड उत्पन्न करता है। (हैश फ़ंक्शन का उपयोग किया जाता है, अभी तक md5 या sha1 पर निर्णय नहीं लिया है)। Initrd उस जनरेट किए गए पासवर्ड का उपयोग करके फ़ाइल सिस्टम को माउंट करने का प्रयास करेगा।
  3. अब यहाँ सबसे दिलचस्प / संदिग्ध हिस्सा है: initrd को कस्टम C फ़ंक्शन का उपयोग करके एन्क्रिप्ट किया गया है, मूल रूप से प्रत्येक बाइट XOR'ed है जो कस्टम मेड छद्म यादृच्छिक जनरेटर का उपयोग कर रहा है। कर्नेल को उसी एन्क्रिप्टिंग फ़ंक्शन के लिए संशोधित किया गया है, जो डिक्रिप्टर के रूप में काम करता है।
  4. सिस्टम खुद ही नीचे आ गया है इसलिए कीबोर्ड या बाहरी भंडारण का उपयोग करने का कोई तरीका नहीं है। एक एकल ऐप पूर्ण-स्क्रीन चलाता है।

इसलिए बूटलोडर कर्नेल और initrd को लोड करने के बाद, कर्नेल initrd को डिक्रिप्ट करता है और इसके init स्क्रिप्ट को निष्पादित करता है, जो पासवर्ड उत्पन्न करेगा और रूट फाइल सिस्टम को माउंट करेगा।

मेरा सवाल है: इस सेटअप को तोड़ना (रूट फाइलसिस्टम को डिक्रिप्ट करना और इसे किसी एसडी कार्ड से बूट करना कितना आसान होगा)? सबसे कमजोर हिस्से कौन से हैं? कर्नेल को विघटित करना और उन कस्टम एन्क्रिप्टिंग कार्यों को खोजना कितना आसान है?

संपादित करें: यहाँ कुछ सुधार हैं ताकि आप स्पष्ट चीजों के साथ समय बर्बाद न करें:

  1. रूट डिवाइस को एलयूकेएस (एईएस 256) के साथ एन्क्रिप्ट किया जाएगा और एसडी कार्ड के सीआईडी ​​और कुछ नमक का उपयोग करके एचएमएसी फ़ंक्शन द्वारा कुंजी उत्पन्न की जाएगी।
  2. Initramfs एन्क्रिप्ट करने के लिए छद्म यादृच्छिक एल्गोरिदम वास्तव में RC4 होगा, बस कुछ कस्टम फ़ंक्शन का उपयोग करके कुंजी उत्पन्न की जाएगी, क्योंकि अगर मैं बस एक बाइट सरणी में स्टोर करता हूं तो इसे पुनः प्राप्त करने के लिए इसे मृत सरल बना देता है (हाँ, यह अस्पष्टता के माध्यम से सुरक्षा है। लेकिन वहाँ कोई रास्ता नहीं लगता है)।
  3. मैं समझता हूं कि अगर एसडी कार्ड एमुलेटर का उपयोग करते हुए कोई व्यक्ति इस प्रणाली की प्रतिलिपि बना सकता है, लेकिन यह मेरे साथ ठीक है, क्योंकि इसकी बहुत मुश्किल है और कोई भी ऐसा नहीं कर सकता है। (यह भी कि कोई भी एमुलेटर से निपटना नहीं चाहेगा)

कर्नेल और initrd कहाँ संग्रहीत हैं?
user1686

सभी एक ही एसडी कार्ड पर संग्रहीत हैं। दोनों अलग-अलग फाइलों में। हमेशा की तरह / बूट में संग्रहीत।
dimovnike

जवाबों:


7

इस सेटअप को तोड़ना (रूट फाइलसिस्टम को डिक्रिप्ट करना और इसे किसी एसडी कार्ड से बूट करना कितना आसान होगा)?

आपका सेटअप "तोड़ना" कितना कठिन है, आप फाइलसिस्टम को स्वयं साइन / इनक्रिप्ट करने के लिए जिस भी विधि का उपयोग कर रहे हैं, उसमें एंट्रोपी के बिट्स की संख्या पर निर्भर करता है (क्योंकि यह कुल संयोजन की कुल संख्या को निर्धारित करता है जिसका उपयोग ब्रूट-फोर्स के लिए किया जा सकता है। पासवर्ड)।

सबसे कमजोर हिस्से कौन से हैं?

एक शक के बिना, एक पूर्वनिर्धारित सीआईडी ​​को पासवर्ड के रूप में उपयोग करने के साथ-साथ एक कस्टम छद्म यादृच्छिक संख्या पीढ़ी फ़ंक्शन का उपयोग करना।

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

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

कर्नेल को विघटित करना और उन कस्टम एन्क्रिप्टिंग कार्यों को खोजना कितना आसान है?

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


TL, DR : जब यह एन्क्रिप्शन और सिक्योरिटी की बात आती है, तो व्हील का पुनः आविष्कार न करें , यह कोशिश की गई और सही है। कई फुल-डिस्क एन्क्रिप्शन विकल्प हैं जो पहले से ही उपलब्ध हैं और रास्पबेरी पाई पर ठीक काम करने के लिए प्रदर्शन किया गया है। मैं एक तरह के "पासवर्ड" के रूप में एसडी कार्ड के सीआईडी ​​का उपयोग करने से बचूंगा - भले ही इसे बदला नहीं जा सकता है, इस मान को खराब करने के तरीके हैं।

प्रतिलिपि सुरक्षा पहले से ही सीपीआरएम के रूप में एसडी कार्ड विनिर्देश में शामिल है ।


जवाब के लिए धन्यवाद। मैं सीपीआरएम के बारे में जानता हूं, लेकिन एनडीए के साथ इसके चश्मे बंद हैं और बहुत सारे पैसे खर्च किए गए हैं (जो मैंने गुगली किया था) से। LUKS और Truecrypt के लिए, इन्हें बूट के लिए मैन्युअल रूप से कुंजी की आवश्यकता होती है। अगर मैं कुछ hmac फ़ंक्शन का उपयोग करके CID से कुंजी उत्पन्न करने के लिए TrueCrypt बूटलोडर को संशोधित करता हूं तो क्या यह इससे बेहतर होगा? मैं यह भी समझता हूं कि यह एसडी कार्ड एमुलेटर के साथ किया जा सकता है लेकिन मेरे साथ ठीक है, यह समुद्री डाकू के लिए कठिनाई का सुविधाजनक ग्रेड है। (मैं समझता हूं कि यहां कोई 100% सुरक्षा नहीं है जब तक कि डिवाइस में कुंजी
आत्मनिर्भर है

@ user2021201 वास्तव में वही था जो मैं आपको अपनी ओर ले जाने की कोशिश कर रहा था। संभवतः Truecrypt बूटलोडर को स्रोत से संशोधित करना काफी आसान होगा , हालांकि मुझे यकीन नहीं है कि बूटलोडर से सीआईडी ​​प्राप्त करना कितना मुश्किल होगा (क्योंकि आपके पास एसडी कार्ड विनिर्देशों से क्वेरी करने के लिए लोडेड ऑपरेटिंग सिस्टम नहीं है। )। हालाँकि, यदि आपने प्रबंधन किया, तो यह आपकी आवश्यकताओं के लिए एक स्वीकार्य और पर्याप्त समाधान होगा।
ब्रेकथ्रू

1

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

वैकल्पिक रूप से, एमुलेटर का उपयोग रनिंग एमुलेटेड सिस्टम में शेलकोड इंजेक्ट करने के लिए करें। फिर डिक्रिप्टेड रूटफ़्स को कॉपी करने के लिए रनिंग सिस्टम का उपयोग करें (या उपयोग की जाने वाली कुंजियों को पढ़ें dmsetup table --showkeys, आदि)

एक त्वरित खोज रास्पबेरी पाई एमुलेटर के अस्तित्व को बदल देती है , इसलिए काम का हिस्सा पहले ही हो चुका है।

आपको एक और समस्या है, विशेष रूप से इस में:

कर्नेल को उसी एन्क्रिप्टिंग फ़ंक्शन के लिए संशोधित किया गया है, जो डिक्रिप्टर के रूप में काम करता है।

जो भी आप इसे वितरित करते हैं, वह GPL की शर्तों के तहत कर्नेल स्रोत कोड का हकदार है। तो आपको इसे अलग करने की आवश्यकता नहीं होगी, आप diffअतिरिक्त फ़ंक्शन को खोजने के लिए उपयोग कर सकते हैं।

(ऐसा नहीं है कि डिस्सैम्प के माध्यम से इसे ढूंढना इतना कठिन होगा, जितना आप कर सकते हैं, उदाहरण के लिए, स्टॉक कर्नेल की जाँच करें)

मैं रास्पबेरी पाई बूट कोड से पूरी तरह परिचित नहीं हूं, लेकिन अगर आप बूटलोडर को एक एम्बेडेड क्रिप्टो कुंजी (जो तब कर्नेल को पास किया जाता है) के साथ फिर से लोड कर सकते हैं, तो कम से कम एसडी कार्ड पर नहीं होना चाहिए, इसलिए यह ' डी एक एमुलेटर में बूट करने के लिए इसे प्राप्त करने का प्रयास पन्नी।


हाँ, मुझे लाइसेंसिंग के मुद्दों के बारे में पता है, मैं अभी भी कर्नेल बरकरार छोड़ने और यहां तक ​​कि FreeBSD कर्नेल पर स्विच करने के तरीकों की तलाश कर रहा हूं लेकिन अब केवल तकनीकी मुद्दों पर चर्चा करने देता हूं। बूटलोडर विचार बहुत दिलचस्प है, लेकिन मैं इसे लागू करने का एक तरीका नहीं ढूंढ सका, जाहिर है कि ऐसा कोई तरीका नहीं है।
dimovnike
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.