सुरक्षा

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 की ओर से मेमोरी ऐक्सेस करती हैं. जैसे, डीएमए की सुविधा वाले डिवाइस और ज़्यादा विशेषाधिकार वाली लेयर में चलने वाली सेवाएं. सिस्टम-ऑन-चिप (एसओसी) वेंडर को पीकेवीएम के साथ काम करने से पहले, ज़रूरी शर्तों का एक नया सेट पूरा करना होगा. ऐसा न होने पर, गोपनीय जानकारी को सुरक्षित नहीं रखा जा सकता.

इंटीग्रिटी, मेमोरी और कंप्यूटेशन में मौजूद डेटा पर लागू होती है. 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 के सुरक्षा मॉडल को बनाए रखने के लिए भरोसेमंद नहीं माना जाता.

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