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

Android 4.4 और उसके बाद के वर्शन, वेरिफ़ाइड बूट की सुविधा देते हैं. हालांकि, इसके लिए ज़रूरी नहीं है डिवाइस-मैपर-वेरिटी (dm-verity) कर्नेल सुविधा के ज़रिए ब्लॉक किए गए डिवाइसों के लिए इंटिग्रिटी जांच करें. dm-verity, परसिस्टेंट रूटकिट को रोकने में मदद करती है जो रूट कंट्रोल और हैक किए गए डिवाइसों पर पहुंच बनाए रख सकते हैं. यह सुविधा की मदद से, Android इस्तेमाल करने वाले लोग यह पक्का कर पाते हैं कि डिवाइस को चालू करते समय, Android का इस्तेमाल उसी डिवाइस में किया जा रहा है पिछली बार इस्तेमाल किए जाने की स्थिति.

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

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

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

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

पहली इमेज. डीएम-वेरिटी हैश टेबल

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

कार्रवाई

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

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

किसी ब्लॉक डिवाइस की पुष्टि करने का एक तरीका यह है कि उसके कॉन्टेंट को हैश करके आपस में तुलना की जाए उनकी स्टोर वैल्यू तय कर सकते हैं. हालांकि, पूरे ब्लॉक डिवाइस की पुष्टि करने की कोशिश करने पर, यह प्रोसेस ज़्यादा समय तक चलती है और डिवाइस की बिजली की ज़्यादातर खपत होती है. डिवाइसों को उन्हें बूट करने के लिए लंबे समय तक चलाना होता है और फिर इस्तेमाल करने से पहले उन्हें काफ़ी जल्दी निकाल दिया जाता है.

इसके बजाय, dm-verity अलग-अलग ब्लॉक की पुष्टि सिर्फ़ तब करती है, जब हर एक ऐक्सेस किया गया. मेमोरी में पढ़े जाने पर, ब्लॉक साथ-साथ हैश किया जाता है. हैश है फिर पेड़ की पुष्टि की. ब्लॉक पढ़ना बहुत महंगा है ऑपरेशन है, तो इस ब्लॉक-लेवल की पुष्टि की वजह से शुरू होने वाला इंतज़ार का समय तुलनात्मक रूप से नाममात्र.

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

ऐप्लिकेशन, नतीजे में मिलने वाले डेटा के बिना आगे बढ़ना चुन सकते हैं, जैसे कि ऐप्लिकेशन के मुख्य फ़ंक्शन के लिए वे नतीजे ज़रूरी नहीं हैं. हालांकि, अगर ऐप्लिकेशन, डेटा के बिना काम नहीं करता, तो वह काम नहीं करेगा.

फ़ॉरवर्ड करने से जुड़ी गड़बड़ी में सुधार

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

लागू करना

खास जानकारी

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

The Chromium Projects - वेरिफ़ाइड बूट की जानकारी देखें का इस्तेमाल करें.

हैश ट्री जनरेट करना

जैसा कि शुरुआती जानकारी में बताया गया है, हैश ट्री dm-verity का ज़रूरी हिस्सा है. कॉन्टेंट बनाने 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 हैश असाइन किया गया है. सिर्फ़ उन SHA256 हैश को जोड़ने पर लेयर 1 बनती है जिससे इमेज बहुत छोटी हो जाती है. लेयर 2 बनाई गई है और लेयर 1 के SHA256 हैश एक जैसे होते हैं.

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

हैश ट्री का साइज़ (और संबंधित डिस्क में बचा स्टोरेज) पुष्टि किए गए हिस्से का साइज़. हैश ट्री का साइज़ छोटा, अक्सर 30 एमबी से कम.

अगर किसी लेयर में कोई ऐसा ब्लॉक मौजूद है जो पूरी तरह से चालू नहीं है, हैश किए गए हैं, तो आपको इसे प्राप्त करने के लिए शून्य के साथ पैड करना चाहिए 4k की उम्मीद थी. इससे आपको यह जानने में मदद मिलती है कि हैश ट्री को हटाया नहीं गया है और का इस्तेमाल करने के बजाय खाली डेटा का इस्तेमाल करता है.

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

आपको याद दिला दें कि हैश ट्री बनाने के लिए सामान्य एल्गोरिदम यहां दिया गया है:

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

इससे एक हैश मिलता है, जो आपका रूट हैश होता है. यह और आपका नमक का इस्तेमाल आपकी dm-verity मैपिंग टेबल बनाते समय किया जाता है.

dm-verity मैपिंग टेबल बनाना

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

cryptsetup देखें वेरिटी टारगेट को मैप करने वाली टेबल के फ़ील्ड की पूरी जानकारी.

dm-verity टेबल पर हस्ताक्षर किया जा रहा है

टेबल सिग्नेचर बनाने के लिए, dm-verity टेबल पर हस्ताक्षर करें. पुष्टि करते समय पहले, टेबल सिग्नेचर की पुष्टि की जाती है. ऐसा, सुरक्षा कुंजी की मदद से किया जाता है एक तय जगह पर. कुंजियों को आमतौर पर डिवाइस बनाने वाली कंपनी का तय समयावधि में डिवाइसों पर अपने-आप शामिल होने के लिए सिस्टम बनाना स्थान.

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

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

टेबल सिग्नेचर को मेटाडेटा में शामिल करना

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

इसका पता लगाने के लिए, टेबल मेटाडेटा के हर सेट के साथ एक मैजिक नंबर जुड़ा होता है जिससे टेबल को पहचानने में मदद मिलती है. 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 बाइट
टेबल की लंबाई dm-verity टेबल की लंबाई बाइट में 4 बाइट
टेबल ऊपर बताई गई डीएम-वेरिटी टेबल टेबल की लंबाई बाइट
पैडिंग इस स्ट्रक्चर में 0-पैडेड है और इसकी लंबाई 32 हज़ार है 0

डीएम-वेरिटी को ऑप्टिमाइज़ किया जा रहा है

डीएम-वेरिटी का सबसे अच्छा परफ़ॉर्मेंस पाने के लिए आपको ये काम करने चाहिए:

  • कर्नेल में, ARMv7 और SHA-2 के लिए NEON SHA-2 चालू करें ARMv8 के लिए एक्सटेंशन.
  • आगे बढ़ने के लिए अलग-अलग तरीके से प्रयोग करें और PREVIOUS_cluster को देखें सेटिंग पर जाएं.