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ğlıyor. Android 10'dan önce kalıcı cihaz tanımlayıcıları (IMEI/MEID, IMSI, SIM ve seri oluşturma) READ_PHONE_STATE
çalışma zamanı izninin arkasında korunuyordu. READ_PRIVILEGED_PHONE_STATE
izni yalnızca platform anahtarıyla imzalanmış uygulamalara ve ayrıcalıklı sistem uygulamalarına verilir.
Yeni izin gereksinimlerine ilişkin 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
- Telefon Yöneticisi#getImei
- Telefon Yöneticisi#getMeid
- TelephonyManager#getSimSerialNumber
- TelephonyManager#getSubscriberId
- Build#getSerial
READ_PRIVILEGED_PHONE_STATE izni olmadan operatör uygulamalarına erişim
READ_PRIVILEGED_PHONE_STATE
iznine uygun olmayan önceden yüklenmiş operatör uygulamaları, aşağıdaki tabloda yer alan seçeneklerden birini uygulayabilir.
Seçenek | Tanım | 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örler, kolayca güncellenemeyen geniş ve yerleşik bir SIM popülasyonuna sahiptir. Ayrıca, yeni SIM'ler üzerinde yazma hakları olmayan operatörler (örneğin, MNO'lardan verilen SIM'lere sahip MVNO'lar), SIM'lere sertifika ekleyemez veya bu sertifikaları güncelleyemez. |
OEM izin verilenler listesine ekleme | 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. |
Tahsis kodunu (TAC) yazın | Üretici ve model bilgilerini döndüren TAC'yi ortaya çıkarmak için Android 10'da sunulan getTypeAllocationCode yöntemini kullanın. | TAC'deki bilgiler belirli bir cihazı tanımlamak için yetersizdir. |
MSISDN | Operatörler, arka uç sistemlerinde IMEI'yi aramak için TelephonyManager altında PHONE izin grubuyla mevcut olan telefon numarasını (MSISDN) kullanabilir. | Bu, taşıyıcılar için önemli yatırımlar gerektiriyor. Ağ anahtarlarını IMSI kullanarak eşleyen operatörlerin, MSISDN'ye geçiş yapmak için önemli teknik kaynaklara ihtiyaçları vardır. |
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. Bir eşleşme bulunursa istenen bilgiler döndürülür. Eşleşme bulunamazsa bir güvenlik istisnası döndürülür.
Bu çözümü uygulamak için taşıyıcıların şu adımları izlemesi GEREKİR:
-
CarrierConfig.xml
dosyasını operatör uygulamasının imzalama sertifikası karmasıyla güncelleyin ve bir yama gönderin . - OEM'lerden yapılarını QPR1+ (önerilen) VEYA bu gerekli platform yamaları ve yukarıdaki 1. adımdaki güncellenmiş
CarrierConfig.xml
dosyası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
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ı İzin Verilenler Listesine Ekleme konusuna bakın.
Etkilenen API'leri çağırmak için bir uygulamanın aşağıdaki gereksinimlerden birini karşılaması gerekir:
- Uygulama önceden yüklenmiş ayrıcalıklı bir uygulamaysa AndroidManifest.xml'de belirtilen
READ_PRIVILEGED_PHONE_STATE
iznine ihtiyacı vardır. Uygulamanın ayrıca bu ayrıcalıklı izni izin verilenler listesine eklemesi gerekiyor. - Google Play aracılığıyla sunulan uygulamaların operatör ayrıcalıklarına ihtiyacı vardır. UICC Operatör Ayrıcalıkları sayfasında operatör ayrıcalıkları verme hakkında daha fazla bilgi edinin.
-
READ_PHONE_STATE
izni verilen bir cihaz veya profil sahibi uygulaması.
Bu gereksinimlerin hiçbirini karşılamayan bir uygulama aşağıdaki davranışa sahiptir:
- Uygulama Q öncesi hedefliyorsa ve
READ_PHONE_STATE
iznine sahip değilseSecurityException
tetiklenir. Bu izin, bu API'leri çağırmak için gerekli olduğundan, mevcut Q öncesi davranış budur. - Uygulama Q öncesi hedefliyorsa ve
READ_PHONE_STATE
izni verilmişse, tüm TelephonyManager API'leri veBuild#getSerial
yöntemi içinBuild.UNKNOWN
için boş bir değer alır. - Uygulama Android 10 veya üstünü hedefliyorsa ve yeni gereksinimlerden herhangi birini karşılamıyorsa bir 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ı 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.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 (MCC, MNC) için CarrierConfig.xml
kaç uygulama izin verilenler listesine eklenebilir?
Diziye dahil edilen sertifika karmalarının sayısında herhangi bir sınırlama yoktur.
Bir uygulamanın izin verilenler listesine eklenmesi için CarrierConfig.xml
hangi CarrierConfig parametrelerini kullanmam gerekir?
Yapılandırdığınız AOSP seçeneklerinden belirli CarrierConfig.xml
dosyasında 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 varlığa 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
o anda takılı olan SIM'e göre belirlenir. Bu, operatör Y'nin SIM'i takılıyken operatör X'in uygulamasının erişim ayrıcalıkları almaya çalışması durumunda cihazın karma için bir eşleşme bulamayacağı ve bir güvenlik istisnası döndüreceği anlamına gelir.
Çoklu SIM cihazlarda, 1 numaralı operatörün yalnızca 1 numaralı SIM için erişim ayrıcalıkları vardır ve bunun tersi de geçerlidir.
Operatörler bir uygulamanın imzalama sertifikasını karmaya nasıl dönüştürür?
İmzalama sertifikalarını CarrierConfig.xml
dosyasına eklemeden önce karma değerine 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 bayt[] türünde bir karma değerine dönüştürmek için
MessageDigest
kullanın. Karmayı byte[]'dan onaltılık dize biçimine dönüştürün. Örnek için bkz.
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())); }
certHashes
değeri12345
ve54321
olan2
boyutunda bir diziyse, aşağıdakini taşıyıcı yapılandırma dosyasına ekleyin.<string-array name="carrier_certificate_string_array" num="2"> <item value="12345"/> <item value="54321"/> </string-array>