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:
- Perbarui
CarrierConfig.xml
dengan hash sertifikat penandatanganan aplikasi operator dan mengirimkan patch. - 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 danBuild.UNKNOWN
untuk metodeBuild#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:
- Konversikan tanda tangan sertifikat penandatanganan
ke susunan byte menggunakan
toByteArray
. - Gunakan
MessageDigest
untuk mengonversi array byte menjadi hash dalam byte[]. -
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())); }
Jika
certHashes
adalah array berukuran2
dengan nilai dari12345
dan54321
, 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>