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

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

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

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

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

डीएम-सत्य-हैश-तालिका

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

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

कार्यवाही

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

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

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

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

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

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

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

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

कार्यान्वयन

सारांश

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

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

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

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

<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 दोहराएं जब तक कि आपके पास केवल एक हैश न हो।

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

डीएम-सत्य मानचित्रण तालिका का निर्माण

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

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

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

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

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

  1. /boot विभाजन में /verity_key पर 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 बाइट्स
मेज dm-सत्य तालिका पहले वर्णित है तालिका की लंबाई बाइट्स
गद्दी यह संरचना 0-गद्देदार है जिसकी लंबाई 32k है 0

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

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

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