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

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

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

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

  • 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 অ্যালাওলিস্টিং সাদাতালিকায় থাকা পরিষেবা প্রদানকারীর অ্যাপকে ডিভাইসের শনাক্তকারী প্রদান করতে OEM OP_READ_DEVICE_IDENTIFIER ব্যবহার করতে পারে। এই সমাধান সব পরিষেবা প্রদানকারীর জন্য স্কেলেবল নয়।
টাইপ অ্যালোকেশন কোড (TAC) Android 10-এ প্রবর্তিত TAC-কে এক্সপোজ করার getTypeAllocationCode পদ্ধতি ব্যবহার করুন, যা প্রস্তুতকারক ও মডেল সম্পর্কিত তথ্য রিটার্ন করে। নির্দিষ্ট কোনও ডিভাইস শনাক্ত করার জন্য TAC-তে দেওয়া তথ্য পর্যাপ্ত নয়।
MSISDN পরিষেবা প্রদানকারী, PHONE অনুমতি গ্রুপের সাথে TelephonyManager-এর অধীনে উপলভ্য ফোন নম্বর (MSISDN) ব্যবহার করে তাদের ব্যাকএন্ড সিস্টেমে IMEI খুঁজতে পারে। এর জন্য পরিষেবা প্রদানকারীকে অনেক বেশি বিনিয়োগ করতে হয়। যেসব পরিষেবা প্রদানকারী IMSI ব্যবহার করে তাদের নেটওয়ার্ক কী ম্যাপ করে, তাদের MSISDN-এ পরিবর্তন করার জন্য প্রচুর টেকনিক্যাল রিসোর্স প্রয়োজন হয়।

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

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

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

প্রয়োগ

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

সাদাতালিকাভুক্ত করা সম্পর্কে আরও জানতে, বিশেষ অনুমতি সাদাতালিকাভুক্ত করা দেখুন।

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

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

কোনও অ্যাপ এইসব প্রয়োজনীয়তার কোনওটি পূরণ না করলে, সেটির আচরণ নিম্নলিখিতভাবে পরিবর্তিত হয়:

  • অ্যাপটি যদি pre-Q টার্গেট করে এবং এতে READ_PHONE_STATE অনুমতি না থাকে, তাহলে SecurityException ট্রিগার হয়। এটি বর্তমান pre-Q আচরণ কারণ এই API চালু করার জন্য এই অনুমতি প্রয়োজন।
  • অ্যাপটি যদি প্রি-Q টার্গেট করে এবং READ_PHONE_STATE অনুমতি দেওয়া থাকে, তাহলে এটি সব TelephonyManager API-এর জন্য নাল ভ্যালু এবং Build#getSerial পদ্ধতির জন্য Build.UNKNOWN পায়।
  • অ্যাপটি Android 10 বা তার পরবর্তী যেকোনও ভার্সনকে টার্গেট করলে এবং নতুন প্রয়োজনীয়তাগুলির মধ্যে কোনও একটি পূরণ না করলে, এটি 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-এ কতগুলি অ্যাপকে শ্বেত তালিকাভুক্ত করা যাবে?

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

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

মাল্টি-সিম ডিভাইসে, পরিষেবা প্রদানকারী #১-এর কাছে শুধুমাত্র সিম #১-এর অ্যাক্সেস প্রিভিলেজ থাকে এবং এর বিপরীতও হতে পারে।

কীভাবে পরিষেবা প্রদানকারী কোনও অ্যাপের সই করা সার্টিফিকেটকে হ্যাশে কনভার্ট করে?

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

  1. toByteArray ব্যবহার করে সাইনিং সার্টিফিকেটের সিগনেচারকে বাইট অ্যারেতে কনভার্ট করুন।
  2. 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>