Pengenal Perangkat

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

Informasi lebih lanjut untuk 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
  • Bangun # getSerial

Akses untuk aplikasi operator tanpa izin READ_PRIVILEGED_PHONE_STATE

Dimuat aplikasi operator yang tidak memenuhi syarat untuk READ_PRIVILEGED_PHONE_STATE izin dapat menerapkan salah satu pilihan dalam tabel di bawah.

Pilihan Desciption Batasan
Hak istimewa operator UICC Platform Android memuat sertifikat yang disimpan di UICC dan memberikan izin kepada aplikasi yang ditandatangani oleh sertifikat ini untuk melakukan panggilan ke metode khusus. Operator lama memiliki populasi SIM yang besar dan mapan, yang tidak dapat diupdate dengan mudah. Selain itu, operator yang tidak memiliki hak otorisasi untuk SIM baru (misalnya, MVNO yang memiliki SIM yang dikeluarkan dari MNO) tidak dapat menambahkan atau memperbarui sertifikat di SIM.
Daftar putih OEM OEM dapat menggunakan OP_READ_DEVICE_IDENTIFIER untuk memberikan pengenal perangkat ke aplikasi operator yang masuk daftar putih. Solusi ini tidak dapat diskalakan untuk semua operator.
Jenis kode alokasi (TAC) Gunakan metode getTypeAllocationCode , yang diperkenalkan di Android 10, untuk mengekspos TAC yang mengembalikan info model dan pabrikan. Informasi di TAC tidak memadai untuk mengidentifikasi perangkat tertentu.
MSISDN Operator dapat menggunakan nomor telepon (MSISDN), tersedia di bawah TelephonyManager dengan grup izin PHONE , untuk mencari IMEI di sistem backend mereka. Ini membutuhkan investasi yang signifikan untuk operator. Operator yang memetakan kunci jaringan mereka menggunakan IMSI memerlukan sumber daya teknis yang signifikan untuk beralih ke MSISDN .

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

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

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

Penerapan

Perbarui daftar putih izin hak istimewa Anda untuk memberikan izin READ_PRIVILEGED_PHONE_STATE ke aplikasi istimewa yang memerlukan akses ke pengenal perangkat.

Untuk mempelajari lebih lanjut tentang daftar putih, lihat Daftar Putih Izin Hak Istimewa .

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

  • Jika aplikasi adalah aplikasi dengan hak istimewa yang dimuat sebelumnya, ia memerlukan izin READ_PRIVILEGED_PHONE_STATE dideklarasikan di AndroidManifest.xml. Aplikasi juga perlu memasukkan izin istimewa ini ke daftar putih.
  • Aplikasi yang dikirim melalui Google Play membutuhkan hak istimewa operator. Pelajari lebih lanjut tentang memberikan hak istimewa operator di halaman Hak Istimewa Operator UICC .
  • Perangkat atau aplikasi pemilik profil yang telah diberi izin READ_PHONE_STATE .

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

  • Jika aplikasi menargetkan sebelum Q dan tidak memiliki izin READ_PHONE_STATE diberikan, SecurityException akan dipicu. ini adalah perilaku pra-Q saat ini karena izin ini diperlukan untuk menjalankan API ini.
  • Jika aplikasi menargetkan pra-Q dan memiliki izin READ_PHONE_STATE diberikan, itu menerima nilai null untuk semua API TelephonyManager dan Build.UNKNOWN untuk metode Build#getSerial .
  • Jika aplikasi menargetkan Android 10 atau lebih tinggi dan tidak memenuhi salah satu dari persyaratan baru, maka itu menerima SecurityException.

Validasi dan pengujian

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

Tes 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 dimasukkan ke daftar putih di CarrierConfig.xml untuk suatu (MCC, MNC)?

Tidak ada batasan jumlah hash sertifikat yang disertakan dalam larik.

Parameter CarrierConfig mana di CarrierConfig.xml yang perlu saya gunakan agar aplikasi masuk daftar putih?

Gunakan item konfigurasi tingkat atas 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. 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 pengenal perangkat?

CarrierConfig.xml yang digunakan ditentukan berdasarkan SIM yang saat ini dimasukkan. Ini berarti bahwa jika aplikasi operator X mencoba mendapatkan hak akses saat SIM operator Y dimasukkan, perangkat tidak akan menemukan kecocokan untuk hash dan mengembalikan pengecualian keamanan.

Di perangkat multi-SIM, operator # 1 hanya memiliki hak 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. Ubah tanda tangan sertifikat penandatanganan menjadi array byte menggunakan toByteArray .
  2. Gunakan MessageDigest untuk mengubah array byte menjadi hash dalam tipe byte [].
  3. Ubah 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 larik berukuran 2 dengan nilai 12345 dan 54321 , tambahkan baris berikut ke file konfigurasi operator.

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