Cihaz Tanımlayıcıları

Android 10, tüm cihaz tanımlayıcılarının artık READ_PRIVILEGED_PHONE_STATE izniyle korunmasını sağlamak için cihaz tanımlayıcıların izinlerini değiştirir. 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ı izniyle korunuyordu. READ_PRIVILEGED_PHONE_STATE izni yalnızca platform anahtarı ve ayrıcalıklı sistem uygulamaları ile imzalanmış uygulamalara verilir.

Yeni izin gereksinimleri için 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
  • TelephonyManager # getImei
  • TelephonyManager # getMeid
  • TelephonyManager # getSimSerialNumber
  • TelephonyManager # getSubscriberId
  • Build # getSerial

READ_PRIVILEGED_PHONE_STATE izni olmadan operatör uygulamalarına erişim

READ_PRIVILEGED_PHONE_STATE izni için uygun olmayan önceden yüklenmiş taşıyıcı uygulamaları, aşağıdaki tablodaki seçeneklerden birini uygulayabilir.

Opsiyon Açıklama Sınırlamalar
UICC taşıyıcı ayrıcalıkları Android platformu, UICC'de depolanan sertifikaları yükler ve bu sertifikalarla imzalanan uygulamalara özel yöntemlere çağrı yapmak için izin verir. Eski operatörler, kolayca güncellenemeyen büyük, yerleşik bir SIM popülasyonuna sahiptir. Ayrıca, yeni SIM'lere yazma haklarına sahip olmayan taşıyıcılar (örneğin, MNO'lardan verilen SIM'leri olan MVNO'lar) SIM'lere sertifika ekleyemez veya bunları güncelleyemez.
OEM beyaz listesi OEM'ler, beyaz listedeki 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 tahsis kodu (TAC) Üretici ve model bilgilerini döndüren getTypeAllocationCode 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 grubu ile TelephonyManager altında bulunan telefon numarasını (MSISDN) kullanabilir. Bu, taşıyıcılar için önemli bir yatırım gerektirir. IMSI kullanarak ağ anahtarlarını eşleyen taşıyıcılar, MSISDN'ye geçmek için önemli teknik kaynaklara ihtiyaç duyar.

Tüm operatör uygulamaları, CarrierConfig.xml dosyasını taşıyıcı uygulamasının imzalama sertifikası karmasıyla güncelleyerek cihaz tanımlayıcılarına erişebilir. Taşıyıcı uygulaması ayrıcalıklı bilgileri okumak için bir yöntemi ç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 bulunmazsa, 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 , taşıyıcı uygulamasının imza sertifikası karmasıyla güncelleyin ve bir yama gönderin .
  2. OEM'lerden yapılarını QPR1 + (önerilen) ile güncellemelerini veya bu gerekli platform yamalarını ve yukarıdaki 1. adımdan güncellenmiş CarrierConfig.xml dosyasını içeren yamayı güncellemelerini CarrierConfig.xml .

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 beyaz listenizi güncelleyin.

Beyaz listeye ekleme hakkında daha fazla bilgi edinmek için Ayrıcalıklı İzni Beyaz Listeye 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 uygulama ise, AndroidManifest.xml'de belirtilen READ_PRIVILEGED_PHONE_STATE iznine ihtiyacı vardır. Uygulamanın ayrıca bu ayrıcalıklı izni beyaz listeye alması gerekir.
  • Google Play üzerinden sunulan uygulamaların operatör ayrıcalıklarına ihtiyacı vardır. UICC Taşıyıcı Ayrıcalıkları sayfasından taşıyıcı ayrıcalıkları verme hakkında daha fazla bilgi edinin.
  • READ_PHONE_STATE izni verilmiş bir cihaz veya profil sahibi uygulaması.

Bu gereksinimlerin hiçbirini karşılamayan bir uygulama aşağıdaki davranışa sahiptir:

  • Uygulama Q öncesi hedefliyse ve verilen READ_PHONE_STATE iznine sahip değilse, SecurityException tetiklenir. Bu, bu API'leri çağırmak için bu izin gerekli olduğundan, bu mevcut Q öncesi davranıştır.
  • Uygulamanın öncesi Q hedefleyen ve varsa yoksa READ_PHONE_STATE izni verilmiş, bu TelephonyManager API'leri ve tümü için boş bir değer alır Build.UNKNOWN için Build#getSerial yöntemiyle.
  • 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 testleri 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

Sıkça Sorulan Sorular

Belirli bir (MCC, MNC) için CarrierConfig.xml kaç uygulama beyaz listeye alınabilir?

Diziye dahil edilen sertifika karmalarının sayısında bir sınır yoktur.

Bir uygulamanın beyaz listeye alınması için CarrierConfig.xml hangi CarrierConfig parametrelerini kullanmam gerekir?

Yapılandırmakta olduğunuz AOSP seçeneklerinden belirli CarrierConfig.xml içindeki 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'in cihazda olması gerekir mi?

Kullanılan CarrierConfig.xml , o anda takılı olan SIM'e göre belirlenir. Bu, taşıyıcı X'in uygulaması, taşıyıcı Y'nin SIM'i takılıyken erişim ayrıcalıkları almaya çalışırsa, cihazın karma için bir eşleşme bulamayacağı ve bir güvenlik istisnası döndürdüğü 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.

Taşıyıcılar bir uygulamanın imzalama sertifikasını karmaya nasıl dönüştürür?

İmzalama sertifikalarını CarrierConfig.xml eklemeden önce bir karmaya dönüştürmek için aşağıdakileri yapın:

  1. İmzalama sertifikasının imzasını toByteArray kullanarak bir bayt dizisine toByteArray .
  2. Bayt dizisini bayt [] türünde bir karmaya dönüştürmek için MessageDigest kullanın.
  3. Karma değerini [] baytından onaltılık dizge 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()));
    }
    
  4. certHashes , 12345 ve 54321 değerine sahip 2 boyutlu bir certHashes , taşıyıcı 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>