Android 10 mengubah izin pengidentifikasi perangkat sehingga semua pengidentifikasi perangkat kini dilindungi oleh izin READ_PRIVILEGED_PHONE_STATE
. Sebelum Android 10, pengidentifikasi perangkat persisten (IMEI/MEID, IMSI, SIM, dan serial build) dilindungi dengan izin runtime READ_PHONE_STATE
. Izin READ_PRIVILEGED_PHONE_STATE
hanya diberikan kepada aplikasi yang ditandatangani dengan kunci platform dan aplikasi sistem yang memiliki hak istimewa.
Informasi lebih lanjut mengenai persyaratan izin baru dapat ditemukan di halaman Javadoc untuk TelephonyManager.java dan Build.java .
Perubahan ini memengaruhi API berikut:
- TelephonyManager#getDeviceId
- Manajer Telepon#getImei
- Manajer Telepon#getMeid
- TelephonyManager#dapatkanSimSerialNumber
- TelephonyManager#getSubscriberId
- Bangun#getSerial
Akses untuk aplikasi operator tanpa izin READ_PRIVILEGED_PHONE_STATE
Aplikasi operator bawaan yang tidak memenuhi syarat izin READ_PRIVILEGED_PHONE_STATE
dapat menerapkan salah satu opsi pada tabel di bawah.
Pilihan | Keterangan | Keterbatasan |
---|---|---|
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, sehingga tidak mudah diperbarui. Selain itu, operator yang tidak memiliki hak pembuatan SIM baru (misalnya, MVNO yang SIMnya diterbitkan dari MNO) tidak dapat menambah atau memperbarui sertifikat pada SIM tersebut. |
daftar OEM yang diizinkan | OEM dapat menggunakan OP_READ_DEVICE_IDENTIFIER untuk memberikan pengidentifikasi perangkat ke aplikasi operator yang diizinkan. | Solusi ini tidak dapat diskalakan untuk semua operator. |
Ketik kode alokasi (TAC) | Gunakan metode getTypeAllocationCode , yang diperkenalkan di Android 10, untuk mengekspos TAC yang mengembalikan informasi pabrikan dan model. | Informasi di 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 besar bagi operator. Operator yang memetakan kunci jaringan mereka menggunakan IMSI memerlukan sumber daya teknis yang signifikan untuk beralih ke MSISDN . |
Semua aplikasi operator dapat mengakses pengidentifikasi perangkat dengan memperbarui file CarrierConfig.xml
dengan hash sertifikat penandatanganan aplikasi operator. Saat aplikasi operator memanggil metode untuk membaca informasi istimewa, platform akan mencari kecocokan hash sertifikat penandatanganan aplikasi (tanda tangan sertifikat SHA-1 atau SHA-256) di file CarrierConfig.xml
. Jika ditemukan kecocokan, informasi yang diminta dikembalikan. Jika tidak ditemukan kecocokan, pengecualian keamanan dikembalikan.
Untuk menerapkan solusi ini, operator HARUS mengikuti langkah-langkah berikut:
- Perbarui
CarrierConfig.xml
dengan hash sertifikat penandatanganan aplikasi operator dan kirimkan tambalan . - Minta OEM untuk memperbarui build mereka dengan QPR1+ (disarankan) ATAU patch platform yang diperlukan ini dan patch yang berisi file
CarrierConfig.xml
yang diperbarui dari langkah 1 di atas.
Penerapan
Perbarui daftar izin hak istimewa Anda untuk memberikan izin READ_PRIVILEGED_PHONE_STATE
kepada aplikasi dengan hak istimewa yang memerlukan akses ke pengidentifikasi perangkat.
Untuk mempelajari lebih lanjut tentang daftar yang diizinkan, lihat Daftar Izin Izin Istimewa .
Untuk memanggil API yang terpengaruh, aplikasi harus memenuhi salah satu persyaratan berikut:
- Jika aplikasi merupakan aplikasi istimewa yang dimuat sebelumnya, aplikasi memerlukan izin
READ_PRIVILEGED_PHONE_STATE
yang dinyatakan di AndroidManifest.xml. Aplikasi juga perlu mengizinkan izin istimewa ini. - Aplikasi yang dikirimkan melalui Google Play memerlukan hak istimewa operator. Pelajari lebih lanjut tentang memberikan hak istimewa kepada operator di halaman Hak Istimewa Operator UICC .
- Aplikasi pemilik perangkat atau profil yang telah diberikan izin
READ_PHONE_STATE
.
Aplikasi yang tidak memenuhi salah satu persyaratan ini akan berperilaku sebagai berikut:
- Jika aplikasi menargetkan pra-Q dan tidak diberikan izin
READ_PHONE_STATE
,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 API TelephonyManager danBuild.UNKNOWN
untuk metodeBuild#getSerial
. - Jika aplikasi menargetkan Android 10 atau lebih tinggi dan tidak memenuhi salah satu persyaratan baru, maka aplikasi akan menerima SecurityException.
Validasi dan pengujian
Compatibility Test Suite (CTS) mencakup pengujian untuk memverifikasi perilaku akses pengidentifikasi perangkat yang diharapkan untuk aplikasi dengan hak istimewa operator, pemilik perangkat dan profil, serta aplikasi yang diperkirakan tidak memiliki akses ke pengidentifikasi 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 diizinkan di CarrierConfig.xml
untuk suatu aplikasi tertentu (MCC, MNC)?
Tidak ada batasan jumlah hash sertifikat yang disertakan dalam array.
Parameter CarrierConfig manakah di CarrierConfig.xml
yang perlu saya gunakan agar aplikasi diizinkan?
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 templat dasar CarrierConfig yang dapat saya gunakan?
Gunakan templat 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 ada di dalam perangkat untuk mengakses pengenal perangkat?
CarrierConfig.xml
yang digunakan ditentukan berdasarkan SIM yang dimasukkan saat ini. Artinya jika aplikasi operator X mencoba mendapatkan hak akses saat SIM operator Y dimasukkan, perangkat tidak akan menemukan kecocokan untuk hash dan mengembalikan pengecualian keamanan.
Pada 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:
- Konversikan tanda tangan sertifikat penandatanganan menjadi array byte menggunakan
toByteArray
. - Gunakan
MessageDigest
untuk mengonversi array byte menjadi hash dalam tipe byte[]. 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())); }
Jika
certHashes
adalah larik berukuran2
dengan nilai12345
dan54321
, tambahkan kode berikut ke file konfigurasi operator.<string-array name="carrier_certificate_string_array" num="2"> <item value="12345"/> <item value="54321"/> </string-array>