ID perangkat

Android 10 mengubah izin untuk pengenal perangkat, sehingga semua pengenal perangkat itu sekarang dilindungi oleh izin READ_PRIVILEGED_PHONE_STATE. Sebelum Android 10, ID perangkat tetap (IMEI/MEID, IMSI, SIM, dan serial build) dilindungi di balik Izin runtime READ_PHONE_STATE. Izin READ_PRIVILEGED_PHONE_STATE hanya diberikan ke aplikasi yang ditandatangani dengan kunci platform dan aplikasi sistem dengan hak istimewa.

Informasi selengkapnya untuk persyaratan izin baru dapat ditemukan di Halaman Javadoc untuk TelephonyManager.java dan Build.java.

Perubahan ini memengaruhi API berikut:

  • TelephonyManager#getDeviceId
  • Pengelola Telepon#getImei
  • Pengelola Telepon#getMeid
  • TeleponManager#getSimSerialNumber
  • TelephonyManager#getSubscriberId
  • Bangun#getSerial

Akses untuk aplikasi operator tanpa izin READ_PRIVILEGED_PHONE_State

Aplikasi operator pramuat yang tidak memenuhi syarat untuk READ_PRIVILEGED_PHONE_STATE izin akses dapat menerapkan salah satu opsi dalam tabel di bawah.

Opsi Deskripsi Batasan
Hak istimewa operator UICC Platform Android memuat sertifikat yang disimpan di UICC dan memberikan izin akses ke aplikasi yang ditandatangani oleh sertifikat ini untuk melakukan panggilan ke metode. Operator lama memiliki populasi SIM yang sudah ada dan berkembang, mudah diperbarui. Selain itu, operator yang tidak memiliki hak otorisasi atas SIM (misalnya, MVNO yang memiliki SIM yang diterbitkan dari MNO) tidak dapat menambahkan atau memperbarui sertifikat pada SIM.
Pemberian izin OEM OEM dapat menggunakan OP_READ_DEVICE_IDENTIFIER untuk menyediakan perangkat ID ke aplikasi operator yang diizinkan. Solusi ini tidak skalabel untuk semua operator.
Jenis Kode Alokasi (TAC) Gunakan getTypeAllocationCode , diperkenalkan dalam Android 10, untuk mengekspos TAC yang menampilkan produsen dan model info. Informasi di TAC tidak cukup untuk mengidentifikasi perangkat tertentu.
MSISDN Operator dapat menggunakan nomor telepon (MSISDN), yang tersedia di TelephonyManager dengan izin PHONE , untuk mencari IMEI pada sistem backend mereka. Hal ini memerlukan investasi yang signifikan bagi ekspedisi. Operator yang memetakan kunci jaringan yang menggunakan IMSI memerlukan referensi teknis untuk beralih ke MSISDN.

Semua aplikasi operator dapat mengakses ID perangkat dengan mengupdate file CarrierConfig.xml dengan hash sertifikat penandatanganan aplikasi operator. Saat aplikasi operator memanggil metode untuk membaca dengan hak istimewa informasi umum, platform akan mencari kecocokan dengan sertifikat penandatanganan aplikasi (tanda tangan SHA-1 atau SHA-256 sertifikat) di File CarrierConfig.xml. Jika ditemukan kecocokan, karakter yang diminta informasi ditampilkan. Jika tidak ditemukan kecocokan, ada pengecualian keamanan dikembalikan.

Untuk menerapkan solusi ini, ekspedisi HARUS mengikuti langkah-langkah berikut:

  1. Perbarui CarrierConfig.xml dengan hash sertifikat penandatanganan aplikasi operator dan mengirimkan patch.
  2. Minta OEM untuk mengupdate build mereka dengan QPR1+ (direkomendasikan) ATAU patch platform yang diperlukan dan patch yang berisi file CarrierConfig.xml yang diperbarui dari langkah 1 di atas.

Implementasi

Perbarui daftar izin dengan hak istimewa Anda untuk memberikan READ_PRIVILEGED_PHONE_STATE izin untuk pengguna yang diberi hak istimewa aplikasi yang memerlukan akses ke ID perangkat.

Untuk mempelajari lebih lanjut pemberian izin, lihat Hak Istimewa Pemberian Izin yang Diizinkan.

Untuk memanggil API yang terpengaruh, aplikasi harus memenuhi salah satu persyaratan berikut persyaratan:

  • Jika aplikasi adalah aplikasi dengan hak istimewa pramuat, aplikasi perlu READ_PRIVILEGED_PHONE_STATE izin dideklarasikan di AndroidManifest.xml Aplikasi juga perlu mengizinkan izin istimewa ini.
  • Aplikasi yang dikirim melalui Google Play memerlukan hak istimewa operator. Pelajari lebih lanjut tentang memberikan hak istimewa operator pada Operator UICC Hak Istimewa.
  • Aplikasi pemilik perangkat atau profil yang telah diberi Izin READ_PHONE_STATE.

Aplikasi yang tidak memenuhi salah satu persyaratan ini memiliki hal berikut perilaku:

  • Jika aplikasi menargetkan pra-Q dan tidak memiliki READ_PHONE_STATE izin diberikan, SecurityException akan terpicu. ini adalah perilaku pra-Q saat ini karena izin ini diperlukan untuk memanggil API ini.
  • Jika aplikasi menargetkan pra-Q dan memiliki READ_PHONE_STATE diberikan, aplikasi akan menerima nilai null untuk semua TelephonyManager API dan Build.UNKNOWN untuk metode Build#getSerial.
  • Jika aplikasi menargetkan Android 10 atau yang lebih tinggi dan tidak memenuhi salah satu fitur baru persyaratannya maka ia akan menerima {i>SecurityException<i}.

Validasi dan pengujian

Tabel Kompatibilitas Test Suite (CTS) mencakup pengujian untuk memverifikasi ID perangkat yang diharapkan perilaku akses untuk aplikasi dengan hak istimewa operator, perangkat dan pemilik profil, dan aplikasi yang diharapkan tidak memiliki akses ke perangkat pengenal.

Uji CTS berikut dikhususkan untuk fitur ini.

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

FAQ

Berapa banyak aplikasi yang dapat diizinkan di CarrierConfig.xml untuk suatu (MCC, MNC)?

Tidak ada batasan jumlah hash sertifikat yang disertakan dalam array.

Parameter CarrierConfig di CarrierConfig.xml mana yang perlu saya gunakan agar aplikasi diizinkan?

Gunakan item konfigurasi tingkat atas berikut dalam instance CarrierConfig.xml dari opsi AOSP yang Anda konfigurasi:

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

Apakah ada template CarrierConfig dasar yang dapat saya gunakan?

Gunakan template berikut. Ini harus ditambahkan ke aset yang relevan.

<?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>

Apakah SIM operator harus berada di perangkat untuk mengakses ID perangkat?

CarrierConfig.xml yang digunakan ditentukan berdasarkan SIM yang saat ini dimasukkan. Ini berarti bahwa jika aplikasi operator X mencoba mendapat hak akses saat SIM operator Y dimasukkan, perangkat tidak akan menemukan kecocokan untuk {i>hash<i} dan menghasilkan pengecualian keamanan.

Di perangkat multi-SIM, operator #1 hanya memiliki hak istimewa akses untuk SIM #1 dan sebaliknya.

Bagaimana cara operator mengonversi sertifikat penandatanganan aplikasi menjadi hash?

Untuk mengonversi sertifikat penandatanganan ke hash sebelum menambahkannya ke CarrierConfig.xml, lakukan tindakan berikut:

  1. Konversikan tanda tangan sertifikat penandatanganan ke susunan byte menggunakan toByteArray.
  2. Gunakan MessageDigest untuk mengonversi array byte menjadi hash dalam byte[].
  3. Konversi hash dari byte[] menjadi format string hex. Sebagai contoh, lihat 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. Jika certHashes adalah array berukuran 2 dengan nilai dari 12345 dan 54321, tambahkan kode berikut ke file konfigurasi operator seluler.

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