معرّفات الأجهزة

يغيّر Android 10 الأذونات معرّفات الأجهزة بحيث تتم حماية جميع معرّفات الأجهزة من خلال الحصول على إذن READ_PRIVILEGED_PHONE_STATE قبل نظام التشغيل Android 10، معرّفات الأجهزة الدائمة (IMEI/MEID وIMSI وشريحة SIM والرقم التسلسلي للإصدار) محمية من خلال إذن التشغيل READ_PHONE_STATE إذن READ_PRIVILEGED_PHONE_STATE هو فقط يتم منحها للتطبيقات الموقَّعة باستخدام مفتاح النظام الأساسي وتطبيقات النظام المميزة.

يمكن العثور على مزيد من المعلومات حول متطلبات الأذونات الجديدة في صفحات Javadoc لـ TechnicalManager.java وBuild.java.

يؤثر هذا التغيير في واجهات برمجة التطبيقات التالية:

  • مدير الاتصال الهاتفي#getDeviceId
  • مدير الاتصال الهاتفي#getImei
  • مدير الاتصال الهاتفي#getMeid
  • مدير الاتصال الهاتفي#getSimSerialNumber
  • مدير الاتصال الهاتفي#getSubscriberId
  • الإصدار#getSerial

الوصول إلى تطبيقات مشغّل شبكة الجوّال بدون إذن READ_PRIVILEGED_PHONE_state

تطبيقات مشغّل شبكة الجوّال المُحمّلة مسبقًا وغير المؤهَّلة للحصول على READ_PRIVILEGED_PHONE_STATE إذن بتنفيذ أحد الخيارات الواردة في الجدول أدناه.

الخيار الوصف القيود
امتيازات مشغِّل شبكة الجوّال في UICC يحمّل نظام Android الأساسي الشهادات المخزنة في UICC ويمنح إذن للتطبيقات الموقَّعة من خلال هذه الشهادات لإجراء مكالمات خاصة الطرق. لدى شركات تشغيل شبكات الجوّال القديمة عدد كبير من شرائح SIM، وبالتالي قابلة للتحديث بسهولة. وكذلك، فإن مشغلي شبكات الجوّال الذين لا يملكون حقوقًا للتأليف لا يمكن لشرائح SIM (على سبيل المثال، مشغّلات شبكة الجوّال الافتراضية التي تتضمّن شرائح SIM مصدرها MNO) إضافة أو وتحديث الشهادات على شرائح SIM.
القائمة المسموح بها للمصنّعين الأصليين يمكن للمصنّعين الأصليين للأجهزة استخدام "OP_READ_DEVICE_IDENTIFIER" لتوفير الجهاز. المعرّفات إلى تطبيقات مشغّل شبكة الجوّال المدرَجة في القائمة المسموح بها. هذا الحل غير قابل للتطوير لدى جميع مشغّلي شبكات الجوّال.
نوع رمز التخصيص (TAC) يمكنك استخدام getTypeAllocationCode المقدمة في الإصدار 10 من نظام التشغيل Android، لكشف TAC التي تعرض الشركة المصنّعة والطراز المعلومات. المعلومات الواردة في اتفاقية الشفافية والموافقة غير كافية لتحديد جهاز معيّن.
رقم MSISDN يمكن لمشغّلي شبكة الجوّال استخدام رقم الهاتف (MSISDN) المتاح ضمن TelephonyManager لديه إذن PHONE البحث عن رمز IMEI على أنظمتهم الخلفية. ويتطلّب ذلك استثمارات كبيرة لمشغّلي شبكات الجوّال. شركات تشغيل شبكة الجوّال التي تم تعيينها استخدام مفاتيح الشبكة باستخدام رقم التعريف الدولي للمشترك في خدمات الجوّال (IMSI) موارد فنية للتبديل إلى MSISDN.

يمكن لجميع تطبيقات مشغّل شبكة الجوّال الوصول إلى معرّفات الأجهزة من خلال تحديث. ملف CarrierConfig.xml بتجزئة شهادة التوقيع تطبيق مشغّل شبكة الجوّال. عندما يستدعي تطبيق مشغّل شبكة الجوّال طريقة لقراءة معلومات خاصّة. البحث، تبحث المنصة عن مطابقة لشهادة توقيع التطبيق (توقيع الشهادة SHA-1 أو SHA-256) في ملف ملف CarrierConfig.xml. وفي حال العثور على مطابقة، يتم طلب يتم إرجاع المعلومات. إذا لم يتم العثور على أي تطابق، يكون استثناء الأمان عاد.

لتنفيذ هذا الحل، على مشغّلي شبكات الجوّال اتّباع الخطوات التالية:

  1. تعديل CarrierConfig.xml مع تجزئة شهادة التوقيع تطبيق مشغّل شبكة الجوّال أرسِل رمز تصحيح.
  2. اطلب من المصنّعين الأصليين للأجهزة تحديث إصداراتهم بإضافة QPR1+ (إجراء يُنصح به) أو التصحيحات المطلوبة للنظام الأساسي والتصحيح الذي يحتوي على تم تعديل ملف CarrierConfig.xml من الخطوة 1 أعلاه.

التنفيذ

تعديل القائمة المسموح بها للأذونات المميّزة لمنح إذن "READ_PRIVILEGED_PHONE_STATE" لهؤلاء المستخدمين المميّزين التطبيقات التي تتطلب الوصول إلى معرّفات الأجهزة.

لمزيد من المعلومات عن الإضافة إلى القائمة المسموح بها، يُرجى الرجوع إلى مقالة الإضافة المميزة قائمة الأذونات المسموح بها

لاستدعاء واجهات برمجة التطبيقات المتأثرة، يجب أن يستوفي التطبيق أحد المتطلبات التالية المتطلبات:

  • إذا كان التطبيق يوفّر أذونات امتيازية تم تحميلها مسبقًا، سيحتاج إلى تم تضمين إذن واحد (READ_PRIVILEGED_PHONE_STATE) في ملف AndroidManifest.xml. يجب أيضًا إضافة التطبيق إلى القائمة المسموح بها. هذا الإذن المميز.
  • يجب الحصول على امتيازات مشغّل شبكة الجوّال للتطبيقات التي يتم تقديمها من خلال Google Play. مزيد من المعلومات حول منح امتيازات مشغّل شبكة الجوّال على مشغِّل شبكة الجوّال لواجهة المستخدم في الولايات المتحدة (UICC) الامتيازات.
  • جهاز أو تطبيق مالك الملف الشخصي تم منحه إذن READ_PHONE_STATE.

يجب أن يستوفي التطبيق الذي لا يستوفي أيًا من هذه المتطلبات ما يلي: السلوك:

  • إذا كان التطبيق يستهدف مرحلة ما قبل طرح الأسئلة ولا يتضمن علامة التبويب هذه تم منح إذن "READ_PHONE_STATESecurityException . هذا هو الإذن الحالي الذي كان في مرحلة ما قبل Q. لاستدعاء واجهات برمجة التطبيقات هذه.
  • إذا كان التطبيق يستهدف مرحلة ما قبل سطوره ولديه تم منح إذن "READ_PHONE_STATE"، وسيتلقّى قيمة فارغة لكل واجهات برمجة تطبيقات TechnicalManager 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 لحساب معيّن (مركز عملائي أو MNC)؟

ما مِن حدّ أقصى لعدد تجزئات الشهادة المضمّنة في المصفوفة.

ما هي مَعلمات CarrierConfig في CarrierConfig.xml التي يجب استخدامها لكي يتم إدراج التطبيق في القائمة المسموح بها؟

يمكنك استخدام عنصر الضبط ذي المستوى الأعلى التالي داخل نطاق CarrierConfig.xml من خيارات AOSP التي تتم إعدادها:

<string-array name="carrier_certificate_string_array" num="2">
    <item value="BF02262E5EF59FDD53E57059082F1A7914F284B"/>
    <item value="9F3868A3E1DD19A5311D511A60CF94D975A344B"/>
</string-array>

هل يتوفّر نموذج أساسي لهذه الإعدادات يمكنني استخدامه؟

استخدِم النموذج التالي. يجب إضافة هذا إلى العنصر ذات صلة.

<?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، يمكنك إجراء ما يلي:

  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>