डेवलपर के लिए सेटिंग और टूल को सुरक्षित करना

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

  • पहली बार बूट करने से पहले, डिफ़ॉल्ट पाबंदियां तय करना.
  • क्रिप्टो टोकन की मदद से, डेवलपर को सुरक्षित तरीके से अनुमति देना.
  • किसी डेवलपर की पुष्टि हो जाने और उसे अनुमति मिल जाने के बाद, पाबंदियों में बदलाव करना.

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

शब्दावली

शब्दावली के अलावा, इस पेज पर इन शब्दों का इस्तेमाल किया गया है:

  • JSON वेब सिग्नेचर (JWS), जिसे RFC 7515 में तय किया गया है
  • नैशनल इंस्टिट्यूट ऑफ़ स्टैंडर्ड्स ऐंड टेक्नोलॉजी (एनआईएसटी)

डिज़ाइन

ओईएम, JSON वेब सिग्नेचर (JWS) टोकन (RFC7515) की मदद से, डेवलपर को अनुमति दे सकते हैं. रेफ़रंस के तौर पर लागू करने के तरीके में, ऐक्सेस टोकन ओईएम जारी करते हैं और इनका इस्तेमाल, पाबंदी को कंट्रोल करने वाला ऐप्लिकेशन करता है. ऐक्सेस टोकन, रीप्ले हमलों और नकली टोकन से बचाने के लिए डिज़ाइन किए गए हैं.

पहली इमेज. डिज़ाइन

इंटिग्रेशन और कॉन्फ़िगरेशन

ओईएम को पहली बार बूट करने पर, डिफ़ॉल्ट पाबंदियां तय करनी होंगी. ओईएम, AOSP फ़्रेमवर्क में डिफ़ॉल्ट सेटिंग को बदलने के लिए, कई स्टैटिक रिसॉर्स ओवरले का इस्तेमाल करते हैं.

हेडलेस सिस्टम उपयोगकर्ता के लिए, डिफ़ॉल्ट पाबंदियों को frameworks/base/core/res/res/values/config.xml में मौजूद config_defaultFirstUserRestrictions स्ट्रिंग की मदद से कॉन्फ़िगर किया जा सकता है. उदाहरण के लिए:

<!-- User restrictions set when the first user is created.
         Note: Also update appropriate overlay files. -->
    <string-array translatable="false" name="config_defaultFirstUserRestrictions">
        <item>no_debugging_features</item>
        <item>no_install_unknown_sources</item>
        <item>no_install_unknown_sources_globally</item>
    </string-array>

ड्राइवर, पैसेंजर, और गेस्ट के लिए, डिफ़ॉल्ट पाबंदियों को frameworks/base/core/res/res/xml/config_user_types.xml में कॉन्फ़िगर किया जा सकता है. ओईएम, हर तरह के उपयोगकर्ता के लिए डिफ़ॉल्ट पाबंदियां सेट करने के लिए, इन स्ट्रिंग को ओवरले कर सकते हैं. उदाहरण के लिए:

<user-types>
    <full-type name="android.os.usertype.full.SECONDARY" >
        <default-restrictions
            no_debugging_features="true"
            no_install_unknown_sources="true"/>
    </full-type>
    <full-type name="android.os.usertype.full.GUEST" >
        <default-restrictions
            no_debugging_features="true"
            no_install_unknown_sources="true"/>
    </full-type>
</user-types>

बिल्ड नंबर की प्राथमिकता को कंट्रोल करने वाला टूल

AAOS में, सेटिंग में बिल्ड नंबर की प्राथमिकता वाली लाइन के साथ उपयोगकर्ता के इंटरैक्शन को BuildNumberPreferenceController.java मैनेज करता है. यह फ़ाइल, packages/apps/Car/Settings/src/com/android/car/settings/system/BuildNumberPreferenceController.java में मौजूद होती है.

जब no_debugging_features (UserManager.DISALLOW_DEBUGGING_FEATURES) उपयोगकर्ता की पाबंदी सेट की जाती है, तब BuildNumberPreferenceController, प्रोडक्शन (user) बिल्ड पर टैप करने पर, डेवलपर के काउंटडाउन को दबा देता है:

@Override
protected boolean handlePreferenceClicked(Preference preference) {
    if (DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(getContext())) {
        return true;
    }

    // Enforce restriction on production (user) builds
    if (Build.IS_USER && mUserManager.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES)) {
        showToast(R.string.dev_access_blocked_toast);
        return true;
    }

    mDevHitCountdown--;
    if (mDevHitCountdown == 0) {
        DevelopmentSettingsUtil.setDevelopmentSettingsEnabled(getContext(), true);
        showToast(R.string.show_dev_on);
    }
    return true;
}

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

डीबग करने की पाबंदी को कंट्रोल करने वाला टूल

डीबग करने की पाबंदी को कंट्रोल करने वाले टूल (डीआरसी) को, AOSP में packages/apps/Car/DebuggingRestrictionController पर रेफ़रंस के तौर पर लागू करने के तरीके के तौर पर उपलब्ध कराया गया है.

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

डीआरसी को रेफ़रंस के तौर पर लागू करने के तरीके में, दो मुख्य कॉम्पोनेंट शामिल हैं:

  • वाहन में मौजूद डीआरसी क्लाइंट ऐप्लिकेशन (app/): हेड यूनिट पर, खास अधिकारों वाला सिस्टम ऐप्लिकेशन (जिसके पास MANAGE_USERS की अनुमति होती है). यह ऐप्लिकेशन, डेवलपर की पुष्टि करता है, X.509 सर्टिफ़िकेट के सिग्नेचर, होस्टनेम, नॉनस, और आने वाले JWS टोकन की समयसीमा खत्म होने की तारीख की पुष्टि करता है. साथ ही, UserManager का इस्तेमाल करके, no_debugging_features की पाबंदी को डाइनैमिक तरीके से टॉगल करता है.
  • क्लाउड टोकन जारी करने वाला टूल (server/): बैकएंड वेब सेवा (जिसे Firebase Cloud Functions के तौर पर डिप्लॉय किया जा सकता है). यह सेवा, डेवलपर की क्रेडेंशियल की पुष्टि करती है और क्रिप्टोग्राफ़िक तौर पर साइन किए गए RS256 JWS ऐक्सेस टोकन जारी करती है. इनकी समयसीमा खत्म होने की तारीख तय होती है.

सेटअप के पूरे निर्देश, सर्टिफ़िकेट जनरेट करने के टूल, और डिप्लॉयमेंट के चरणों के लिए, डीबग करने की पाबंदी को कंट्रोल करने वाले टूल को इंटिग्रेट करने की गाइड देखें.

जांच करना

Google का सुझाव है कि ओईएम, रेफ़रंस के तौर पर लागू करने के तरीके से शुरुआत करें और फिर उसमें बदलाव करें.

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