रीबूट होने पर फिर से शुरू करना

Android 11 में, ओटीए अपडेट A/B अपडेट या वर्चुअल A/B अपडेट के तरीकों का इस्तेमाल करके लागू किए जा सकते हैं. इसके लिए, RecoverySystem क्लास के तरीकों का इस्तेमाल किया जाता है. ओटीए अपडेट लागू करने के लिए डिवाइस रीबूट होने के बाद, डिवाइस को फिर से चालू करने पर (आरओआर) सुविधा, डिवाइस के क्रेडेंशियल एन्क्रिप्टेड (सीई) स्टोरेज को अनलॉक कर देती है.

पार्टनर इस प्रोसेस को ओटीए सिस्टम की सुविधा के साथ जोड़ सकते हैं. यह सुविधा, Android 11 में डिवाइस के खाली होने पर अपडेट लागू करती है. हालांकि, Android 12 में पार्टनर को ओटीए सिस्टम की किसी अन्य सुविधा की ज़रूरत नहीं है. आरओआर प्रोसेस से, उपयोगकर्ताओं को ज़्यादा सुरक्षा और सुविधा मिलती है. ऐसा इसलिए, क्योंकि डिवाइस के इस्तेमाल में न होने के दौरान अपडेट किए जा सकते हैं. वहीं, Android 12 के मल्टी-क्लाइंट और सर्वर-आधारित अपडेट की सुविधाओं से, डिवाइस के हार्डवेयर लेवल पर सुरक्षा मिलती है.

Android 11 में आरओआर की सुविधा इस्तेमाल करने के लिए, आपको android.hardware.reboot_escrow सुविधा के लिए डिवाइस की अनुमति देनी होगी. हालांकि, Android 12 और उसके बाद के वर्शन में, सर्वर पर आधारित आरओआर की सुविधा चालू करने के लिए, आपको ऐसा करने की ज़रूरत नहीं है. ऐसा इसलिए, क्योंकि ये वर्शन एचएएल का इस्तेमाल नहीं करते.

बैकग्राउंड

Android 7 से, Android में डायरेक्ट बूट की सुविधा काम करती है. इसकी मदद से, उपयोगकर्ता के सीई स्टोरेज को अनलॉक करने से पहले ही, डिवाइस पर ऐप्लिकेशन शुरू हो जाते हैं. डायरेक्ट बूट की सुविधा लागू करने से, उपयोगकर्ताओं को बेहतर अनुभव मिला. इससे, डिवाइस के बूट होने के बाद, लॉक स्क्रीन पर मौजूद जानकारी वाले फ़ैक्टर (एलएसकेएफ़) को डालने से पहले, उन्हें बेहतर अनुभव मिला.

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

खतरे का मॉडल

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

खास तौर पर, सीई स्टोरेज को हमलावर के पास मौजूद डिवाइस से नहीं पढ़ा जा सकता. साथ ही, हमलावर के पास ये सुविधाएं और सीमाएं होनी चाहिए:

सुविधाएं

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

सीमाएं

  • छेड़छाड़ से सुरक्षित हार्डवेयर (उदाहरण के लिए, Titan M) के काम करने के तरीके में बदलाव नहीं किया जा सकता.
  • लाइव डिवाइस की रैम को पढ़ा नहीं जा सका.
  • उपयोगकर्ता के क्रेडेंशियल (पिन, पैटर्न, पासवर्ड) का अनुमान न लगा सके या उन्हें किसी और तरीके से डालने के लिए मजबूर न कर सके.

समाधान

Android 12 में मौजूद आरओआर अपडेट सिस्टम, डिवाइस पर मौजूद पासवर्ड और पिन को सुरक्षित रखता है. यह सिस्टम, डिवाइस पर मौजूद पासवर्ड और पिन को कभी भी Google के सर्वर पर नहीं भेजता या सेव नहीं करता. यहां उस प्रोसेस के बारे में खास जानकारी दी गई है जिससे यह पक्का किया जाता है कि दिए गए सुरक्षा लेवल, हार्डवेयर पर आधारित डिवाइस-लेवल के RoR सिस्टम से मिलते-जुलते हों:

  • Android, डिवाइस पर सेव किए गए डेटा को क्रिप्टोग्राफ़िक तरीके से सुरक्षित करता है.
  • सारा डेटा, ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट (टीईई) में सेव की गई कुंजियों से सुरक्षित होता है.
  • टीईई सिर्फ़ तब कुंजियां जारी करता है, जब चल रहे ऑपरेटिंग सिस्टम की क्रिप्टोग्राफ़िक पुष्टि (वेरिफ़ाइड बूट) हो जाती है.
  • Google के सर्वर पर चलने वाली RoR सेवा, सीई डेटा को सुरक्षित रखने के लिए एक गुप्त पासकोड सेव करती है. इस पासकोड को सिर्फ़ कुछ समय के लिए वापस लाया जा सकता है. यह सुविधा, Android नेटवर्क पर काम करती है.
  • डिवाइस को अनलॉक करने और सीई स्टोरेज को डिक्रिप्ट करने के लिए, क्रिप्टोग्राफ़िक कुंजी का इस्तेमाल किया जाता है. यह कुंजी, उपयोगकर्ता के पिन से सुरक्षित होती है.
    • रात भर डिवाइस को रीबूट करने के लिए शेड्यूल करने पर, Android उपयोगकर्ता को अपना पिन डालने के लिए कहता है. इसके बाद, वह सिंथेटिक पासवर्ड (एसपी) कैलकुलेट करता है.
    • इसके बाद, यह एसपी को दो बार एन्क्रिप्ट करता है: एक बार रैम में सेव की गई कुंजी K_s से और फिर TEE में सेव की गई कुंजी K_k से.
    • दो बार एन्क्रिप्ट किया गया एसपी, डिस्क पर सेव किया जाता है और एसपी, रैम से मिट जाता है. दोनों कुंजियां, हाल ही में जनरेट की गई हैं और इनका इस्तेमाल सिर्फ़ एक बार रीबूट करने के लिए किया जाता है.
  • रीबूट करने के समय, Android K_s को सर्वर को सौंप देता है. K_k वाली रसीद, डिस्क पर सेव करने से पहले एन्क्रिप्ट हो जाती है.
  • रीबूट होने के बाद, Android K_k का इस्तेमाल करके रसीद को डिक्रिप्ट करता है. इसके बाद, K_s को वापस पाने के लिए, उसे सर्वर पर भेजता है.
    • K_k और K_s का इस्तेमाल, डिस्क पर सेव किए गए एसपी को डिक्रिप्ट करने के लिए किया जाता है.
    • Android, CE स्टोरेज को अनलॉक करने और सामान्य ऐप्लिकेशन को स्टार्ट करने की अनुमति देने के लिए, SP का इस्तेमाल करता है.
    • K_k और K_s को खारिज कर दिया जाता है.

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

सिम पिन फिर से चलाना

कुछ खास स्थितियों में, सिम कार्ड के पिन कोड की पुष्टि कैश मेमोरी से की जाती है. इसे सिम-पिन रीप्ले कहते हैं.

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

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

  • सिम को हटा दिया गया है या रीसेट कर दिया गया है.
  • उपयोगकर्ता, पिन को बंद कर देता है.
  • RoR के अलावा किसी और वजह से रीबूट हुआ है.

आरओआर की वजह से रीबूट होने के बाद, सेव किए गए सिम पिन का इस्तेमाल सिर्फ़ एक बार किया जा सकता है. साथ ही, इसे सिर्फ़ 20 सेकंड के लिए इस्तेमाल किया जा सकता है. हालांकि, ऐसा सिर्फ़ तब किया जा सकता है, जब सिम कार्ड की जानकारी मेल खाती हो. स्टोर किया गया सिम पिन, TelephonyManager ऐप्लिकेशन में ही रहता है. साथ ही, इसे बाहरी मॉड्यूल से वापस नहीं पाया जा सकता.

लागू करने के दिशा-निर्देश

Android 12 में, मल्टी-क्लाइंट और सर्वर-आधारित RoR फ़ंक्शन, पार्टनर को ओटीए अपडेट पुश करते समय कम लोड देते हैं. ज़रूरी अपडेट, डिवाइस के इस्तेमाल में न होने के दौरान किए जा सकते हैं. जैसे, डिवाइस के बंद रहने के तय समय के दौरान.

इस तरह के समय के दौरान, ओटीए अपडेट से उपयोगकर्ताओं को परेशानी न हो, यह पक्का करने के लिए, लाइट उत्सर्जन को कम करने के लिए डार्क मोड का इस्तेमाल करें. ऐसा करने के लिए, डिवाइस के बूटलोडर में स्ट्रिंग reason unattended खोजें. अगर unattended true है, तो डिवाइस को डार्क मोड में डालें. ध्यान दें कि आवाज़ और रोशनी के उत्सर्जन को कम करना, हर OEM की ज़िम्मेदारी है.

अगर आपको Android 12 पर अपग्रेड करना है या Android 12 वाले डिवाइस लॉन्च करने हैं, तो आरओआर की नई सुविधा को लागू करने के लिए आपको कुछ भी करने की ज़रूरत नहीं है.

मल्टी-क्लाइंट फ़्लो में एक नया कॉल, isPreparedForUnattendedUpdate है, जो यहां दिखाया गया है:

@RequiresPermission(anyOf = {android.Manifest.permission.RECOVERY,
            android.Manifest.permission.REBOOT})
public static boolean isPreparedForUnattendedUpdate(@NonNull Context context)

आपको इसे लागू करने की ज़रूरत नहीं है, क्योंकि Android 12 के बाद से एचएएल का इस्तेमाल नहीं किया जा सकता.

TelephonyManager

Android 12 में रीबूट होने पर, ओटीए क्लाइंट TelephonyManager सिस्टम एपीआई को कॉल करता है. यह एपीआई, कैश मेमोरी में सेव किए गए सभी पिन कोड को AVAILABLE स्टेटस से REBOOT_READY स्टेटस में ले जाता है. TelephonyManager सिस्टम एपीआई को, REBOOT मेनिफ़ेस्ट की मौजूदा अनुमति से सुरक्षित किया जाता है.

 /**
    * The unattended reboot was prepared successfully.
    * @hide
    */
   @SystemApi
   public static final int PREPARE_UNATTENDED_REBOOT_SUCCESS = 0;

   /**
    * The unattended reboot was prepared, but the user will need to manually
    * enter the PIN code of at least one SIM card present in the device.
    * @hide
    */
   @SystemApi
   public static final int PREPARE_UNATTENDED_REBOOT_PIN_REQUIRED = 1;

   /**
    * The unattended reboot was not prepared due to generic error.
    * @hide
    */
   @SystemApi
   public static final int PREPARE_UNATTENDED_REBOOT_ERROR = 2;

   /** @hide */
   @Retention(RetentionPolicy.SOURCE)
   @IntDef(prefix = {"PREPARE_UNATTENDED_REBOOT_"},
           value = {
                   PREPARE_UNATTENDED_REBOOT_SUCCESS,
                   PREPARE_UNATTENDED_REBOOT_PIN_REQUIRED,
                   PREPARE_UNATTENDED_REBOOT_ERROR
           })
   public @interface PrepareUnattendedRebootResult {}

   /**
    * Prepare TelephonyManager for an unattended reboot. The reboot is
    * required to be done shortly after the API is invoked.
    *
    * Requires system privileges.
    *
    * <p>Requires Permission:
    *   {@link android.Manifest.permission#REBOOT}
    *
    * @return {@link #PREPARE_UNATTENDED_REBOOT_SUCCESS} in case of success.
    * {@link #PREPARE_UNATTENDED_REBOOT_PIN_REQUIRED} if the device contains
    * at least one SIM card for which the user needs to manually enter the PIN
    * code after the reboot. {@link #PREPARE_UNATTENDED_REBOOT_ERROR} in case
    * of error.
    * @hide
    */
   @SystemApi
   @RequiresPermission(android.Manifest.permission.REBOOT)
   @PrepareUnattendedRebootResult
   public int prepareForUnattendedReboot()

TelephonyManager सिस्टम एपीआई का इस्तेमाल, खास सुविधाओं वाले APK करते हैं.

टेस्ट करना

नए एपीआई की जांच करने के लिए, यह निर्देश चलाएं:

    adb shell cmd phone unattended-reboot

यह निर्देश सिर्फ़ तब काम करता है, जब शेल रूट (adb root) के तौर पर चल रहा हो.

सिर्फ़ Android 11 के लिए

इस पेज का बाकी हिस्सा, Android 11 पर लागू होता है.

जुलाई 2020 तक, RoR HAL को लागू करने के तरीके दो कैटगरी में आते हैं:

  1. अगर SoC हार्डवेयर, रीबूट के दौरान भी रैम में डेटा सेव रखने की सुविधा देता है, तो OEM, AOSP (डिफ़ॉल्ट रैम एस्क्रो) में डिफ़ॉल्ट तौर पर लागू होने की सुविधा का इस्तेमाल कर सकते हैं.
  2. अगर डिवाइस का हार्डवेयर या SoC, सुरक्षित हार्डवेयर एन्क्लेव (अपनी रैम और रोम वाला एक अलग सिक्योरिटी कोप्रोसेसर) के साथ काम करता है, तो उसे ये काम भी करने होंगे:
    • मुख्य सीपीयू के रीबूट का पता लगाने में सक्षम हो.
    • हार्डवेयर टाइमर सोर्स होना चाहिए, जो रीबूट के बाद भी काम करता रहे. इसका मतलब है कि एन्क्लेव को रीबूट का पता लगाना चाहिए और रीबूट से पहले सेट किए गए टाइमर की समयसीमा खत्म करनी चाहिए.
    • एन्क्लेव के रैम/रोम में, एस्क्रो की गई कुंजी को इस तरह से सेव करने की सुविधा हो कि उसे ऑफ़लाइन अटैक से वापस नहीं पाया जा सके. यह RoR पासकोड को इस तरह से सेव करना चाहिए कि अंदरूनी लोग या हमलावर उसे वापस न पा सकें.

डिफ़ॉल्ट तौर पर, आरएएम को एस्क्रो में रखने की सुविधा

AOSP में, रैम में डेटा सेव रखने की सुविधा का इस्तेमाल करके RoR HAL लागू किया गया है. यह सुविधा काम करे, इसके लिए OEM को यह पक्का करना होगा कि उनके SoC, रीबूट के दौरान भी रैम में डेटा सेव रखने की सुविधा के साथ काम करते हों. कुछ SoC, रीबूट के दौरान रैम कॉन्टेंट को सेव नहीं कर पाते. इसलिए, OEM को इस डिफ़ॉल्ट एचएएल को चालू करने से पहले, अपने SoC पार्टनर से सलाह लेने का सुझाव दिया जाता है. इसके लिए, नीचे दिए गए सेक्शन में कैननिकल रेफ़रंस दिया गया है.

RoR का इस्तेमाल करके ओटीए अपडेट का फ़्लो

फ़ोन पर मौजूद ओटीए क्लाइंट ऐप्लिकेशन के पास, Manifest.permission.REBOOT और Manifest.permission.RECOVERY अनुमतियां होनी चाहिए, ताकि आरओआर को लागू करने के लिए ज़रूरी तरीकों को कॉल किया जा सके. ज़रूरी शर्तें पूरी करने के बाद, अपडेट का फ़्लो इस तरह से होता है:

  1. ओटीए क्लाइंट ऐप्लिकेशन, अपडेट डाउनलोड करता है.
  2. ओटीए क्लाइंट ऐप्लिकेशन, RecoverySystem#prepareForUnattendedUpdate को कॉल करता है. इससे, उपयोगकर्ता को अगली बार अनलॉक करते समय, स्क्रीन लॉक पर पिन, पैटर्न या पासवर्ड डालने के लिए कहा जाता है.
  3. उपयोगकर्ता लॉकस्क्रीन पर जाकर डिवाइस को अनलॉक करता है और डिवाइस, अपडेट लागू करने के लिए तैयार हो जाता है.
  4. ओटीए क्लाइंट ऐप्लिकेशन, RecoverySystem#rebootAndApply को कॉल करता है, जिससे डिवाइस तुरंत रीबूट हो जाता है.

इस प्रोसेस के आखिर में, डिवाइस रीबूट हो जाता है और आरओआर (रोल-ऑन-रिबूट) प्रोसेस, क्रेडेंशियल एन्क्रिप्टेड (सीई) स्टोरेज को अनलॉक कर देती है. ऐप्लिकेशन के लिए, यह सामान्य उपयोगकर्ता अनलॉक की तरह दिखता है. इसलिए, उन्हें वे सभी सिग्नल मिलते हैं जो आम तौर पर मिलते हैं. जैसे, ACTION_LOCKED_BOOT_COMPLETED और ACTION_BOOT_COMPLETED.

प्रॉडक्ट कॉन्फ़िगरेशन में बदलाव करना

Android 11 में RoR सुविधा के साथ काम करने वाले प्रॉडक्ट के तौर पर मार्क किए गए प्रॉडक्ट में, RebootEscrow HAL को लागू करना ज़रूरी है. साथ ही, उसमें सुविधा मार्कर एक्सएमएल फ़ाइल भी शामिल होनी चाहिए. डिफ़ॉल्ट तौर पर लागू होने वाला तरीका, उन डिवाइसों पर बेहतर तरीके से काम करता है जिनमें वॉर्म रीबूट (जब रीबूट के दौरान DRAM की पावर चालू रहती है) का इस्तेमाल किया जाता है.

रीबूट एस्क्रो सुविधा का मार्कर

फ़ीचर मार्कर भी मौजूद होना चाहिए:

PRODUCT_COPY_FILES += \
    frameworks/native/data/etc/android.hardware.reboot_escrow.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.reboot_escrow.xml

डिफ़ॉल्ट रीबूट एस्क्रो एचएएल लागू करना

डिफ़ॉल्ट तरीके का इस्तेमाल करने के लिए, आपको 65,536 (0x10,000) बाइट्स रिज़र्व करने होंगे. इन बाइट को कभी भी नॉन-वोलिटाइल स्टोरेज में न लिखें, ताकि सुरक्षा से जुड़ी प्रॉपर्टी बनी रहें.

Linux कर्नेल डिवाइस ट्री में हुए बदलाव

Linux kernel के डिवाइस ट्री में, आपको pmem क्षेत्र के लिए मेमोरी रिज़र्व करनी होगी. यहां दिए गए उदाहरण में, 0x50000000 को रिज़र्व किया जा रहा है:

  reserved-memory {
    my_reservation@0x50000000 {
      no-map;
      reg = <0x50000000 0x10000>;
    }
  }

  reboot_escrow@0 {
    compatible = "pmem-region";
    reg = <0x50000000 0x10000>;
  };

पुष्टि करें कि आपके पास ब्लॉक डायरेक्ट्री में /dev/block/pmem0 (जैसे, pmem1 या pmem2) जैसा नाम वाला नया डिवाइस है.

Device.mk में बदलाव

मान लें कि पिछले चरण में जोड़े गए आपके नए डिवाइस का नाम pmem0 है. आपको यह पक्का करना होगा कि vendor/<oem>/<product>/device.mk में ये नई एंट्री जोड़ी गई हों:

# Resume on Reboot support
PRODUCT_PROPERTY_OVERRIDES += \
    ro.rebootescrow.device=/dev/block/pmem0
PRODUCT_PACKAGES += \
    android.hardware.rebootescrow-service.default
SELinux के नियम

डिवाइस के file_contexts में ये नई एंट्री जोड़ें:

/dev/block/pmem0  u:object_r:rebootescrow_device:s0
/vendor/bin/hw/android\.hardware\.rebootescrow-service\.default  u:object_r:hal_rebootescrow_default_exec:s0