Google si impegna a promuovere l'equità razziale per le comunità nere. Vedi come.
Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Identificatori del dispositivo

Android 10 modifica le autorizzazioni per gli identificatori di dispositivo in modo che tutti gli identificatori di dispositivo siano ora protetti dall'autorizzazione READ_PRIVILEGED_PHONE_STATE . Prima di Android 10, gli identificatori di dispositivo persistenti (IMEI / MEID, IMSI, SIM e build serial) erano protetti dietro l'autorizzazione di runtime READ_PHONE_STATE . L'autorizzazione READ_PRIVILEGED_PHONE_STATE è concessa solo alle app firmate con la chiave della piattaforma e le app di sistema privilegiate.

Ulteriori informazioni per i nuovi requisiti di autorizzazione sono disponibili nelle pagine Javadoc per TelephonyManager.java e Build.java .

Questa modifica riguarda le seguenti API:

  • TelephonyManager # GetDeviceID
  • TelephonyManager # getImei
  • TelephonyManager # getMeid
  • TelephonyManager # getSimSerialNumber
  • TelephonyManager # getSubscriberId
  • Build # getSerial

Accesso per le app di operatore senza l'autorizzazione READ_PRIVILEGED_PHONE_STATE

Le app di READ_PRIVILEGED_PHONE_STATE precaricate che non si qualificano per l'autorizzazione READ_PRIVILEGED_PHONE_STATE possono implementare una delle opzioni nella tabella seguente.

Opzione desciption limitazioni
Privilegi dell'operatore UICC La piattaforma Android carica i certificati archiviati nell'UICC e concede l'autorizzazione alle app firmate da questi certificati per effettuare chiamate a metodi speciali. I gestori legacy hanno una vasta e consolidata popolazione SIM, che non è facilmente aggiornabile. Inoltre, i gestori che non dispongono dei diritti di creazione di nuove SIM (ad esempio, MVNO che dispongono di SIM emesse da MNO) non possono aggiungere o aggiornare certificati sulle SIM.
Lista bianca OEM Gli OEM possono utilizzare OP_READ_DEVICE_IDENTIFIER per fornire identificatori di dispositivo alle app di operatore autorizzate. Questa soluzione non è scalabile per tutti i gestori.
Digitare il codice di allocazione (TAC) Utilizzare il metodo getTypeAllocationCode , introdotto in Android 10, per esporre il TAC che restituisce le informazioni sul produttore e sul modello. Le informazioni nel TAC sono inadeguate per identificare un dispositivo specifico.
MSISDN I gestori possono utilizzare il numero di telefono (MSISDN), disponibile in TelephonyManager con il gruppo di autorizzazioni PHONE , per cercare l'IMEI sui loro sistemi di back-end. Ciò richiede investimenti significativi per i vettori. I gestori che mappano le loro chiavi di rete utilizzando IMSI richiedono risorse tecniche significative per passare a MSISDN .

Tutte le app del gestore telefonico possono accedere agli identificativi del dispositivo aggiornando il file CarrierConfig.xml con l'hash del certificato di firma dell'app del gestore CarrierConfig.xml . Quando l'app di operatore chiama un metodo per leggere informazioni privilegiate, la piattaforma cerca una corrispondenza dell'hash del certificato di firma dell'app (firma SHA-1 o SHA-256 del certificato) nel file CarrierConfig.xml . Se viene trovata una corrispondenza, vengono restituite le informazioni richieste. Se non viene trovata alcuna corrispondenza, viene restituita un'eccezione di sicurezza.

Per implementare questa soluzione, i gestori DEVONO seguire questi passaggi:

  1. Aggiorna CarrierConfig.xml con l'hash del certificato di firma dell'app di corriere e invia una patch .
  2. Richiedi agli OEM di aggiornare la loro build con QPR1 + (consigliato) OPPURE queste patch della piattaforma richieste e la patch contenente il file CarrierConfig.xml aggiornato dal passaggio 1 sopra.

Implementazione

Aggiorna la tua READ_PRIVILEGED_PHONE_STATE bianca di autorizzazioni privilegiate per concedere l'autorizzazione READ_PRIVILEGED_PHONE_STATE a quelle app privilegiate che richiedono l'accesso agli identificatori di dispositivo.

Per ulteriori informazioni sulla whitelisting, consultare Whitelisting con autorizzazione privilegiata .

Per richiamare le API interessate, un'app deve soddisfare uno dei seguenti requisiti:

  • Se l'app è un'applicazione privilegiata precaricata, è necessaria l'autorizzazione READ_PRIVILEGED_PHONE_STATE dichiarata in AndroidManifest.xml. L'app deve anche autorizzare questa autorizzazione privilegiata.
  • Le app fornite tramite Google Play richiedono privilegi di operatore. Ulteriori informazioni sulla concessione dei privilegi di operatore sulla pagina Privilegi vettore UICC .
  • READ_PHONE_STATE proprietario del dispositivo o del profilo a cui è stata concessa l'autorizzazione READ_PHONE_STATE .

Un'app che non soddisfa nessuno di questi requisiti ha il seguente comportamento:

  • Se l'app ha come target pre-Q e non dispone dell'autorizzazione READ_PHONE_STATE concessa, viene attivato SecurityException . questo è l'attuale comportamento pre-Q poiché è necessaria questa autorizzazione per invocare queste API.
  • Se l'app ha come target pre-Q e dispone dell'autorizzazione READ_PHONE_STATE concessa, riceve un valore null per tutte le API di TelephonyManager e Build.UNKNOWN per il metodo Build#getSerial .
  • Se l'app ha come target Android 10 o versioni successive e non soddisfa nessuno dei nuovi requisiti, riceve SecurityException.

Convalida e test

La Suite di test di compatibilità (CTS) include test per verificare il comportamento previsto dell'accesso all'identificatore del dispositivo per le app con privilegi di operatore, i proprietari dei dispositivi e dei profili e quelle app che non dovrebbero avere accesso agli identificatori del dispositivo.

I seguenti test CTS sono specifici di questa funzione.

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