डीएम-वेरिटी लागू करना

एंड्रॉइड 4.4 और उच्चतर वैकल्पिक डिवाइस-मैपर-वेरिटी (डीएम-वेरिटी) कर्नेल सुविधा के माध्यम से सत्यापित बूट का समर्थन करता है, जो ब्लॉक डिवाइस की पारदर्शी अखंडता जांच प्रदान करता है। dm-verity लगातार रूटकिट को रोकने में मदद करता है जो रूट विशेषाधिकारों और समझौता उपकरणों पर पकड़ बना सकता है। यह सुविधा एंड्रॉइड उपयोगकर्ताओं को यह सुनिश्चित करने में मदद करती है कि डिवाइस को बूट करते समय यह उसी स्थिति में है जब इसे आखिरी बार इस्तेमाल किया गया था।

रूट विशेषाधिकारों वाले संभावित रूप से हानिकारक एप्लिकेशन (पीएचए) पहचान कार्यक्रमों से छिप सकते हैं और अन्यथा खुद को छिपा सकते हैं। रूटिंग सॉफ़्टवेयर ऐसा कर सकता है क्योंकि यह अक्सर डिटेक्टरों की तुलना में अधिक विशेषाधिकार प्राप्त होता है, जो सॉफ़्टवेयर को डिटेक्शन प्रोग्रामों से "झूठ" बोलने में सक्षम बनाता है।

डीएम-सत्यापन सुविधा आपको एक ब्लॉक डिवाइस, फ़ाइल सिस्टम की अंतर्निहित स्टोरेज परत को देखने देती है, और यह निर्धारित करती है कि यह इसकी अपेक्षित कॉन्फ़िगरेशन से मेल खाती है या नहीं। यह क्रिप्टोग्राफ़िक हैश ट्री का उपयोग करके ऐसा करता है। प्रत्येक ब्लॉक (आमतौर पर 4k) के लिए, एक SHA256 हैश होता है।

चूँकि हैश मान पृष्ठों के एक ट्री में संग्रहीत होते हैं, शेष ट्री को सत्यापित करने के लिए केवल शीर्ष-स्तरीय "रूट" हैश पर ही भरोसा किया जाना चाहिए। किसी भी ब्लॉक को संशोधित करने की क्षमता क्रिप्टोग्राफ़िक हैश को तोड़ने के बराबर होगी। इस संरचना के चित्रण के लिए निम्नलिखित चित्र देखें।

डीएम-वेरिटी-हैश-टेबल

चित्र 1. डीएम-सत्यापन हैश तालिका

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

संचालन

डीएम-वेरिटी सुरक्षा कर्नेल में रहती है। इसलिए यदि रूटिंग सॉफ़्टवेयर कर्नेल आने से पहले सिस्टम से समझौता करता है, तो यह उस पहुंच को बनाए रखेगा। इस जोखिम को कम करने के लिए, अधिकांश निर्माता डिवाइस में जली हुई कुंजी का उपयोग करके कर्नेल को सत्यापित करते हैं। डिवाइस के फ़ैक्टरी से बाहर निकलने के बाद वह कुंजी बदली नहीं जा सकती।

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

किसी ब्लॉक डिवाइस को सत्यापित करने का एक तरीका इसकी सामग्री को सीधे हैश करना और संग्रहीत मूल्य से उनकी तुलना करना है। हालाँकि, संपूर्ण ब्लॉक डिवाइस को सत्यापित करने का प्रयास करने में एक विस्तारित अवधि लग सकती है और डिवाइस की बहुत अधिक बिजली की खपत हो सकती है। उपकरणों को बूट होने में लंबा समय लगेगा और फिर उपयोग से पहले काफी हद तक खाली कर दिया जाएगा।

इसके बजाय, dm-verity ब्लॉक को व्यक्तिगत रूप से सत्यापित करता है और केवल तभी जब प्रत्येक तक पहुंच हो। जब मेमोरी में पढ़ा जाता है, तो ब्लॉक को समानांतर में हैश किया जाता है। फिर हैश को पेड़ पर सत्यापित किया जाता है। और चूंकि ब्लॉक को पढ़ना इतना महंगा ऑपरेशन है, इसलिए इस ब्लॉक-स्तरीय सत्यापन द्वारा शुरू की गई विलंबता तुलनात्मक रूप से नाममात्र है।

यदि सत्यापन विफल हो जाता है, तो डिवाइस एक I/O त्रुटि उत्पन्न करता है जो दर्शाता है कि ब्लॉक को पढ़ा नहीं जा सकता है। ऐसा प्रतीत होगा मानो फ़ाइल सिस्टम दूषित हो गया है, जैसा कि अपेक्षित है।

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

आगे त्रुटि सुधार

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

कार्यान्वयन

सारांश

  1. एक ext4 सिस्टम छवि बनाएं।
  2. उस छवि के लिए एक हैश ट्री बनाएं
  3. उस हैश ट्री के लिए एक dm-सत्यापन तालिका बनाएं
  4. तालिका हस्ताक्षर बनाने के लिए उस dm-सत्यापन तालिका पर हस्ताक्षर करें
  5. तालिका हस्ताक्षर और dm-सत्यापन तालिका को सत्यता मेटाडेटा में बंडल करें
  6. सिस्टम छवि, सत्यता मेटाडेटा और हैश ट्री को संयोजित करें।

हैश ट्री और डीएम-सत्यापन तालिका के विस्तृत विवरण के लिए क्रोमियम प्रोजेक्ट्स - सत्यापित बूट देखें।

हैश ट्री उत्पन्न करना

जैसा कि परिचय में बताया गया है, हैश ट्री डीएम-वेरिटी का अभिन्न अंग है। क्रिप्टसेटअप टूल आपके लिए एक हैश ट्री तैयार करेगा। वैकल्पिक रूप से, एक संगत को यहां परिभाषित किया गया है:

<your block device name> <your block device name> <block size> <block size> <image size in blocks> <image size in blocks + 8> <root hash> <salt>

हैश बनाने के लिए, सिस्टम छवि को परत 0 पर 4k ब्लॉक में विभाजित किया गया है, प्रत्येक को एक SHA256 हैश सौंपा गया है। परत 1 केवल उन SHA256 हैश को 4k ब्लॉकों में जोड़कर बनाई गई है, जिसके परिणामस्वरूप बहुत छोटी छवि बनती है। परत 2, परत 1 के SHA256 हैश के साथ, समान रूप से बनाई गई है।

ऐसा तब तक किया जाता है जब तक कि पिछली परत के SHA256 हैश एक ब्लॉक में फिट न हो जाएं। जब उस ब्लॉक का SHA256 प्राप्त होता है, तो आपके पास पेड़ का रूट हैश होता है।

हैश ट्री का आकार (और संबंधित डिस्क स्थान उपयोग) सत्यापित विभाजन के आकार के साथ बदलता रहता है। व्यवहार में, हैश पेड़ों का आकार छोटा होता है, अक्सर 30 एमबी से कम।

यदि आपके पास एक परत में एक ब्लॉक है जो पिछली परत के हैश द्वारा स्वाभाविक रूप से पूरी तरह से भरा नहीं है, तो आपको अपेक्षित 4k प्राप्त करने के लिए इसे शून्य से पैड करना चाहिए। यह आपको यह जानने की अनुमति देता है कि हैश ट्री को हटाया नहीं गया है और इसके बजाय रिक्त डेटा के साथ पूरा किया गया है।

हैश ट्री उत्पन्न करने के लिए, परत 2 के हैश को परत 1 के हैश पर, परत 3 के हैश को परत 2 के हैश पर, और इसी तरह संयोजित करें। यह सब डिस्क पर लिखें। ध्यान दें कि यह रूट हैश की परत 0 का संदर्भ नहीं देता है।

संक्षेप में, हैश ट्री के निर्माण के लिए सामान्य एल्गोरिदम इस प्रकार है:

  1. एक यादृच्छिक नमक (हेक्साडेसिमल एन्कोडिंग) चुनें।
  2. अपनी सिस्टम छवि को 4k ब्लॉकों में विभाजित करें।
  3. प्रत्येक ब्लॉक के लिए, उसका (नमकीन) SHA256 हैश प्राप्त करें।
  4. एक स्तर बनाने के लिए इन हैशों को जोड़ें
  5. स्तर को 0s से 4k ब्लॉक सीमा तक पैड करें।
  6. स्तर को अपने हैश ट्री से जोड़ें।
  7. अगले स्तर के स्रोत के रूप में पिछले स्तर का उपयोग करते हुए चरण 2-6 को तब तक दोहराएँ जब तक आपके पास केवल एक हैश न रह जाए।

इसका परिणाम एक एकल हैश है, जो आपका रूट हैश है। यह और आपका नमक आपके डीएम-वेरिटी मैपिंग टेबल के निर्माण के दौरान उपयोग किया जाता है।

डीएम-वेरिटी मैपिंग टेबल का निर्माण

डीएम-वेरिटी मैपिंग टेबल बनाएं, जो कर्नेल के लिए ब्लॉक डिवाइस (या लक्ष्य) और हैश ट्री के स्थान (जो समान मूल्य है) की पहचान करता है। इस मैपिंग का उपयोग fstab जेनरेशन और बूटिंग के लिए किया जाता है। तालिका ब्लॉकों के आकार और हैश_स्टार्ट, हैश ट्री के प्रारंभ स्थान (विशेष रूप से, छवि की शुरुआत से इसकी ब्लॉक संख्या) की भी पहचान करती है।

सत्यता लक्ष्य मैपिंग तालिका फ़ील्ड के विस्तृत विवरण के लिए क्रिप्टसेटअप देखें।

डीएम-सत्यापन तालिका पर हस्ताक्षर करना

तालिका हस्ताक्षर बनाने के लिए dm-सत्यापन तालिका पर हस्ताक्षर करें। किसी विभाजन को सत्यापित करते समय, तालिका हस्ताक्षर को पहले मान्य किया जाता है। यह आपकी बूट छवि पर एक निश्चित स्थान पर एक कुंजी के विरुद्ध किया जाता है। किसी निश्चित स्थान पर उपकरणों पर स्वचालित समावेशन के लिए कुंजियाँ आमतौर पर निर्माताओं के निर्माण सिस्टम में शामिल की जाती हैं।

इस हस्ताक्षर और कुंजी संयोजन के साथ विभाजन को सत्यापित करने के लिए:

  1. /verity_key पर /boot विभाजन में libmincrypt-संगत प्रारूप में एक RSA-2048 कुंजी जोड़ें। हैश ट्री को सत्यापित करने के लिए उपयोग की जाने वाली कुंजी के स्थान की पहचान करें।
  2. प्रासंगिक प्रविष्टि के लिए fstab में, fs_mgr फ़्लैग में verify जोड़ें।

तालिका हस्ताक्षर को मेटाडेटा में बंडल करना

तालिका हस्ताक्षर और dm-सत्यापन तालिका को सत्यता मेटाडेटा में बंडल करें। मेटाडेटा के पूरे ब्लॉक को संस्करणित किया गया है ताकि इसे बढ़ाया जा सके, जैसे कि दूसरे प्रकार के हस्ताक्षर जोड़ना या कुछ ऑर्डर बदलना।

विवेक जांच के रूप में, तालिका मेटाडेटा के प्रत्येक सेट के साथ एक जादुई संख्या जुड़ी होती है जो तालिका की पहचान करने में मदद करती है। चूंकि लंबाई ext4 सिस्टम इमेज हेडर में शामिल है, यह डेटा की सामग्री को जाने बिना मेटाडेटा की खोज करने का एक तरीका प्रदान करता है।

यह सुनिश्चित करता है कि आपने असत्यापित विभाजन को सत्यापित करने के लिए नहीं चुना है। यदि हां, तो इस जादुई संख्या की अनुपस्थिति सत्यापन प्रक्रिया को रोक देगी। यह संख्या मिलती-जुलती है:
0xb001b001

हेक्स में बाइट मान हैं:

  • पहला बाइट = b0
  • दूसरा बाइट = 01
  • तीसरा बाइट = b0
  • चौथा बाइट = 01

निम्नलिखित चित्र सत्यता मेटाडेटा के टूटने को दर्शाता है:

<magic number>|<version>|<signature>|<table length>|<table>|<padding>
\-------------------------------------------------------------------/
\----------------------------------------------------------/   |
                            |                                  |
                            |                                 32K
                       block content

और यह तालिका उन मेटाडेटा फ़ील्ड का वर्णन करती है।

तालिका 1. सत्यता मेटाडेटा फ़ील्ड

मैदान उद्देश्य आकार कीमत
जादुई संख्या fs_mgr द्वारा विवेक जांच के रूप में उपयोग किया जाता है 4 बाइट्स 0xb001b001
संस्करण मेटाडेटा ब्लॉक को संस्करणित करने के लिए उपयोग किया जाता है 4 बाइट्स वर्तमान में 0
हस्ताक्षर PKCS1.5 गद्देदार प्रपत्र में तालिका के हस्ताक्षर 256 बाइट्स
टेबल की लंबाई डीएम-सत्यापन तालिका की लंबाई बाइट्स में 4 बाइट्स
मेज़ पहले वर्णित डीएम-सत्यापन तालिका तालिका की लंबाई बाइट्स
गद्दी यह संरचना 0-पैडेड से लेकर 32k लंबाई तक की है 0

डीएम-सत्यापन का अनुकूलन

डीएम-वेरिटी से सर्वोत्तम प्रदर्शन प्राप्त करने के लिए, आपको यह करना चाहिए:

  • कर्नेल में, ARMv7 के लिए NEON SHA-2 और ARMv8 के लिए SHA-2 एक्सटेंशन चालू करें।
  • अपने डिवाइस के लिए सर्वोत्तम कॉन्फ़िगरेशन खोजने के लिए विभिन्न रीड-फ़ॉरवर्ड और प्रीफ़ेच_क्लस्टर सेटिंग्स के साथ प्रयोग करें।