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 yapı seri numarası), READ_PHONE_STATE
çalışma zamanında izin arkasında 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 için 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
READ_PRIVILEGED_PHONE_STATE
iznine uygun olmayan önceden yüklenmiş 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 sertifikalar tarafından imzalanan uygulamalara özel yöntemlere çağrı yapma izni verir. | Eski operatörlerin büyük ve yerleşik bir SIM kitlesi vardır ve bu kitleyi güncellemek kolay değildir. Ayrıca, yeni SIM'ler için yazma hakları olmayan operatörler (ör. MNO'lardan SIM alan MVNO'lar) SIM'lere sertifika ekleyemez veya güncelleyemez. |
OEM'leri izin verilenler listesine ekleme | OEM'ler, izin verilenler listesine eklenen 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 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ğil. |
MSISDN | Operatörler, arka uç sistemlerinde IMEI'yi aramak için TelephonyManager altında PHONE izin grubuyla kullanılabilen telefon numarasını (MSISDN) kullanabilir. |
Bu, operatörler için önemli yatırımlar gerektirir. Ağ anahtarlarını IMSI kullanarak eşleyen operatörlerin MSISDN'ye geçmesi için önemli miktarda teknik kaynak 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 (sertifika için SHA-1 veya SHA-256 imzası) eşleşip eşleşmediğini kontrol eder. Eşleşme bulunursa istenen bilgiler döndürülür. Eşleşme bulunmazsa güvenlik istisnası döndürülür.
Bu çözümü uygulamak için operatörlerin aşağıdaki adımları UYGULAMASI GEREKİR:
-
CarrierConfig.xml
değerini operatör uygulamasının imzalama sertifikası karmasıyla güncelleyin ve yama gönderin. - OEM'lerden derlemelerini QPR1 veya sonraki bir sürümle (önerilir) VEYA yukarıdaki 1. adımdaki güncellenmiş
CarrierConfig.xml
dosyasını içeren bu zorunlu platform yamalarını güncellemelerini isteyin.
Uygulama
Cihaz tanımlayıcılarına erişmesi gereken ayrıcalıklı uygulamalara READ_PRIVILEGED_PHONE_STATE
izni vermek için ayrıcalıklı izin 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ğırabilmek için uygulamaların aşağıdaki koşullardan birini karşılaması gerekir:
- Uygulama önceden yüklenmiş ayrıcalıklı bir uygulamaysa AndroidManifest.xml dosyasında
READ_PRIVILEGED_PHONE_STATE
izninin beyan edilmesi gerekir. 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. Operatör ayrıcalıkları verme hakkında daha fazla bilgiyi UICC Operatör Ayrıcalıkları sayfasında bulabilirsiniz.
READ_PHONE_STATE
iznine sahip bir cihaz veya profil sahibi uygulaması.
Bu koşulların hiçbirini karşılamayan uygulamalar aşağıdaki davranışı gösterir:
- Uygulama, Q öncesi sürümleri hedefliyorsa ve
READ_PHONE_STATE
izni verilmiyorsaSecurityException
tetiklenir. Bu API'lerin çağrılması için bu iznin gerekli olması nedeniyle bu, Q öncesi sürümlerde geçerli davranıştır. - Uygulama Q öncesi sürümleri hedefliyorsa ve
READ_PHONE_STATE
izni verilmişse tüm TelephonyManager API'leri için boş bir değer,Build#getSerial
yöntemi için iseBuild.UNKNOWN
alır. - Uygulama Android 10 veya sonraki sürümleri hedefliyorsa ve yeni koşullardan hiçbirini karşılamıyorsa SecurityException alır.
Doğrulama ve test
Uyumluluk Test Paketi (CTS); operatör ayrıcalıklarına sahip uygulamalar, cihaz ve profil sahipleri ve cihaz tanımlayıcılarına erişimi olmaması beklenen uygulamalar için beklenen cihaz tanımlayıcısı erişim davranışını doğrulamaya yönelik testler içerir.
Aşağıdaki CTS testleri bu özelliğe özgüdür.
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
SSS
Belirli bir (MM, MCN) için CarrierConfig.xml
'te kaç uygulama izin verilenler listesine eklenebilir?
Diziye dahil edilen sertifika karmalarının sayısı için 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çeneklerinden 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. Yani X operatörünün uygulaması, Y operatörünün SIM kartı takılıyken erişim ayrıcalıkları elde etmeye çalışırsa cihaz karma oluşturma işlemi için eşleşme bulamaz ve bir güvenlik istisnası döndürür.
Çok SIM'li 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 oluşturma işlemine dönüştürür?
İmzalama sertifikalarını CarrierConfig.xml
'e eklemeden önce karma oluşturma işlemine dönüştürmek için aşağıdakileri yapın:
- İmzalama sertifikasının imzasını
toByteArray
kullanarak bir bayt dizisine dönüştürün. - Bayt dizisini byte[] türündeki bir karma oluşturma işlevine dönüştürmek için
MessageDigest
işlevini kullanın. -
Karma oluşturma işlemini byte[] biçiminden onaltılık dize biçimine dönüştürün. Örnek için
IccUtils.java
bö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
,12345
ve54321
değerine sahip2
boyutunda bir diziyse aşağıdakileri operatör yapılandırma dosyasına ekleyin.<string-array name="carrier_certificate_string_array" num="2"> <item value="12345"/> <item value="54321"/> </string-array>