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 waktu proses READ_PHONE_STATE.
Izin READ_PRIVILEGED_PHONE_STATE hanya diberikan kepada 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
- TelephonyManager#getImei
- TelephonyManager#getMeid
- TelephonyManager#getSimSerialNumber
- TelephonyManager#getSubscriberId
- Build#getSerial
Akses untuk aplikasi operator tanpa izin READ_PRIVILEGED_PHONE_STATE
Aplikasi operator yang sudah dimuat 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 dapat diupdate dengan mudah. Selain itu, operator yang tidak memiliki hak penulisan untuk SIM baru (misalnya, MVNO yang memiliki SIM yang dikeluarkan dari MNO) tidak dapat menambahkan atau memperbarui sertifikat di SIM. |
| Daftar yang disetujui OEM | OEM dapat menggunakan OP_READ_DEVICE_IDENTIFIER untuk memberikan ID perangkat ke aplikasi operator yang masuk dalam daftar yang diizinkan. |
Solusi ini tidak dapat diskalakan 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 bagian
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 sumber daya teknis yang signifikan untuk beralih ke MSISDN. |
Aplikasi operator Semua dapat mengakses ID 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 SHA-1 atau SHA-256 dari 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:
- Perbarui
CarrierConfig.xmldengan hash sertifikat penandatanganan aplikasi operator dan kirimkan patch. - Minta OEM untuk mengupdate build mereka dengan QPR1+ (direkomendasikan) ATAU
patch platform yang diperlukan ini dan patch yang berisi
file
CarrierConfig.xmlyang diperbarui dari langkah 1 di atas.
Implementasi
Perbarui daftar aplikasi yang diizinkan untuk izin hak istimewa Anda guna memberikan izin READ_PRIVILEGED_PHONE_STATE kepada aplikasi hak istimewa yang memerlukan akses ke ID perangkat.
Untuk mempelajari lebih lanjut daftar yang diizinkan, lihat Daftar yang Diizinkan untuk Izin Istimewa.
Untuk memanggil API yang terpengaruh, aplikasi harus memenuhi salah satu persyaratan berikut:
- Jika aplikasi adalah aplikasi istimewa pramuat, aplikasi tersebut memerlukan
izin
READ_PRIVILEGED_PHONE_STATEyang dideklarasikan di AndroidManifest.xml. Aplikasi juga perlu memasukkan izin istimewa ini ke daftar yang diizinkan. - 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 salah satu persyaratan ini memiliki perilaku berikut:
- Jika aplikasi menargetkan versi sebelum Q dan tidak memiliki izin
READ_PHONE_STATEyang diberikan,SecurityExceptionakan dipicu. Ini adalah perilaku sebelum Q saat ini karena izin ini diperlukan untuk memanggil API ini. - Jika aplikasi menargetkan pra-Q dan telah diberikan izin
READ_PHONE_STATE, aplikasi akan menerima nilai null untuk semua API TelephonyManager danBuild.UNKNOWNuntuk metodeBuild#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) mencakup pengujian untuk memverifikasi perilaku akses ID perangkat yang diharapkan untuk aplikasi dengan hak istimewa operator, pemilik perangkat dan profil, serta aplikasi yang diharapkan tidak memiliki akses ke ID perangkat.
Pengujian CTS berikut khusus untuk fitur ini.
cts-tradefed run cts -m CtsCarrierApiTestCases -t android.carrierapi.cts.CarrierApiTestcts-tradefed run cts -m CtsTelephonyTestCases -t android.telephony.cts.TelephonyManagerTestcts-tradefed run cts -m CtsTelephony3TestCasescts-tradefed run cts -m CtsPermissionTestCases -t android.permission.cts.TelephonyManagerPermissionTestcts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t com.android.cts.devicepolicy.DeviceOwnerTest#testDeviceOwnerCanGetDeviceIdentifierscts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t com.android.cts.devicepolicy.ManagedProfileTest#testProfileOwnerCanGetDeviceIdentifierscts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t com.android.cts.devicepolicy.ManagedProfileTest#testProfileOwnerCannotGetDeviceIdentifiersWithoutPermissioncts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t com.android.cts.devicepolicy.DeviceOwnerTest#testDeviceOwnerCannotGetDeviceIdentifiersWithoutPermission
FAQ
Berapa banyak aplikasi yang dapat dimasukkan dalam daftar yang 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 dapat dimasukkan dalam daftar yang 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. 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 akses saat SIM operator Y dimasukkan, perangkat tidak akan menemukan
kecocokan untuk hash dan akan menampilkan 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:
- Konversi tanda tangan sertifikat penandatanganan menjadi array byte menggunakan
toByteArray. - Gunakan
MessageDigestuntuk mengonversi array byte menjadi hash dalam jenis byte[]. -
Konversi hash dari byte[] ke 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
certHashesadalah array berukuran2dengan nilai12345dan54321, tambahkan kode berikut ke file konfigurasi operator.<string-array name="carrier_certificate_string_array" num="2"> <item value="12345"/> <item value="54321"/> </string-array>