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

Android 10 में, डिवाइस आइडेंटिफ़ायर की अनुमतियों में बदलाव किया गया है. अब सभी डिवाइस आइडेंटिफ़ायर, READ_PRIVILEGED_PHONE_STATE अनुमति से सुरक्षित हैं. Android 10 से पहले, डिवाइस के खास आइडेंटिफ़ायर (IMEI/MEID, IMSI, सिम, और बिल्ड का सीरियल नंबर) को 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 अनुमति पाने की ज़रूरी शर्तें पूरी नहीं करते हैं वे नीचे दी गई टेबल में से कोई एक विकल्प लागू कर सकते हैं.

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

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

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

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

लागू करना

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

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

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

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

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

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

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

Compatibility Test Suite (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. बाइट ऐरे को byte[] टाइप में हैश में बदलने के लिए, MessageDigest का इस्तेमाल करें.
  3. बाइट[] से हैश को हेक्स स्ट्रिंग फ़ॉर्मैट में बदलें. उदाहरण के लिए, 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>