Cihaz tanımlayıcıları

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:

  1. CarrierConfig.xml bölümünü operatör uygulamasının imzalama sertifikası karmasıyla güncelleyin ve yama gönderin.
  2. 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.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 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_STATE iznine 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_STATE izni 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_STATE izni verilmemişse SecurityException tetiklenir. 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_STATE izni verilmişse tüm TelephonyManager API'leri için boş değer, Build#getSerial yöntemi için Build.UNKNOWN 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

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.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'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:

  1. toByteArray kullanarak imzalama sertifikasının imzasını bayt dizisine dönüştürün.
  2. Bayt dizisini byte[] türünde karma olarak dönüştürmek için MessageDigest kullanın.
  3. Karma değerini 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()));
    }
  4. certHashes, 12345 ve 54321 değerine sahip 2 boyutunda 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>