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

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

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

این تغییر روی API های زیر تأثیر می گذارد:

  • مدیر تلفن # getDeviceId
  • مدیر تلفن # getImei
  • مدیر تلفن # getMeid
  • مدیر تلفن # getSimSerialNumber
  • TelephonyManager # getSubscriberId
  • # getSerial بسازید

دسترسی به برنامه های شرکت مخابراتی بدون اجازه READ_PRIVILEGED_PHONE_STATE

از قبل برنامه های حامل که برای واجد شرایط نیست READ_PRIVILEGED_PHONE_STATE اجازه می توانید یکی از گزینه های موجود در جدول زیر را اجرا کند.

گزینه رسوب محدودیت ها
امتیازات حامل UICC سیستم عامل Android گواهی های ذخیره شده در UICC را بارگیری می کند و به برنامه هایی که توسط این گواهینامه ها امضا شده اند اجازه می دهد تا با روش های خاص تماس بگیرند. شرکت های مخابراتی قدیمی دارای جمعیت سیم کارت ثابت و بزرگی هستند که به راحتی قابل به روزرسانی نیستند. همچنین ، شرکتهای مخابراتی که حق تألیف روی سیم کارتهای جدید ندارند (به عنوان مثال ، MVNO هایی که سیم کارتهایشان از MNO صادر شده است) نمی توانند گواهینامه ها را روی سیم کارتها اضافه یا به روز کنند.
لیست سفید نصب شده OEM ها می توانند از OP_READ_DEVICE_IDENTIFIER برای ارائه شناسه های دستگاه به برنامه های حامل در لیست سفید استفاده کنند. این راه حل برای همه شرکت های مخابراتی مقیاس پذیر نیست.
کد تخصیص را تایپ کنید (TAC) از روش getTypeAllocationCode که در Android 10 معرفی شده است ، برای آشکار کردن TAC اطلاعات تولید کننده و مدل را نشان دهید. اطلاعات موجود در TAC برای شناسایی یک دستگاه خاص کافی نیست.
MSISDN شرکت های مخابراتی می توانند با استفاده از شماره تلفن (MSISDN) که تحت TelephonyManager با گروه مجوز PHONE در دسترس است ، IMEI را در سیستم های backend خود جستجو کنند. این امر به سرمایه گذاران قابل توجهی نیاز دارد. شرکتهای مخابراتی که کلیدهای شبکه خود را با استفاده از IMSI نقشه برداری می کنند ، برای تبدیل به MSISDN به منابع فنی قابل توجهی نیاز دارند.

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

برای اجرای این راه حل ، شرکت های مخابراتی باید این مراحل را دنبال کنند:

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

پیاده سازی

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

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

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

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

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

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

در دستگاه های چند سیم کارته ، شرکت مخابراتی شماره 1 فقط حق دسترسی به سیم کارت شماره 1 و بالعکس را دارد.

چگونه شرکت مخابراتی گواهی امضای برنامه را به هش تبدیل می کند؟

برای تبدیل گواهی های امضا به هش قبل از اضافه کردن آنها به CarrierConfig.xml ، موارد زیر را انجام دهید:

  1. امضای گواهی امضا را با استفاده از toByteArray آرایه بایت toByteArray .
  2. برای تبدیل آرایه بایت به هش در نوع بایت [] از MessageDigest استفاده کنید.
  3. هش را از بایت [] به قالب رشته hex تبدیل کنید. برای مثال ، به 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>