डिवाइस आइडेंटिफ़ायर

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

अनुमति से जुड़ी नई ज़रूरी शर्तों के बारे में ज़्यादा जानकारी, TelephonyManager.java और Build.java के Javadoc पेजों पर मिल सकती है.

इस बदलाव का असर इन एपीआई पर पड़ता है:

  • TelephonyManager#getDeviceId
  • TelephonyManager#getImei
  • TelephonyManager#getMeid
  • TelephonyManager#getSimSerialNumber
  • TelephonyManager#getSubscriberId
  • Build#getSerial

मोबाइल और इंटरनेट सेवा देने वाली कंपनियों के ऐप्लिकेशन के लिए, READ_PRIVILEGED_PHONE_STATE अनुमति के बिना ऐक्सेस

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

विकल्प जानकारी सीमाएं
मोबाइल और इंटरनेट सेवा देने वाली कंपनी के लिए UICC के खास अधिकार Android प्लैटफ़ॉर्म, यूआईसीसी में सेव किए गए सर्टिफ़िकेट लोड करता है. साथ ही, इन सर्टिफ़िकेट से साइन किए गए ऐप्लिकेशन को खास तरीकों से कॉल करने की अनुमति देता है. लेगसी कैरियर के पास बड़ी संख्या में सिम कार्ड हैं, जिन्हें आसानी से अपडेट नहीं किया जा सकता. इसके अलावा, जिन मोबाइल और इंटरनेट सेवा देने वाली कंपनियों के पास नए सिम के लिए, लिखने का अधिकार नहीं है वे सिम में सर्टिफ़िकेट नहीं जोड़ सकतीं या अपडेट नहीं कर सकतीं. उदाहरण के लिए, एमवीएनओ, जिन्हें एमएनओ से सिम जारी किए गए हैं.
ओईएम की अनुमति वाले चैनलों की सूची OEM, OP_READ_DEVICE_IDENTIFIER का इस्तेमाल करके, मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन को डिवाइस के आइडेंटिफ़ायर दे सकते हैं. यह समाधान, मोबाइल और इंटरनेट सेवा देने वाली सभी कंपनियों के लिए काम नहीं करता.
टाइप ऐलोकेशन कोड (टीएसी) मैन्युफ़ैक्चरर और मॉडल की जानकारी दिखाने वाले टीएसी को दिखाने के लिए, Android 10 में शुरू किए गए getTypeAllocationCode तरीके का इस्तेमाल करें. किसी डिवाइस की पहचान करने के लिए, टीएसी में दी गई जानकारी काफ़ी नहीं है.
MSISDN मोबाइल और इंटरनेट सेवा देने वाली कंपनियां, अपने बैकएंड सिस्टम पर IMEI नंबर देखने के लिए, TelephonyManager में मौजूद फ़ोन नंबर (एमएसआईएसडीएन) का इस्तेमाल कर सकती हैं. इसके लिए, उन्हें PHONE अनुमति ग्रुप की ज़रूरत होगी. इसके लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनियों को ज़्यादा निवेश करना होगा. मोबाइल और इंटरनेट सेवा देने वाली जिन कंपनियों ने IMSI का इस्तेमाल करके अपनी नेटवर्क कुंजियों को मैप किया है उन्हें MSISDN पर स्विच करने के लिए, ज़रूरी तकनीकी संसाधनों की ज़रूरत होती है.

सभी मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन, डिवाइस आइडेंटिफ़ायर को ऐक्सेस कर सकते हैं. इसके लिए, वे CarrierConfig.xml फ़ाइल को अपडेट करके, उसमें मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन के साइनिंग सर्टिफ़िकेट का हैश डालते हैं. जब मोबाइल और इंटरनेट सेवा देने वाली कंपनी का ऐप्लिकेशन, संवेदनशील जानकारी पढ़ने के लिए किसी तरीके का इस्तेमाल करता है, तो प्लैटफ़ॉर्म CarrierConfig.xml फ़ाइल में ऐप्लिकेशन के साइनिंग सर्टिफ़िकेट के हैश (सर्टिफ़िकेट का SHA-1 या SHA-256 हस्ताक्षर) से मैच करने की कोशिश करता है. मैच मिलने पर, मांगी गई जानकारी दी जाती है. अगर कोई मैच नहीं मिलता है, तो सुरक्षा से जुड़ा एक अपवाद दिखता है.

इस समाधान को लागू करने के लिए, कैरियर को यह तरीका अपनाना होगा:

  1. मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन के हस्ताक्षर वाले सर्टिफ़िकेट के हैश की मदद से, CarrierConfig.xml को अपडेट करें और पैच सबमिट करें.
  2. OEM से अनुरोध करें कि वे अपने बिल्ड को QPR1+ (सुझाया गया) या इन ज़रूरी प्लैटफ़ॉर्म पैच के साथ अपडेट करें. साथ ही, ऊपर दिए गए पहले चरण में अपडेट की गई CarrierConfig.xml फ़ाइल वाले पैच को भी अपडेट करें.

लागू करना

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

अनुमति वाली सूची के बारे में ज़्यादा जानने के लिए, खास अनुमति वाली सूची लेख पढ़ें.

जिन एपीआई पर असर पड़ा है उन्हें इस्तेमाल करने के लिए, ऐप्लिकेशन को इनमें से कोई एक ज़रूरी शर्त पूरी करनी होगी:

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

इनमें से किसी भी ज़रूरी शर्त को पूरा न करने वाले ऐप्लिकेशन का व्यवहार इस तरह का होता है:

  • अगर ऐप्लिकेशन, Q से पहले के वर्शन को टारगेट कर रहा है और उसे READ_PHONE_STATE अनुमति नहीं दी गई है, तो SecurityException ट्रिगर हो जाता है. यह Q से पहले के वर्शन का मौजूदा व्यवहार है, क्योंकि इन एपीआई को ट्रिगर करने के लिए, यह अनुमति ज़रूरी है.
  • अगर ऐप्लिकेशन, Q से पहले के वर्शन को टारगेट कर रहा है और उसे READ_PHONE_STATE अनुमति मिली है, तो उसे सभी TelephonyManager API के लिए शून्य वैल्यू और Build#getSerial तरीके के लिए Build.UNKNOWN मिलती है.
  • अगर ऐप्लिकेशन, Android 10 या उसके बाद के वर्शन को टारगेट करता है और वह नई शर्तों में से किसी एक को भी पूरा नहीं करता है, तो उसे SecurityException मिलता है.

पुष्टि करना और जांच करना

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

यहां दिए गए सीटीएस टेस्ट, खास तौर पर इस सुविधा के लिए हैं.

cts-tradefed run cts -m CtsCarrierApiTestCases -t
    android.carrierapi.cts.CarrierApiTest

cts-tradefed run cts -m CtsTelephonyTestCases -t
    android.telephony.cts.TelephonyManagerTest

cts-tradefed run cts -m CtsTelephony3TestCases

cts-tradefed run cts -m CtsPermissionTestCases -t
    android.permission.cts.TelephonyManagerPermissionTest

cts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t
    com.android.cts.devicepolicy.DeviceOwnerTest#testDeviceOwnerCanGetDeviceIdentifiers

cts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t
    com.android.cts.devicepolicy.ManagedProfileTest#testProfileOwnerCanGetDeviceIdentifiers

cts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t
    com.android.cts.devicepolicy.ManagedProfileTest#testProfileOwnerCannotGetDeviceIdentifiersWithoutPermission

cts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t
    com.android.cts.devicepolicy.DeviceOwnerTest#testDeviceOwnerCannotGetDeviceIdentifiersWithoutPermission

अक्सर पूछे जाने वाले सवाल

किसी (एमसीसी, एमएनसी) के लिए, CarrierConfig.xml में कितने ऐप्लिकेशन को अनुमति दी जा सकती है?

कलेक्शन में शामिल सर्टिफ़िकेट हैश की संख्या पर कोई सीमा नहीं है.

किसी ऐप्लिकेशन को अनुमति वाली सूची में शामिल करने के लिए, मुझे CarrierConfig.xml में मौजूद कौनसे CarrierConfig पैरामीटर इस्तेमाल करने होंगे?

कॉन्फ़िगर किए जा रहे AOSP विकल्पों में से किसी एक के CarrierConfig.xml में, टॉप लेवल के कॉन्फ़िगरेशन आइटम का इस्तेमाल करें:

<string-array name="carrier_certificate_string_array" num="2">
    <item value="BF02262E5EF59FDD53E57059082F1A7914F284B"/>
    <item value="9F3868A3E1DD19A5311D511A60CF94D975A344B"/>
</string-array>

क्या कोई ऐसा बुनियादी CarrierConfig टेंप्लेट है जिसका इस्तेमाल किया जा सकता है?

नीचे दिए गए टेंप्लेट का इस्तेमाल करें. इसे काम की ऐसेट में जोड़ा जाना चाहिए.

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<carrier_config>
    <string-array name="carrier_certificate_string_array"
num="1">
        <item value="CERTIFICATE_HASH_HERE"/>
    </string-array>
</carrier_config>

क्या डिवाइस आइडेंटिफ़ायर ऐक्सेस करने के लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी का सिम डिवाइस में होना ज़रूरी है?

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

एक से ज़्यादा सिम वाले डिवाइसों पर, मोबाइल और इंटरनेट सेवा देने वाली कंपनी #1 के पास सिर्फ़ सिम #1 को ऐक्सेस करने की अनुमति होती है. इसी तरह, मोबाइल और इंटरनेट सेवा देने वाली कंपनी #2 के पास सिर्फ़ सिम #2 को ऐक्सेस करने की अनुमति होती है.

मोबाइल और इंटरनेट सेवा देने वाली कंपनियां, ऐप्लिकेशन के साइनिंग सर्टिफ़िकेट को हैश में कैसे बदलती हैं?

हस्ताक्षर करने के सर्टिफ़िकेट को CarrierConfig.xml में जोड़ने से पहले, उन्हें हैश में बदलने के लिए, यह तरीका अपनाएं:

  1. हस्ताक्षर करने वाले सर्टिफ़िकेट के हस्ताक्षर को बाइट कलेक्शन में बदलने के लिए, toByteArray का इस्तेमाल करें.
  2. बाइट कलेक्शन को बाइट[] टाइप में हैश में बदलने के लिए, MessageDigest का इस्तेमाल करें.
  3. हैश को byte[] से हेक्स स्ट्रिंग फ़ॉर्मैट में बदलें. उदाहरण के लिए, IccUtils.java देखें.

    List<String> certHashes = new ArrayList<>();
    PackageInfo pInfo; // Carrier app PackageInfo
    MessageDigest md =
    MessageDigest.getInstance("SHA-256");
    for (Signature signature : pInfo.signatures) {
        certHashes.add(bytesToHexString(md.digest(signature.toByteArray()));
    }
  4. अगर certHashes, 2 साइज़ का ऐरे है और उसकी वैल्यू 12345 और 54321 है, तो कैरियर कॉन्फ़िगरेशन फ़ाइल में ये जोड़ें.

    <string-array name="carrier_certificate_string_array" num="2">
        <item value="12345"/>
        <item value="54321"/>
    </string-array>