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 serileri) 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 gereksinimleriyle ilgili daha fazla bilgi TelephonyManager.java ve Build.java için Javadoc sayfalarında bulunabilir.
Bu değişiklik aşağıdaki API'leri etkiler:
- TelephonyManager#getDeviceId
- Telefon Yöneticisi#getImei
- Telefon Yöneticisi#getMeid
- TelephonyManager#getSimSerialNumber
- TelephonyManager#getSubscriberId
- Oluştur#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 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örler, kolayca güncellenemeyen büyük, yerleşmiş 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 sertifikaları 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. |
Tip ayırma kodu (TAC) | Ü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 | Taşıyıcılar, arka uç sistemlerinde IMEI'yi aramak için PHONE izin grubuna sahip TelephonyManager altında bulunan telefon numarasını (MSISDN) kullanabilir. | Bu, taşıyıcılar için önemli bir yatırım gerektirir. Ağ anahtarlarını IMSI kullanarak eşleyen taşıyıcılar, MSISDN'ye geçmek için önemli teknik kaynaklar gerektirir. |
Tüm operatör uygulamaları, CarrierConfig.xml
dosyasını operatör uygulamasının imzalama sertifikası karması ile 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ı (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
operatör uygulamasının imzalama sertifikası karması ile 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 yamayı 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 İzin Verilenler Listesi'ne 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 bildirilen
READ_PRIVILEGED_PHONE_STATE
iznine ihtiyacı vardır. Uygulamanın ayrıca bu ayrıcalıklı izni izin verilenler listesine alması gerekiyor. - Google Play aracılığıyla teslim edilen uygulamalar, operatör ayrıcalıklarına ihtiyaç duyar. UICC Taşıyıcı Ayrıcalıkları sayfasında taşıyıcı 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 verilen
READ_PHONE_STATE
iznine sahip değilse,SecurityException
tetiklenir. Bu izin, bu API'leri çağırmak için gerekli olduğundan, geçerli Q öncesi davranıştır. - Uygulama Q öncesi hedefliyorsa ve
READ_PHONE_STATE
izni verilmişse, tüm TelephonyManager API'leri için boş bir değer veBuild#getSerial
yöntemi içinBuild.UNKNOWN
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 etme
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 (MM, MNC) için CarrierConfig.xml
kaç uygulama izin verilenler listesine alınabilir?
Diziye dahil edilen sertifika karmalarının sayısında bir sınır 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
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 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ün SIM'inin cihazda olması gerekir mi?
Kullanılan CarrierConfig.xml
takılı olan SIM'e göre belirlenir. Bu, X operatörünün uygulaması, Y operatörünün SIM'i takılıyken erişim ayrıcalıkları almaya çalışırsa, cihazın hash için bir eşleşme bulmayacağı ve bir güvenlik istisnası döndüreceği anlamına gelir.
Çoklu SIM cihazlarda, operatör #1 yalnızca SIM #1 için erişim ayrıcalıklarına sahiptir ve bunun tersi de geçerlidir.
Operatörler, bir uygulamanın imza sertifikasını bir hash'e nasıl dönüştürür?
İmza sertifikalarını CarrierConfig.xml
dosyasına eklemeden önce bir karmaya dönüştürmek için aşağıdakileri yapın:
-
toByteArray
kullanarak imzalama sertifikasının imzasını bir bayt dizisine dönüştürün. - Bayt dizisini byte[] türünde bir karmaya dönüştürmek için
MessageDigest
kullanın. Bayt[]'tan hash'i onaltılı dize biçimine dönüştürün. Bir ö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
,12345
ve54321
değerine sahip2
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>