يغير Android 10 أذونات معرفات الجهاز بحيث تكون جميع معرفات الجهاز محمية الآن بإذن READ_PRIVILEGED_PHONE_STATE
. قبل إصدار Android 10 ، كانت معرفات الأجهزة الثابتة (IMEI / MEID و IMSI و SIM والبناء التسلسلي) محمية خلف إذن وقت تشغيل READ_PHONE_STATE
. يُمنح إذن READ_PRIVILEGED_PHONE_STATE
فقط للتطبيقات الموقعة باستخدام مفتاح النظام الأساسي وتطبيقات النظام ذات الامتيازات.
يمكن العثور على مزيد من المعلومات حول متطلبات الأذونات الجديدة في صفحات Javadoc لـ TelephonyManager.java و Build.java .
يؤثر هذا التغيير على واجهات برمجة التطبيقات التالية:
- TelephonyManager # getDeviceId
- TelephonyManager # getImei
- TelephonyManager # getMeid
- TelephonyManager # getSimSerialNumber
- TelephonyManager # getSubscriberId
- بناء # getSerial
الوصول إلى تطبيقات الناقل دون إذن READ_PRIVILEGED_PHONE_STATE
يمكن لتطبيقات شركات الجوّال المحمّلة مسبقًا غير المؤهلة للحصول على إذن READ_PRIVILEGED_PHONE_STATE
تنفيذ أحد الخيارات الواردة في الجدول أدناه.
خيار | الوصف | محددات |
---|---|---|
امتيازات الناقل UICC | يقوم نظام Android الأساسي بتحميل الشهادات المخزنة على UICC ويمنح الإذن للتطبيقات الموقعة بواسطة هذه الشهادات لإجراء مكالمات إلى طرق خاصة. | تمتلك شركات الاتصالات القديمة عددًا كبيرًا من شرائح SIM الثابتة ، والتي لا يمكن تحديثها بسهولة. أيضًا ، لا يمكن لشركات الجوال التي ليس لديها حقوق تأليف لبطاقات SIM الجديدة (على سبيل المثال ، مشغلي شبكات الجوال الافتراضية (MVNO) التي لديها بطاقات SIM صادرة من مشغلي شبكات MNO) إضافة أو تحديث الشهادات على بطاقات SIM. |
قائمة OEM المسموح بها | يمكن لمصنعي المعدات الأصلية استخدام OP_READ_DEVICE_IDENTIFIER لتوفير معرفات الجهاز للسماح بتطبيقات شركة الجوال. | هذا الحل غير قابل للتطوير لجميع شركات النقل. |
اكتب رمز التخصيص (TAC) | استخدم طريقة getTypeAllocationCode ، المقدمة في Android 10 ، لفضح TAC الذي يقوم بإرجاع معلومات الشركة المصنعة والطراز. | المعلومات الواردة في TAC غير كافية لتحديد جهاز معين. |
MSISDN | يمكن لشركات الاتصالات استخدام رقم الهاتف (MSISDN) ، المتوفر ضمن TelephonyManager مع مجموعة أذونات PHONE ، للبحث عن IMEI على أنظمة الواجهة الخلفية الخاصة بهم. | هذا يتطلب استثمارات كبيرة للناقلين. تتطلب شركات الاتصالات التي تعين مفاتيح الشبكة الخاصة بها باستخدام IMSI موارد فنية كبيرة للتبديل إلى MSISDN . |
يمكن لجميع تطبيقات شركة الاتصالات الوصول إلى معرفات الجهاز عن طريق تحديث ملف CarrierConfig.xml
مع تجزئة شهادة التوقيع لتطبيق شركة الجوال. عندما يستدعي تطبيق شركة الجوال طريقة لقراءة المعلومات المميزة ، يبحث النظام الأساسي عن تطابق تجزئة شهادة توقيع التطبيق (توقيع SHA-1 أو SHA-256 للشهادة) في ملف CarrierConfig.xml
. إذا تم العثور على تطابق ، يتم إرجاع المعلومات المطلوبة. إذا لم يتم العثور على تطابق ، يتم إرجاع استثناء أمني.
لتنفيذ هذا الحل ، يجب على شركات الاتصالات اتباع الخطوات التالية:
- قم بتحديث
CarrierConfig.xml
باستخدام تجزئة شهادة التوقيع لتطبيق الناقل وإرسال تصحيح . - اطلب من مصنعي المعدات الأصلية تحديث تصميمهم باستخدام QPR1 + (موصى به) أو تصحيحات النظام الأساسي المطلوبة والتصحيح الذي يحتوي على ملف
CarrierConfig.xml
المحدث من الخطوة 1 أعلاه.
تطبيق
قم بتحديث قائمة سماح الأذونات المميزة الخاصة بك لمنح إذن 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>
هل يجب أن تكون بطاقة SIM الخاصة بشركة الاتصالات في الجهاز للوصول إلى معرفات الجهاز؟
يتم تحديد CarrierConfig.xml
المستخدم بناءً على بطاقة SIM التي تم إدخالها حاليًا. هذا يعني أنه إذا حاول تطبيق شركة الجوّال X الحصول على امتيازات الوصول أثناء إدخال بطاقة SIM الخاصة بشركة الجوّال Y ، فلن يجد الجهاز تطابقًا للتجزئة ويعيد استثناء أمان.
على الأجهزة متعددة بطاقات SIM ، يمتلك الناقل رقم 1 فقط امتيازات الوصول لبطاقة SIM رقم 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>