Android 10, cihaz tanımlayıcılarının izinlerini değiştirerek tüm cihaz tanımlayıcılarının artık READ_PRIVILEGED_PHONE_STATE izniyle korunmasını sağlar. Android 10'dan önce kalıcı cihaz kimlik numaraları (IMEI/MEID, IMSI, SIM ve derleme seri numarası) READ_PHONE_STATE çalışma zamanında istenen izin ile korunuyordu.
READ_PRIVILEGED_PHONE_STATE izni yalnızca platform anahtarıyla imzalanan uygulamalara ve ayrıcalıklı sistem uygulamalarına verilir.
Yeni izin koşulları hakkında daha fazla bilgiyi TelephonyManager.java ve Build.java Javadoc sayfalarında bulabilirsiniz.
Bu değişiklik aşağıdaki API'leri etkiler:
- TelephonyManager#getDeviceId
- TelephonyManager#getImei
- TelephonyManager#getMeid
- TelephonyManager#getSimSerialNumber
- TelephonyManager#getSubscriberId
- Build#getSerial
READ_PRIVILEGED_PHONE_STATE izni olmayan operatör uygulamaları için erişim
Önceden yüklenmiş ve
READ_PRIVILEGED_PHONE_STATE
izni için uygun olmayan operatör uygulamaları, aşağıdaki tablodaki seçeneklerden birini uygulayabilir.
| Seçenek | Açıklama | Sınırlamalar |
|---|---|---|
| UICC operatör ayrıcalıkları | Android platformu, UICC'de depolanan sertifikaları yükler ve bu sertifikalarla imzalanan uygulamalara özel yöntemleri çağırma izni verir. | Eski operatörlerin büyük ve yerleşik bir SIM kart tabanı vardır. Bu taban kolayca güncellenemez. Ayrıca, yeni SIM'ler için yazma hakları olmayan operatörler (örneğin, MNO'lardan SIM'leri olan MVNO'lar) SIM'lere sertifika ekleyemez veya güncelleyemez. |
| OEM izin verilenler listesi | OEM'ler, izin verilenler listesindeki operatör uygulamalarına cihaz tanımlayıcıları sağlamak için OP_READ_DEVICE_IDENTIFIER kullanabilir. |
Bu çözüm, tüm operatörler için ölçeklenebilir değildir. |
| Tür tahsis kodu (TAC) | Üretici ve model bilgilerini döndüren TAC'yi göstermek için Android 10'da kullanıma sunulan getTypeAllocationCode yöntemini kullanın. |
TAC'deki bilgiler belirli bir cihazı tanımlamak için yeterli değildir. |
| MSISDN | Operatörler, arka uç sistemlerinde IMEI'yi aramak için TelephonyManager izin grubuyla birlikte PHONE altında bulunan telefon numarasını (MSISDN) kullanabilir. |
Bu, operatörlerin önemli yatırımlar yapmasını gerektirir. Ağ anahtarlarını IMSI kullanarak eşleyen operatörlerin MSISDN'ye geçiş yapması için önemli teknik kaynaklar gerekir. |
Tüm operatör uygulamaları, CarrierConfig.xml dosyasını operatör uygulamasının imzalama sertifikası karmasıyla güncelleyerek cihaz tanımlayıcılarına erişebilir. Operatör uygulaması, özel bilgileri okumak için bir yöntem çağırdığında platform, CarrierConfig.xml dosyasında uygulamanın imzalama sertifikası karmasıyla (sertifikanın SHA-1 veya SHA-256 imzası) eşleşen bir değer arar. Eşleşme bulunursa istenen bilgiler döndürülür. Eşleşme bulunamazsa güvenlik istisnası döndürülür.
Bu çözümü uygulamak için operatörlerin aşağıdaki adımları izlemesi GEREKİR:
-
CarrierConfig.xmlbölümünü operatör uygulamasının imzalama sertifikası karmasıyla güncelleyin ve yama gönderin. - OEM'lerden, derlemelerini QPR-1 veya daha yeni bir sürümle (önerilir) ya da bu gerekli platform yamaları ve yukarıdaki 1. adımda güncellenen
CarrierConfig.xmldosyasını içeren yama ile güncellemelerini isteyin.
Uygulama
Cihaz tanımlayıcılarına erişim gerektiren ayrıcalıklı uygulamalara READ_PRIVILEGED_PHONE_STATE iznini vermek için ayrıcalıklı izin verilenler listenizi güncelleyin.
İzin verilenler listesine ekleme hakkında daha fazla bilgi edinmek için Ayrıcalıklı İzinlerin İzin Verilenler Listesine Eklenmesi başlıklı makaleyi inceleyin.
Etkilenen API'leri çağırmak için uygulamanın aşağıdaki koşullardan birini karşılaması gerekir:
- Uygulama, önceden yüklenmiş ayrıcalıklı bir uygulama ise AndroidManifest.xml'de beyan edilen
READ_PRIVILEGED_PHONE_STATEiznine ihtiyaç duyar. Uygulamanın bu ayrıcalıklı izni izin verilenler listesine eklemesi de gerekir. - Google Play üzerinden sunulan uygulamalar için operatör ayrıcalıkları gerekir. UICC Carrier Privileges sayfasında operatör ayrıcalıkları verme hakkında daha fazla bilgi edinin.
READ_PHONE_STATEizni verilmiş bir cihaz veya profil sahibi uygulaması.
Bu şartlardan herhangi birini karşılamayan uygulamalar aşağıdaki gibi davranır:
- Uygulama Q öncesi sürümleri hedefliyorsa ve
READ_PHONE_STATEizni verilmemişseSecurityExceptiontetiklenir. Bu API'leri çağırmak için bu izin gerektiğinden, Q öncesi sürümlerdeki mevcut davranış budur. - Uygulama, Q öncesi sürümleri hedefliyorsa ve
READ_PHONE_STATEizni verilmişse tüm TelephonyManager API'leri için boş değer,Build#getSerialyöntemi içinBuild.UNKNOWNalır. - Uygulama Android 10 veya sonraki sürümleri hedefliyorsa ve yeni koşullardan herhangi birini karşılamıyorsa SecurityException alır.
Doğrulama ve test
Compatibility Test Suite (CTS), operatör ayrıcalıklarına sahip uygulamalar, cihaz ve profil sahipleri ile cihaz tanımlayıcılarına erişimi olmaması beklenen uygulamalar için beklenen cihaz tanımlayıcı erişim davranışını doğrulayan testler içerir.
Aşağıdaki CTS testleri bu özelliğe özeldir.
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
SSS
Belirli bir (MCC, MNC) için CarrierConfig.xml'da kaç uygulama izin verilenler listesine eklenebilir?
Dizideki sertifika karmalarının sayısıyla ilgili bir sınırlama yoktur.
Bir uygulamanın izin verilenler listesine eklenmesi için CarrierConfig.xml içindeki hangi CarrierConfig parametrelerini kullanmam gerekir?
Yapılandırdığınız AOSP seçenekleri arasından belirli bir CarrierConfig.xml içinde aşağıdaki üst düzey yapılandırma öğesini kullanın:
<string-array name="carrier_certificate_string_array" num="2">
<item value="BF02262E5EF59FDD53E57059082F1A7914F284B"/>
<item value="9F3868A3E1DD19A5311D511A60CF94D975A344B"/>
</string-array>Kullanabileceğim temel bir CarrierConfig şablonu var mı?
Aşağıdaki şablonu kullanın. Bu, ilgili öğeye eklenmelidir.
<?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>Cihaz tanımlayıcılara erişmek için operatör SIM'inin cihazda olması gerekir mi?
Kullanılan CarrierConfig.xml, o anda takılı olan SIM'e göre belirlenir. Bu nedenle, Y operatörünün SIM'i takılıyken X operatörünün uygulaması erişim ayrıcalıkları almaya çalışırsa cihaz, karma için eşleşme bulamaz ve güvenlik istisnası döndürür.
Çoklu SIM cihazlarda, 1. operatör yalnızca 1. SIM için erişim ayrıcalıklarına sahiptir ve bunun tersi de geçerlidir.
Operatörler, bir uygulamanın imzalama sertifikasını nasıl karma değerine dönüştürür?
İmzalama sertifikalarını CarrierConfig.xml'ya eklemeden önce anonimleştirmek için aşağıdakileri yapın:
-
toByteArraykullanarak imzalama sertifikasının imzasını bayt dizisine dönüştürün. - Bayt dizisini byte[] türünde karma olarak dönüştürmek için
MessageDigestkullanın. -
Karma değerini byte[] biçiminden onaltılık dize biçimine dönüştürün. Örnek için
IccUtils.javabölümüne bakın.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())); } certHashes,12345ve54321değerine sahip2boyutunda bir diziyse operatör yapılandırma dosyasına aşağıdakileri ekleyin.<string-array name="carrier_certificate_string_array" num="2"> <item value="12345"/> <item value="54321"/> </string-array>