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

অ্যান্ড্রয়েড ১০ ডিভাইস আইডেন্টিফায়ারগুলোর পারমিশন পরিবর্তন করেছে, যার ফলে এখন সমস্ত ডিভাইস আইডেন্টিফায়ার READ_PRIVILEGED_PHONE_STATE পারমিশন দ্বারা সুরক্ষিত। অ্যান্ড্রয়েড ১০-এর আগে, স্থায়ী ডিভাইস আইডেন্টিফায়ারগুলো (IMEI/MEID, IMSI, SIM, এবং বিল্ড সিরিয়াল) READ_PHONE_STATE রানটাইম পারমিশনের মাধ্যমে সুরক্ষিত ছিল। READ_PRIVILEGED_PHONE_STATE পারমিশনটি শুধুমাত্র প্ল্যাটফর্ম কী দিয়ে সাইন করা অ্যাপ এবং প্রিভিলেজড সিস্টেম অ্যাপগুলোকে দেওয়া হয়।

নতুন অনুমতির প্রয়োজনীয়তা সম্পর্কে আরও তথ্য TelephonyManager.java এবং Build.java- এর Javadoc পৃষ্ঠাগুলিতে পাওয়া যাবে।

এই পরিবর্তনটি নিম্নলিখিত API-গুলিকে প্রভাবিত করে:

  • টেলিফোনি ম্যানেজার#ডিভাইস আইডি পান
  • টেলিফোনি ম্যানেজার#গেটআইএমইআই
  • টেলিফোনি ম্যানেজার#গেটমেইড
  • টেলিফোনি ম্যানেজার#গেট সিম সিরিয়াল নম্বর
  • টেলিফোনি ম্যানেজার#সাবস্ক্রাইবার আইডি পান
  • বিল্ড#গেটসিরিয়াল

READ_PRIVILEGED_PHONE_STATE অনুমতি ছাড়াই ক্যারিয়ার অ্যাপগুলির অ্যাক্সেস

প্রি-লোডেড ক্যারিয়ার অ্যাপ, যেগুলো READ_PRIVILEGED_PHONE_STATE পারমিশনের জন্য যোগ্য নয়, সেগুলো নিচের সারণিতে থাকা বিকল্পগুলোর মধ্যে যেকোনো একটি প্রয়োগ করতে পারে।

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

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

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

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

বাস্তবায়ন

আপনার প্রিভিলেজড পারমিশন অ্যালাওলিস্ট আপডেট করে সেইসব প্রিভিলেজড অ্যাপগুলোকে READ_PRIVILEGED_PHONE_STATE পারমিশনটি দিন, যাদের ডিভাইস আইডেন্টিফায়ারে অ্যাক্সেস প্রয়োজন।

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

প্রভাবিত এপিআইগুলো ব্যবহার করতে হলে, একটি অ্যাপকে নিম্নলিখিত শর্তগুলোর মধ্যে যেকোনো একটি পূরণ করতে হবে:

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

যে অ্যাপ এই শর্তগুলোর কোনোটিই পূরণ করে না, তার আচরণ নিম্নরূপ হয়:

  • যদি অ্যাপটি প্রি-কিউ (pre-Q) টার্গেট করে এবং এর READ_PHONE_STATE পারমিশনটি দেওয়া না থাকে, তাহলে SecurityException ট্রিগার হয়। এটিই বর্তমান প্রি-কিউ (pre-Q) আচরণ, কারণ এই এপিআই (API) গুলোকে কল করার জন্য এই পারমিশনটি প্রয়োজন।
  • যদি অ্যাপটি প্রি-কিউ (pre-Q) টার্গেট করে এবং READ_PHONE_STATE পারমিশনটি দেওয়া থাকে, তাহলে এটি সমস্ত TelephonyManager API-এর জন্য একটি null ভ্যালু এবং 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

প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী

একটি নির্দিষ্ট (এমসিসি, এমএনসি)-এর জন্য CarrierConfig.xml এ কয়টি অ্যাপকে allowlist করা যেতে পারে?

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

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

একাধিক সিমযুক্ত ডিভাইসে, ক্যারিয়ার #১ শুধুমাত্র সিম #১ ব্যবহার করতে পারে এবং এর বিপরীতটিও সত্য।

ক্যারিয়ারগুলো কীভাবে একটি অ্যাপের সাইনিং সার্টিফিকেটকে হ্যাশে রূপান্তর করে?

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>