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

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

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

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

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

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

  1. CarrierConfig.xml با هش گواهی امضای برنامه حامل به‌روزرسانی کنید و یک وصله ارسال کنید .
  2. از OEM ها بخواهید که ساخت خود را با QPR1+ (توصیه می شود) یا این وصله های پلتفرم مورد نیاز و وصله حاوی فایل CarrierConfig.xml به روز شده را از مرحله 1 بالا به روز کنند.

پیاده سازی

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

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

برای فراخوانی APIهای تحت تأثیر، یک برنامه باید یکی از شرایط زیر را داشته باشد:

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

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

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

در دستگاه های چند سیم کارته، شرکت مخابراتی شماره 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 آرایه ای با اندازه 2 با مقدار 12345 و 54321 است، موارد زیر را به فایل پیکربندی حامل اضافه کنید.

    <string-array name="carrier_certificate_string_array" num="2">
        <item value="12345"/>
        <item value="54321"/>
    </string-array>