डिवाइस पहचानकर्ता

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

नई अनुमति आवश्यकताओं के लिए अधिक जानकारी TelephonyManager.java और Build.java के Javadoc पृष्ठों में पाई जा सकती है।

यह परिवर्तन निम्नलिखित API को प्रभावित करता है:

  • टेलीफ़ोनीमैनेजर#getDeviceId
  • टेलीफ़ोनीमैनेजर#getImei
  • टेलीफ़ोनीमैनेजर#getMeid
  • टेलीफ़ोनीमैनेजर#getSimSerialNumber
  • टेलीफ़ोनीमैनेजर#getSubscriberId
  • बिल्ड#गेटसीरियल

READ_PRIVILEGED_PHONE_STATE अनुमति के बिना वाहक ऐप्स तक पहुंच

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

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

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

इस समाधान को लागू करने के लिए, वाहकों को इन चरणों का पालन करना होगा:

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

कार्यान्वयन

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

अनुमति सूची के बारे में अधिक जानने के लिए, विशेषाधिकार प्राप्त अनुमति अनुमति सूची देखें।

प्रभावित एपीआई को लागू करने के लिए, ऐप को निम्नलिखित आवश्यकताओं में से एक को पूरा करना होगा:

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

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

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

सत्यापन और परीक्षण

संगतता परीक्षण सूट (सीटीएस) में वाहक विशेषाधिकारों, डिवाइस और प्रोफ़ाइल मालिकों वाले ऐप्स और उन ऐप्स के लिए अपेक्षित डिवाइस पहचानकर्ता पहुंच व्यवहार को सत्यापित करने के लिए परीक्षण शामिल हैं, जिनके पास डिवाइस पहचानकर्ताओं तक पहुंच नहीं होने की उम्मीद है।

निम्नलिखित सीटीएस परीक्षण इस सुविधा के लिए विशिष्ट हैं।

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

पूछे जाने वाले प्रश्न

किसी दिए गए (MCC, MNC) के लिए 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>

क्या कोई आधार कैरियर कॉन्फ़िग टेम्पलेट है जिसका मैं उपयोग कर सकता हूँ?

निम्नलिखित टेम्पलेट का उपयोग करें. इसे प्रासंगिक संपत्ति में जोड़ा जाना चाहिए।

<?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 वर्तमान में डाले गए सिम के आधार पर निर्धारित किया जाता है। इसका अर्थ यह है कि यदि वाहक

मल्टी-सिम उपकरणों पर, वाहक #1 के पास केवल सिम #1 के लिए एक्सेस विशेषाधिकार हैं और इसके विपरीत।

वाहक किसी ऐप के हस्ताक्षर प्रमाणपत्र को हैश में कैसे परिवर्तित करते हैं?

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

  1. toByteArray का उपयोग करके हस्ताक्षर प्रमाणपत्र के हस्ताक्षर को बाइट सरणी में बदलें।
  2. बाइट सरणी को बाइट[] प्रकार में हैश में बदलने के लिए 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 12345 और 54321 के मान के साथ आकार 2 की एक सरणी है, तो वाहक कॉन्फ़िगरेशन फ़ाइल में निम्नलिखित जोड़ें।

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