ID perangkat

Android 10 mengubah izin untuk ID perangkat sehingga semua ID perangkat kini dilindungi oleh izin READ_PRIVILEGED_PHONE_STATE. Sebelum Android 10, ID perangkat tetap (IMEI/MEID, IMSI, SIM, dan nomor seri 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 tentang persyaratan izin baru dapat ditemukan di halaman Javadoc untuk TelephonyManager.java dan Build.java.

Perubahan ini memengaruhi API berikut:

  • TelephonyManager#getDeviceId
  • TelephonyManager#getImei
  • TelephonyManager#getMeid
  • TelephonyManager#getSimSerialNumber
  • TelephonyManager#getSubscriberId
  • Build#getSerial

Akses untuk aplikasi operator tanpa izin READ_PRIVILEGED_PHONE_STATE

Aplikasi operator pramuat yang tidak memenuhi syarat untuk izin READ_PRIVILEGED_PHONE_STATE 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 ke aplikasi yang ditandatangani oleh sertifikat ini untuk melakukan panggilan ke metode khusus. Operator lama memiliki populasi SIM yang besar dan mapan, yang tidak mudah diupdate. Selain itu, operator yang tidak memiliki hak penulisan untuk SIM baru (misalnya, MVNO yang memiliki SIM yang diterbitkan dari MNO) tidak dapat menambahkan atau memperbarui sertifikat di SIM.
Daftar yang diizinkan OEM OEM dapat menggunakan OP_READ_DEVICE_IDENTIFIER untuk memberikan ID perangkat ke aplikasi operator yang diizinkan. Solusi ini tidak skalabel untuk semua operator.
Kode alokasi jenis (TAC) Gunakan metode getTypeAllocationCode, yang diperkenalkan di Android 10, untuk mengekspos TAC yang menampilkan info produsen dan model. Informasi dalam TAC tidak memadai untuk mengidentifikasi perangkat tertentu.
MSISDN Operator dapat menggunakan nomor telepon (MSISDN), yang tersedia di TelephonyManager dengan grup izin PHONE, untuk mencari IMEI di sistem backend mereka. Hal ini memerlukan investasi yang signifikan bagi operator. Operator yang memetakan kunci jaringan mereka menggunakan IMSI memerlukan resource teknis yang signifikan untuk beralih ke MSISDN.

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

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

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

Implementasi

Perbarui daftar aplikasi yang diizinkan untuk izin hak istimewa guna memberikan izin READ_PRIVILEGED_PHONE_STATE ke aplikasi hak istimewa yang memerlukan akses ke ID perangkat.

Untuk mempelajari lebih lanjut daftar yang diizinkan, lihat Daftar Izin Berhak Istimewa yang Diizinkan.

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

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

Aplikasi yang tidak memenuhi persyaratan ini memiliki perilaku berikut:

  • Jika aplikasi menargetkan pra-Q dan tidak memiliki izin READ_PHONE_STATE yang diberikan, SecurityException akan dipicu. Ini adalah perilaku pra-Q saat ini karena izin ini diperlukan untuk memanggil API ini.
  • Jika aplikasi menargetkan pra-Q dan memiliki izin READ_PHONE_STATE yang 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 persyaratan baru, aplikasi akan menerima SecurityException.

Validasi dan pengujian

Compatibility Test Suite (CTS) menyertakan pengujian untuk memverifikasi perilaku akses ID perangkat yang diharapkan untuk aplikasi dengan hak istimewa operator, pemilik perangkat dan profil, serta aplikasi yang diperkirakan tidak memiliki akses ke ID perangkat.

Pengujian CTS berikut khusus 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 (MCC, MNC) tertentu?

Tidak ada batasan jumlah hash sertifikat yang disertakan dalam array.

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

Gunakan item konfigurasi tingkat teratas berikut dalam CarrierConfig.xml tertentu 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. Hal 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. Artinya, jika aplikasi operator X mencoba mendapatkan hak istimewa akses saat SIM operator Y dimasukkan, perangkat tidak akan menemukan kecocokan untuk hash dan menampilkan pengecualian keamanan.

Pada 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 menjadi hash sebelum menambahkannya ke CarrierConfig.xml, lakukan hal berikut:

  1. Konversikan tanda tangan sertifikat penandatanganan menjadi array byte menggunakan toByteArray.
  2. Gunakan MessageDigest untuk mengonversi array byte menjadi hash dalam jenis byte[].
  3. Mengonversi hash dari byte[] menjadi format string hex. Untuk 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 12345 dan 54321, tambahkan kode berikut ke file konfigurasi operator.

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