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

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

विकल्प ब्यौरा सीमाएं
UICC के लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी के खास अधिकार Android प्लैटफ़ॉर्म, UICC पर सेव किए गए सर्टिफ़िकेट लोड करता है. साथ ही, इन सर्टिफ़िकेट से साइन किए गए ऐप्लिकेशन को खास तरीकों से कॉल करने की अनुमति देता है. लेगसी कैरियर के पास बड़ी संख्या में ऐसे सिम कार्ड हैं जो पहले से इस्तेमाल किए जा रहे हैं. इन्हें आसानी से अपडेट नहीं किया जा सकता. इसके अलावा, जिन मोबाइल और इंटरनेट सेवा देने वाली कंपनियों के पास नए सिम कार्ड बनाने का अधिकार नहीं है वे सिम कार्ड में सर्टिफ़िकेट नहीं जोड़ सकतीं या उन्हें अपडेट नहीं कर सकतीं. उदाहरण के लिए, जिन MVNO के पास MNO से जारी किए गए सिम कार्ड हैं वे ऐसा नहीं कर सकतीं.
ओईएम की अनुमति वाली सूची OEM, 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 की अनुमति उन ऐप्लिकेशन को दी जा सके जिन्हें डिवाइस आइडेंटिफ़ायर ऐक्सेस करने की ज़रूरत है.

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

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

  • अगर ऐप्लिकेशन, पहले से लोड किया गया विशेषाधिकार वाला ऐप्लिकेशन है, तो उसे 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>