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

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 अनुमति पाने की ज़रूरी शर्तें पूरी नहीं करते हैं, वे नीचे दी गई टेबल में से कोई एक विकल्प लागू कर सकते हैं.

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

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

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

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

लागू करना

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

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

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

  • अगर ऐप्लिकेशन, पहले से लोड किया गया विशेषाधिकार वाला ऐप्लिकेशन है, तो उसे READ_PRIVILEGED_PHONE_STATE अनुमति की ज़रूरत होगी. यह अनुमति, AndroidManifest.xml में दी गई है. ऐप्लिकेशन को इस खास अनुमति के लिए, अनुमति वाली सूची में शामिल करना भी ज़रूरी है.
  • 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>