ডিভাইস শনাক্তকারী

অ্যান্ড্রয়েড ১০ ডিভাইস শনাক্তকারীদের জন্য অনুমতি পরিবর্তন করে যাতে সমস্ত ডিভাইস শনাক্তকারী এখন READ_PRIVILEGED_PHONE_STATE অনুমতি দ্বারা সুরক্ষিত থাকে। অ্যান্ড্রয়েড ১০ এর আগে, স্থায়ী ডিভাইস শনাক্তকারী (IMEI/MEID, IMSI, SIM, এবং বিল্ড সিরিয়াল) 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 অনুমতির জন্য যোগ্য নয় এমন প্রিলোডেড ক্যারিয়ার অ্যাপগুলি নীচের টেবিলের বিকল্পগুলির মধ্যে একটি বাস্তবায়ন করতে পারে।

বিকল্প বিবরণ সীমাবদ্ধতা
UICC ক্যারিয়ারের সুবিধাসমূহ অ্যান্ড্রয়েড প্ল্যাটফর্মটি UICC-তে সংরক্ষিত সার্টিফিকেট লোড করে এবং এই সার্টিফিকেট দ্বারা স্বাক্ষরিত অ্যাপগুলিকে বিশেষ পদ্ধতিতে কল করার অনুমতি দেয়। লিগ্যাসি ক্যারিয়ারগুলির একটি বিশাল, প্রতিষ্ঠিত সিম জনসংখ্যা রয়েছে, যা সহজে আপডেট করা যায় না। এছাড়াও, যে ক্যারিয়ারগুলির নতুন সিমের লেখক অধিকার নেই (উদাহরণস্বরূপ, MVNO যাদের MNO থেকে ইস্যু করা সিম রয়েছে) তারা সিমগুলিতে সার্টিফিকেট যোগ বা আপডেট করতে পারবে না।
OEM অ্যালাউলিস্টিং OEM গুলি OP_READ_DEVICE_IDENTIFIER ব্যবহার করে অ্যালোলিস্টেড ক্যারিয়ার অ্যাপগুলিতে ডিভাইস শনাক্তকারী সরবরাহ করতে পারে। এই সমাধানটি সমস্ত ক্যারিয়ারের জন্য স্কেলযোগ্য নয়।
বরাদ্দ কোড (TAC) টাইপ করুন Android 10-এ প্রবর্তিত getTypeAllocationCode পদ্ধতিটি ব্যবহার করে, প্রস্তুতকারক এবং মডেলের তথ্য প্রদানকারী TAC প্রকাশ করুন। TAC-তে থাকা তথ্য একটি নির্দিষ্ট ডিভাইস সনাক্ত করার জন্য অপর্যাপ্ত।
এমএসআইএসডিএন ক্যারিয়াররা তাদের ব্যাকএন্ড সিস্টেমে IMEI খোঁজার জন্য PHONE অনুমতি গ্রুপের সাথে TelephonyManager এর অধীনে উপলব্ধ ফোন নম্বর (MSISDN) ব্যবহার করতে পারে। এর জন্য ক্যারিয়ারগুলির জন্য উল্লেখযোগ্য বিনিয়োগ প্রয়োজন। যেসব ক্যারিয়ার IMSI ব্যবহার করে তাদের নেটওয়ার্ক কী ম্যাপ করে, তাদের MSISDN- এ স্যুইচ করার জন্য উল্লেখযোগ্য প্রযুক্তিগত সম্পদের প্রয়োজন হয়।

সমস্ত ক্যারিয়ার অ্যাপ ক্যারিয়ার অ্যাপের সাইনিং সার্টিফিকেট হ্যাশ ব্যবহার করে CarrierConfig.xml ফাইল আপডেট করে ডিভাইস শনাক্তকারী অ্যাক্সেস করতে পারে। যখন ক্যারিয়ার অ্যাপটি বিশেষ তথ্য পড়ার জন্য কোনও পদ্ধতি কল করে, তখন প্ল্যাটফর্মটি CarrierConfig.xml ফাইলে অ্যাপের সাইনিং সার্টিফিকেট হ্যাশের (SHA-1 অথবা SHA-256 স্বাক্ষর) মিল খুঁজে বের করে। যদি কোনও মিল পাওয়া যায়, তাহলে অনুরোধ করা তথ্য ফেরত পাঠানো হয়। যদি কোনও মিল না পাওয়া যায়, তাহলে একটি নিরাপত্তা ব্যতিক্রম ফেরত পাঠানো হয়।

এই সমাধানটি বাস্তবায়নের জন্য, ক্যারিয়ারগুলিকে এই পদক্ষেপগুলি অনুসরণ করতে হবে:

  1. ক্যারিয়ার অ্যাপের সাইনিং সার্টিফিকেট হ্যাশ দিয়ে CarrierConfig.xml আপডেট করুন এবং একটি প্যাচ জমা দিন
  2. OEM-দের তাদের বিল্ড QPR1+ (প্রস্তাবিত) অথবা এই প্রয়োজনীয় প্ল্যাটফর্ম প্যাচগুলি এবং উপরের ধাপ 1 থেকে আপডেট করা CarrierConfig.xml ফাইল ধারণকারী প্যাচ দিয়ে আপডেট করার জন্য অনুরোধ করুন।

বাস্তবায়ন

ডিভাইস শনাক্তকারীর অ্যাক্সেসের প্রয়োজন এমন বিশেষাধিকারপ্রাপ্ত অ্যাপগুলিকে READ_PRIVILEGED_PHONE_STATE অনুমতি দিতে আপনার বিশেষাধিকারপ্রাপ্ত অনুমতির তালিকা আপডেট করুন।

অ্যালোলিস্টিং সম্পর্কে আরও জানতে, প্রিভিলেজড পারমিশন অ্যালোলিস্টিং দেখুন।

প্রভাবিত API গুলি চালু করতে, একটি অ্যাপকে নিম্নলিখিত প্রয়োজনীয়তাগুলির মধ্যে একটি পূরণ করতে হবে:

  • যদি অ্যাপটি প্রিলোডেড প্রিভিলেজড অ্যাপ হয়, তাহলে এর জন্য AndroidManifest.xml-এ ঘোষিত READ_PRIVILEGED_PHONE_STATE অনুমতি প্রয়োজন। অ্যাপটিকে এই প্রিভিলেজড অনুমতিটিও allowlist করতে হবে।
  • গুগল প্লে এর মাধ্যমে ডেলিভারি করা অ্যাপগুলির ক্যারিয়ার সুবিধা প্রয়োজন। ক্যারিয়ার সুবিধা প্রদান সম্পর্কে আরও জানুন UICC ক্যারিয়ার সুবিধা পৃষ্ঠায়।
  • একটি ডিভাইস বা প্রোফাইল মালিক অ্যাপ যা READ_PHONE_STATE অনুমতি পেয়েছে।

যে অ্যাপ এই প্রয়োজনীয়তাগুলির কোনওটিই পূরণ করে না তার আচরণ নিম্নলিখিত:

  • যদি অ্যাপটি প্রি-কিউ টার্গেট করে এবং READ_PHONE_STATE অনুমতি না থাকে, তাহলে SecurityException ট্রিগার করা হয়। এটি বর্তমান প্রি-কিউ আচরণ কারণ এই API গুলি চালু করার জন্য এই অনুমতি প্রয়োজন।
  • যদি অ্যাপটি প্রাক-Q টার্গেট করে এবং READ_PHONE_STATE অনুমতি মঞ্জুর করা থাকে, তাহলে এটি সমস্ত TelephonyManager API-এর জন্য একটি নাল মান এবং Build#getSerial পদ্ধতির জন্য Build.UNKNOWN পাবে।
  • যদি অ্যাপটি অ্যান্ড্রয়েড ১০ বা তার পরবর্তী ভার্সনের জন্য তৈরি হয় এবং নতুন কোনও প্রয়োজনীয়তা পূরণ না করে, তাহলে এটি একটি SecurityException পাবে।

যাচাইকরণ এবং পরীক্ষা

কম্প্যাটিবিলিটি টেস্ট স্যুট (CTS)-এ ক্যারিয়ার সুবিধাপ্রাপ্ত অ্যাপ, ডিভাইস এবং প্রোফাইল মালিক এবং যেসব অ্যাপের ডিভাইস শনাক্তকারীতে অ্যাক্সেস নেই বলে আশা করা হচ্ছে, তাদের জন্য প্রত্যাশিত ডিভাইস শনাক্তকারী অ্যাক্সেস আচরণ যাচাই করার জন্য পরীক্ষা অন্তর্ভুক্ত থাকে।

নিম্নলিখিত 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 এ কতগুলি অ্যাপ allowlisted করা যেতে পারে?

অ্যারেতে অন্তর্ভুক্ত সার্টিফিকেট হ্যাশের সংখ্যার কোন সীমা নেই।

একটি অ্যাপকে allowlisted করার জন্য 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 বর্তমানে ঢোকানো সিমের উপর ভিত্তি করে নির্ধারিত হয়। এর মানে হল, যদি ক্যারিয়ার Y-এর সিম ঢোকানোর সময় ক্যারিয়ার X-এর অ্যাপ অ্যাক্সেসের সুবিধা পাওয়ার চেষ্টা করে, তাহলে ডিভাইসটি হ্যাশের জন্য কোনও মিল খুঁজে পাবে না এবং একটি নিরাপত্তা ব্যতিক্রম প্রদান করবে।

মাল্টি-সিম ডিভাইসে, ক্যারিয়ার #1 শুধুমাত্র সিম #1 এর জন্য অ্যাক্সেসের সুবিধা পায় এবং বিপরীতভাবে।

ক্যারিয়াররা কীভাবে একটি অ্যাপের স্বাক্ষর শংসাপত্রকে হ্যাশে রূপান্তর করে?

CarrierConfig.xml এ যোগ করার আগে সাইনিং সার্টিফিকেটগুলিকে হ্যাশে রূপান্তর করতে, নিম্নলিখিতগুলি করুন:

  1. toByteArray ব্যবহার করে স্বাক্ষরকারী শংসাপত্রের স্বাক্ষরকে একটি বাইট অ্যারেতে রূপান্তর করুন।
  2. বাইট অ্যারেকে byte[] টাইপের হ্যাশে রূপান্তর করতে MessageDigest ব্যবহার করুন।
  3. byte[] থেকে হ্যাশটিকে হেক্স স্ট্রিং ফর্ম্যাটে রূপান্তর করুন। উদাহরণস্বরূপ, 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>