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ğ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:

  1. CarrierConfig.xml dosyasını operatör uygulamasının imzalama sertifikası karmasıyla güncelleyin ve bir yama gönderin .
  2. 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ğilse SecurityException 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 ve Build#getSerial yöntemi için Build.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:

  1. İmzalama sertifikasının imzasını toByteArray kullanarak bir bayt dizisine dönüştürün.
  2. Bayt dizisini bayt[] türünde bir karma değerine dönüştürmek için MessageDigest kullanın.
  3. 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()));
    }
    
  4. certHashes değeri 12345 ve 54321 olan 2 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>