सुरक्षा

Android Virtualization Framework (AVF) में लेयर वाली सुरक्षा का इस्तेमाल किया जाता है. इससे pVM में किसी भी पेलोड को चलाने से रोका जा सकता है. इस सुरक्षा में हर लेयर, सुरक्षा से जुड़ी अतिरिक्त पाबंदियां लागू करती है. एवीएफ़ की सुरक्षा लेयर की सूची यहां दी गई है:

  • Android यह पक्का करता है कि pVM बनाने या उनकी जांच करने की अनुमति सिर्फ़ उन ऐप्लिकेशन को हो जिनके पास pVM की अनुमतियां हैं.

  • बूटलोडर – बूटलोडर यह पक्का करता है कि सिर्फ़ Google या डिवाइस बनाने वाली कंपनियों के हस्ताक्षर वाली pVM इमेज को बूट करने की अनुमति हो. साथ ही, यह Android Verified Boot की प्रक्रिया का पालन करता है. इस आर्किटेक्चर का मतलब है कि pVM चलाने वाले ऐप्लिकेशन, अपने कर्नल बंडल नहीं कर सकते.

  • pVM, pVM में चलने वाले पेलोड के लिए, SELinux जैसे सुरक्षा के कई लेयर उपलब्ध कराता है. डिफ़ेंस-इन-डेप्थ, डेटा को एक्ज़ीक्यूटेबल (neverallow execmem) के तौर पर मैप करने की अनुमति नहीं देता है. साथ ही, यह पक्का करता है कि W^X सभी फ़ाइल टाइप के लिए लागू हो.

सुरक्षा मॉडल

गोपनीयता, अखंडता, और उपलब्धता (सीआईए ट्रायड), एक ऐसा मॉडल बनाते हैं जिसे जानकारी को सुरक्षित रखने से जुड़ी नीतियां तय करने के लिए डिज़ाइन किया गया है:

  • गोपनीयता नियमों का एक ऐसा सेट है जो जानकारी के ऐक्सेस को सीमित करता है.
  • भरोसेमंद होना का मतलब है कि जानकारी भरोसेमंद और सटीक है.
  • उपलब्धता का मतलब है कि जानकारी को सिर्फ़ अनुमति वाली इकाइयां ही ऐक्सेस कर सकती हैं.

गोपनीयता और रखरखाव

गोपनीयता, pKVM हाइपरवाइज़र की ओर से लागू की गई मेमोरी आइसोलेशन प्रॉपर्टी से मिलती है. pKVM, अलग-अलग फ़िज़िकल मेमोरी पेजों के मेमोरी के मालिकाना हक को ट्रैक करता है. साथ ही, मालिकों के पेजों को शेयर करने के अनुरोधों को भी ट्रैक करता है. pKVM यह पक्का करता है कि सिर्फ़ ज़रूरी pVM (होस्ट और गेस्ट) के पास, स्टेज 2 पेज टेबल में मैप किया गया पेज हो. इन टेबल को हाइपरवाइज़र कंट्रोल करता है. इस आर्किटेक्चर में यह पक्का किया जाता है कि pVM के मालिकाना हक वाली मेमोरी का कॉन्टेंट तब तक निजी बना रहे, जब तक मालिक उसे किसी दूसरे pVM के साथ शेयर नहीं करता.

गोपनीयता बनाए रखने से जुड़ी पाबंदियां, सिस्टम में मौजूद उन सभी इकाइयों पर भी लागू होती हैं जो pVM की ओर से मेमोरी ऐक्सेस करती हैं. जैसे, डीएमए की सुविधा वाले डिवाइस और ज़्यादा विशेषाधिकार वाली लेयर में चलने वाली सेवाएँ. सिस्टम-ऑन-चिप (एसओसी) वेंडर को pKVM के साथ काम करने से पहले, ज़रूरी शर्तों का एक नया सेट पूरा करना होगा. ऐसा न होने पर, निजता बनाए रखने की सुविधा नहीं दी जा सकती.

डेटा का रखरखाव, मेमोरी और कंप्यूटेशन में मौजूद डेटा पर लागू होता है. pVM ये काम नहीं कर सकते:

  • एक-दूसरे की मेमोरी में बदलाव कर सकते हैं. इसके लिए, सहमति की ज़रूरत नहीं होती.
  • एक-दूसरे की सीपीयू स्थिति पर असर डालती हैं.

इन ज़रूरी शर्तों को हाइपरवाइज़र लागू करता है. हालांकि, वर्चुअल डेटा स्टोरेज में डेटा की अखंडता से जुड़ी समस्याएं भी आती हैं. इसके लिए, dm-verity या AuthFS जैसे अन्य समाधान लागू करने पड़ते हैं.

ये सिद्धांत, Linux की प्रोसेस आइसोलेशन सुविधा से अलग नहीं हैं. इसमें मेमोरी पेजों का ऐक्सेस, स्टेज 1 पेज टेबल से कंट्रोल किया जाता है. साथ ही, कर्नल प्रोसेस के बीच कॉन्टेक्स्ट-स्विच करता है. हालांकि, pKVM का EL2 हिस्सा इन प्रॉपर्टी को लागू करता है. इसमें पूरे Linux कर्नल की तुलना में, हमले की आशंका 1,000 गुना कम होती है. ऐसा इसलिए, क्योंकि इसमें पूरे Linux कर्नल की तुलना में कोड की लाइनें बहुत कम होती हैं. जैसे, 10 हज़ार बनाम 2 करोड़ लाइनें. इसलिए, यह उन इस्तेमाल के उदाहरणों के लिए ज़्यादा भरोसेमंद होता है जो प्रोसेस आइसोलेशन पर भरोसा करने के लिए बहुत संवेदनशील होते हैं.

इसका साइज़ छोटा होने की वजह से, pKVM की औपचारिक पुष्टि की जा सकती है. हम लगातार शैक्षणिक रिसर्च में मदद कर रहे हैं. इसका मकसद, pKVM के बाइनरी पर इन प्रॉपर्टी को औपचारिक तौर पर साबित करना है.

इस पेज के बाकी हिस्से में, pKVM के आस-पास मौजूद हर कॉम्पोनेंट की ओर से दी जाने वाली निजता और इंटिग्रिटी की गारंटी के बारे में बताया गया है.

हाइपरवाइज़र

pKVM, KVM पर आधारित एक हाइपरवाइज़र है. यह pVM और Android को एक-दूसरे से अलग, भरोसेमंद एक्ज़ीक्यूशन एनवायरमेंट में रखता है. ये प्रॉपर्टी, किसी भी pVM में समझौता होने पर लागू होती हैं. इनमें होस्ट भी शामिल है. AVF के साथ काम करने वाले अन्य हाइपरवाइज़र को भी इसी तरह की प्रॉपर्टी देनी होंगी.

  • pVM, किसी दूसरी इकाई (जैसे कि pVM या हाइपरवाइज़र) के पेज को तब तक ऐक्सेस नहीं कर सकता, जब तक पेज का मालिक उसे साफ़ तौर पर शेयर न करे. यह नियम, होस्ट pVM पर लागू होता है. साथ ही, यह सीपीयू और डीएमए, दोनों के ऐक्सेस पर लागू होता है.

  • pVM के इस्तेमाल किए गए पेज को होस्ट को वापस करने से पहले मिटा दिया जाता है. ऐसा तब होता है, जब pVM को बंद कर दिया जाता है.

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

  • SJTAG जैसे हार्डवेयर डिबगर के अटैच होने पर, pVM पहले से मिंट की गई कुंजियों को ऐक्सेस नहीं कर सकता.

  • अगर pVM फ़र्मवेयर, शुरुआती इमेज की पुष्टि नहीं कर पाता है, तो यह बूट नहीं होता.

  • अगर instance.img की इंटिग्रिटी से समझौता किया जाता है, तो pVM फ़र्मवेयर बूट नहीं होता.

  • DICE सर्टिफ़िकेट चेन और pVM इंस्टेंस को दिए गए कंपाउंड डिवाइस आइडेंटिफ़ायर (सीडीआई) सिर्फ़ उस इंस्टेंस से हासिल किए जा सकते हैं.

गेस्ट ओएस

Microdroid, pVM में चलने वाले ओएस का एक उदाहरण है. Microdroid में U-boot पर आधारित बूटलोडर, GKI, Android यूज़रस्पेस का सबसेट, और पेलोड लॉन्चर शामिल होता है. ये प्रॉपर्टी, किसी भी pVM में समझौता होने पर लागू होती हैं. इनमें होस्ट भी शामिल है. pVM में चल रहे वैकल्पिक ओएस में भी ऐसी ही प्रॉपर्टी होनी चाहिए.

  • अगर boot.img, super.img, vbmeta.img या vbmeta\_system.img की पुष्टि नहीं की जा सकती, तो Microdroid बूट नहीं होगा.

  • अगर APK की पुष्टि नहीं हो पाती है, तो Microdroid बूट नहीं होगा.

  • अगर APK अपडेट हो गया है, तब भी एक ही Microdroid इंस्टेंस बूट नहीं होगा.

  • अगर किसी भी APEX की पुष्टि नहीं हो पाती है, तो Microdroid बूट नहीं होगा.

  • अगर instance.img में बदलाव, गेस्ट pVM के बाहर किया जाता है, तो Microdroid बूट नहीं होगा. अगर बूट होता है, तो वह शुरुआती स्थिति में होगा.

  • Microdroid, बूट चेन की पुष्टि करता है.

  • गेस्ट pVM के साथ शेयर की गई डिस्क इमेज में बिना हस्ताक्षर किए गए किसी भी बदलाव की वजह से, pVM की ओर से I/O गड़बड़ी होती है.

  • किसी pVM इंस्टेंस को दिए गए DICE सर्टिफ़िकेट चेन और सीडीआई, सिर्फ़ उस इंस्टेंस से हासिल किए जा सकते हैं.

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

Android

ये ऐसी प्रॉपर्टी हैं जिन्हें Android, होस्ट के तौर पर मैनेज करता है. हालांकि, होस्ट के साथ समझौता होने पर ये प्रॉपर्टी काम नहीं करती हैं:

  • कोई मेहमान pVM, सीधे तौर पर दूसरे मेहमान pVM से इंटरैक्ट नहीं कर सकता. जैसे, vsock कनेक्शन बनाना.

  • सिर्फ़ होस्ट pVM में मौजूद VirtualizationService, pVM के साथ कम्यूनिकेशन चैनल बना सकता है.

  • सिर्फ़ वे ऐप्लिकेशन, pVM बनाने, उनका मालिकाना हक रखने या उनके साथ इंटरैक्ट करने की अनुमति का अनुरोध कर सकते हैं जिनमें प्लैटफ़ॉर्म की कुंजी से हस्ताक्षर किए गए हों.

  • होस्ट और pVM के बीच vsock कनेक्शन सेट अप करने के लिए इस्तेमाल किए गए आइडेंटिफ़ायर को कॉन्टेक्स्ट आइडेंटिफ़ायर (सीआईडी) कहा जाता है. होस्ट pVM के चालू होने पर, इस आइडेंटिफ़ायर का दोबारा इस्तेमाल नहीं किया जाता. उदाहरण के लिए, चालू pVM को किसी दूसरे pVM से नहीं बदला जा सकता.

उपलब्धता

pVM के संदर्भ में, उपलब्धता का मतलब है कि होस्ट, मेहमानों को ज़रूरत के मुताबिक संसाधन उपलब्ध कराता है, ताकि मेहमान वे टास्क पूरे कर सकें जिनके लिए उन्हें बनाया गया है.

होस्ट की ज़िम्मेदारियों में, pVM के वर्चुअल सीपीयू शेड्यूल करना शामिल है. KVM, टाइप-1 के पारंपरिक हाइपरवाइज़र (जैसे कि Xen) के उलट, वर्कलोड शेड्यूलिंग को होस्ट कर्नल को सौंपने का फ़ैसला करता है. आज के समय में शेड्यूलर का साइज़ और जटिलता को देखते हुए, डिज़ाइन से जुड़ा यह फ़ैसला, भरोसेमंद कंप्यूटिंग बेस (टीसीबी) के साइज़ को काफ़ी कम कर देता है. साथ ही, होस्ट को परफ़ॉर्मेंस को ऑप्टिमाइज़ करने के लिए, शेड्यूल करने से जुड़े ज़्यादा जानकारी वाले फ़ैसले लेने में मदद करता है. हालांकि, कोई दुर्भावनापूर्ण होस्ट, मेहमान के लिए कभी भी शेड्यूल न करने का विकल्प चुन सकता है.

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

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

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

सिक्योर बूट प्रोटोकॉल

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

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

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

अनलॉक किए गए डिवाइस

fastboot oem unlock से डिवाइस अनलॉक करने पर, उपयोगकर्ता का डेटा मिटा दिया जाता है. इस प्रोसेस से, उपयोगकर्ता के डेटा को बिना अनुमति के ऐक्सेस करने से बचाया जाता है. डिवाइस अनलॉक होने पर, pVM के प्राइवेट डेटा को भी अमान्य कर दिया जाता है.

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

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