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
میگردد. در صورت یافتن مطابقت، اطلاعات درخواستی برگردانده می شود. اگر مطابقت پیدا نشد، یک استثنا امنیتی برگردانده می شود.
برای پیاده سازی این راه حل، اپراتورها باید این مراحل را دنبال کنند:
-
CarrierConfig.xml
با هش گواهی امضای برنامه حامل بهروزرسانی کنید و یک وصله ارسال کنید . - از 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
، موارد زیر را انجام دهید:
- امضای گواهی امضا را با استفاده از
toByteArray
به آرایه بایتی تبدیل کنید. - از
MessageDigest
برای تبدیل آرایه بایت به هش در نوع بایت[] استفاده کنید. هش را از بایت[] به قالب رشته هگز تبدیل کنید. برای مثال،
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())); }
اگر
certHashes
آرایه ای با اندازه2
با مقدار12345
و54321
است، موارد زیر را به فایل پیکربندی حامل اضافه کنید.<string-array name="carrier_certificate_string_array" num="2"> <item value="12345"/> <item value="54321"/> </string-array>