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

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

नई अनुमति आवश्यकताओं के लिए अधिक जानकारी टेलीफोनी मैनजर.जवा और बिल्ड.वावा के लिए जावदोक पृष्ठों में पाई जा सकती है।

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

  • TelephonyManager # getDeviceId
  • TelephonyManager # getImei
  • TelephonyManager # getMeid
  • TelephonyManager # getSimSerialNumber
  • TelephonyManager # getSubscriberId
  • # GetSerial बनाएँ

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

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

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

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

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

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

कार्यान्वयन

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

श्वेत-सूचीकरण के बारे में अधिक जानने के लिए, प्रिविलेज्ड परमिशन व्हाइटलिस्टिंग देखें।

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

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

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

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

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

किसी दिए गए (MCC, MNC) के लिए CarrierConfig.xml में कितने ऐप CarrierConfig.xml किए जा सकते हैं?

सरणी में शामिल प्रमाणपत्र हैश की संख्या की कोई सीमा नहीं है।

कौन सा CarrierConfig मानकों में CarrierConfig.xml मैं एप्लिकेशन के लिए उपयोग करने के लिए सजग किए जाने की जरूरत है?

आपके द्वारा कॉन्फ़िगर किए जा रहे 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 का उपयोग किया जाता है। इसका मतलब यह है कि अगर वाहक का सिम डालने के दौरान वाहक X का ऐप एक्सेस विशेषाधिकारों को प्राप्त करने की कोशिश करता है, तो डिवाइस हैश के लिए मैच नहीं ढूंढेगा और सुरक्षा अपवाद देता है।

मल्टी-सिम डिवाइस पर, वाहक # 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 का एक सरणी है, तो वाहक कॉन्फ़िगरेशन फ़ाइल में निम्न जोड़ें।

    0 ए 6647 सी 260