شناسه‌های دستگاه

‫Android 10 اجازه‌های مربوط به شناسه‌های دستگاه را تغییر می‌دهد تا همه شناسه‌های دستگاه اکنون با اجازه READ_PRIVILEGED_PHONE_STATE محافظت شوند. پیش‌از Android 10، شناسه‌های دستگاه دائمی (IMEI/MEID،‏ IMSI، سیم‌کارت، و سریال ساخت) پشت اجازه زمان اجرای READ_PHONE_STATE محافظت می‌شدند. اجازه READ_PRIVILEGED_PHONE_STATE فقط به برنامه‌هایی که با کلید پلاتفرم امضا شده‌اند و برنامه‌های سیستم ممتاز داده می‌شود.

اطلاعات بیشتر درباره الزامات اجازه جدید را می‌توانید در صفحه‌های Javadoc برای TelephonyManager.java و Build.java پیدا کنید.

این تغییر بر میاناهای برنامه‌سازی کاربردی زیر تأثیر می‌گذارد:

  • 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 دارند) نمی‌توانند گواهی‌ها را در سیم‌کارت‌ها اضافه یا به‌روز کنند.
فهرست مجاز سازنده اصلی محصول «تولیدکنندگان تجهیزات اصلی» می‌توانند از OP_READ_DEVICE_IDENTIFIER برای ارائه شناسه‌های دستگاه به برنامه‌های شرکت مخابراتی فهرست مجاز استفاده کنند. این راهکار برای همه شرکت‌های مخابراتی مقیاس‌پذیر نیست.
کد تخصیص نوع (TAC) از روش getTypeAllocationCode که در Android 10 معرفی شده است برای آشکار کردن TAC که اطلاعات سازنده و مدل را برمی‌گرداند استفاده کنید. اطلاعات موجود در TAC برای شناسایی دستگاهی خاص کافی نیست.
شماره دیجیتال خدمات یکپارچه مشترکین تلفن همراه شرکت‌های مخابراتی می‌توانند از شماره تلفن (MSISDN) که در TelephonyManager با گروه اجازه PHONE دردسترس است برای جستجوی IMEI در سیستم‌های پشتیبان خود استفاده کنند. این کار نیاز به سرمایه‌گذاری قابل‌توجهی برای شرکت‌های مخابراتی دارد. شرکت‌های مخابراتی که کلیدهای شبکه خود را بااستفاده از IMSI تطبیق می‌دهند برای تغییر به MSISDN به منابع فنی قابل‌توجهی نیاز دارند.

همه برنامه‌های شرکت مخابراتی می‌توانند با به‌روزرسانی فایل CarrierConfig.xml با مقدار درهم‌سازی گواهینامه امضای برنامه شرکت مخابراتی به شناسه‌های دستگاه دسترسی داشته باشند. وقتی برنامه شرکت مخابراتی روشی را برای خواندن اطلاعات ممتاز فرا می‌خواند، پلاتفرم به‌دنبال مطابقت درهم‌سازی گواهینامه امضای برنامه (امضای SHA-1 یا SHA-256 گواهینامه) در فایل CarrierConfig.xml می‌گردد. اگر مورد منطبقی پیدا شود، اطلاعات درخواستی برگردانده می‌شود. اگر هیچ تطابقی پیدا نشود، استثنای امنیتی برگردانده می‌شود.

برای پیاده‌سازی این راهکار، شرکت‌های مخابراتی باید این مراحل را دنبال کنند:

  1. CarrierConfig.xml را با درهم‌ساز گواهی امضای برنامه شرکت مخابراتی به‌روز کنید و وصله‌ای ارسال کنید.
  2. از «تولیدکنندگان تجهیزات اصلی» بخواهید ساخت خود را با QPR-1 یا بالاتر (توصیه‌شده) یا این وصله‌های پلاتفرم الزامی و وصله حاوی فایل CarrierConfig.xml به‌روزشده از مرحله ۱ در بالا به‌روز کنند.

پیاده‌سازی

فهرست مجاز اجازه‌های ممتاز را به‌روز کنید تا اجازه READ_PRIVILEGED_PHONE_STATE را به آن برنامه‌های ممتازی که نیاز به دسترسی به شناسه‌های دستگاه دارند اعطا کنید.

برای کسب اطلاعات بیشتر درباره فهرست مجازها، به فهرست مجازهای اجازه ممتاز مراجعه کنید.

برای فراخوانی کردن «میاناهای برنامه‌سازی کاربردی» تحت‌تأثیر قرارگرفته، برنامه باید یکی از الزامات زیر را برآورده کند:

  • اگر برنامه ازقبل بارشده دارای امتیاز باشد، به اجازه READ_PRIVILEGED_PHONE_STATE که در AndroidManifest.xml اعلام شده است نیاز دارد. برنامه همچنین باید این اجازه ممتاز را در فهرست مجاز قرار دهد.
  • برنامه‌هایی که ازطریق Google Play ارائه می‌شوند به امتیازات شرکت مخابراتی نیاز دارند. درباره اعطای امتیازات شرکت مخابراتی در صفحه امتیازات شرکت مخابراتی UICC بیشتر بدانید.
  • برنامه مالک دستگاه یا نمایه که به آن اجازه READ_PHONE_STATE اعطا شده است.

برنامه‌ای که هیچ‌یک از این الزامات را برآورده نکند، رفتار زیر را خواهد داشت:

  • اگر برنامه نسخه پیش‌از Q را هدف قرار دهد و اجازه READ_PHONE_STATE را نداشته باشد، SecurityException راه‌اندازی می‌شود. این رفتار فعلی نسخه پیش‌از Q است زیرا این اجازه برای فراخوانی این میاناهای برنامه‌سازی کاربردی لازم است.
  • اگر برنامه نسخه‌های قبل‌از Q را هدف‌یابی کند و اجازه READ_PHONE_STATE را داشته باشد، برای همه «میاناهای برنامه‌سازی کاربردی TelephonyManager» و Build.UNKNOWN برای روش Build#getSerial مقدار تهی دریافت می‌کند.
  • اگر برنامه 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

پرسشگان

چند برنامه را می‌توان در CarrierConfig.xml برای یک (MCC،‏ MNC) معین در فهرست مجاز قرار داد؟

هیچ محدودیتی برای تعداد درهم‌سازی‌های گواهی موجود در آرایه وجود ندارد.

از کدام پارامترهای CarrierConfig در CarrierConfig.xml باید استفاده کنم تا برنامه در فهرست مجاز قرار بگیرد؟

از عنصر پیکربندی سطح بالای زیر در CarrierConfig.xml خاص از گزینه‌های AOSP که پیکربندی می‌کنید استفاده کنید:

<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. از MessageDigest برای تبدیل آرایه بایت به درهم‌سازی در نوع byte[] استفاده کنید.
  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>