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 tanımlayıcıları (IMEI/MEID, IMSI, SIM ve derleme seri numarası) READ_PHONE_STATE çalışma zamanı izniyle 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 olmadan operatör uygulamalarına 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 kullanıcı tabanı vardır. Bu kullanıcı tabanı kolayca güncellenemez. Ayrıca, yeni SIM'ler için yazma haklarına sahip olmayan operatörler (ör. MNO'lar tarafından verilen SIM'lere sahip MVNO'lar) SIM'lere sertifika ekleyemez veya SIM'lerdeki sertifikaları güncelleyemez. |
| OEM izin verilenler listesi | OEM'ler, izin verilen 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 ayırma kodu (TAC) | Üretici ve model bilgilerini döndüren TAC'yi kullanıma sunmak 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ğil. |
| 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örler için önemli bir yatırım 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ı ayrıcalıklı bilgileri okumak için bir yöntem çağırdığında platform, CarrierConfig.xml dosyasında uygulamanın imzalama sertifikası karmasının (sertifikanın SHA-1 veya SHA-256 imzası) eşleşmesini 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örler ŞU adımları uygulamalıdır:
-
CarrierConfig.xmlbölümünü operatör uygulamasının imzalama sertifikası karmasıyla güncelleyin ve yama gönderin. - OEM'lerden derlemelerini QPR1+ (önerilir) veya 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şmesi gereken 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ı İzinler İçin İzin Verilenler Listesi 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 (UICC Operatör Ayrıcalıkları) 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 izin, söz konusu API'lerin çağrılması için gerekli olduğundan bu, Q öncesi sürümlerdeki mevcut davranıştır. - Uygulama, Android 10'dan önceki sürümleri hedefliyorsa ve
READ_PHONE_STATEizni verilmişse tüm TelephonyManager API'leri için boş değer,Build#getSerialyöntemi için iseBuild.UNKNOWNdeğerini alı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
Uyumluluk Test Paketi (CTS), operatör ayrıcalıklarına, cihaz ve profil sahiplerine sahip uygulamalar ile cihaz tanımlayıcılarına erişiminin olmaması beklenen uygulamalar için beklenen cihaz tanımlayıcı erişim davranışını doğrulamaya yönelik 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?
Dizide yer alan sertifika karmalarının sayısıyla ilgili bir sınır 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çeneklerindeki belirli 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ılarına erişmek için operatör SIM'inin cihazda olması gerekir mi?
Kullanılan CarrierConfig.xml, şu 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.
Çok SIM'li cihazlarda 1. operatör yalnızca 1. SIM'e 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ğere dönüştürür?
İmzalama sertifikalarını CarrierConfig.xml'ya eklemeden önce anonimleştirme (hash) işlemine dönüştürmek için aşağıdakileri yapın:
- İmza sertifikasının imzasını
toByteArraykullanarak bayt dizisine dönüştürün. - Bayt dizisini byte[] türünde bir karma haline getirmek 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,2boyutunda bir dizi olup değeri12345ve54321ise 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>