Android 5.1 ha introdotto un meccanismo per concedere privilegi speciali per le API rilevanti per i proprietari di app UICC (Universal Integrated Circuit Card). La piattaforma Android carica i certificati archiviati su un UICC e concede l'autorizzazione alle app firmate da questi certificati per effettuare chiamate a una manciata di API speciali.
Android 7.0 ha esteso questa funzione per supportare altre fonti di archiviazione per le regole sui privilegi del gestore UICC, aumentando notevolmente il numero di gestori che possono utilizzare le API. Per un riferimento API, vedere CarrierConfigManager ; per istruzioni, vedere Configurazione portante .
I gestori hanno il pieno controllo dell'UICC, quindi questo meccanismo fornisce un modo sicuro e flessibile per gestire le app dell'operatore di rete mobile (MNO) ospitate su canali di distribuzione di app generiche (come Google Play) mantenendo privilegi speciali sui dispositivi e senza la necessità per firmare app con il certificato della piattaforma per dispositivo o preinstallare come app di sistema.
Regole sull'UICC
Lo storage su UICC è compatibile con la specifica GlobalPlatform Secure Element Access Control . L'identificatore dell'applicazione (AID) sulla scheda è A00000015141434C00
e il comando GET DATA
standard viene utilizzato per recuperare le regole memorizzate sulla scheda. Puoi aggiornare queste regole tramite gli aggiornamenti OTA (card over-the-air).
Gerarchia dei dati
Le regole UICC utilizzano la seguente gerarchia di dati (la combinazione di lettere e numeri di due caratteri tra parentesi è il tag dell'oggetto). Ogni regola è REF-AR-DO
( E2
) e consiste in una concatenazione di REF-DO
e AR-DO
:
-
REF-DO
(E1
) contieneDeviceAppID-REF-DO
o una concatenazione diDeviceAppID-REF-DO
ePKG-REF-DO
.-
DeviceAppID-REF-DO
(C1
) memorizza la firma SHA-1 (20 byte) o SHA-256 (32 byte) del certificato. -
PKG-REF-DO
(CA
) è la stringa del nome completo del pacchetto definita nel manifest, codifica ASCII, lunghezza massima 127 byte.
-
-
AR-DO
(E3
) viene esteso per includerePERM-AR-DO
(DB
), che è una maschera di bit a 8 byte che rappresenta 64 autorizzazioni separate.
Se PKG-REF-DO
non è presente, viene concesso l'accesso a qualsiasi app firmata dal certificato; in caso contrario, sia il certificato che il nome del pacchetto devono corrispondere.
Esempio di regola
Il nome dell'app è com.google.android.apps.myapp
e il certificato SHA-1 nella stringa esadecimale è:
AB:CD:92:CB:B1:56:B2:80:FA:4E:14:29:A6:EC:EE:B6:E5:C1:BF:E4
La regola su UICC nella stringa esadecimale è:
E243 <= 43 is value length in hex E135 C114 ABCD92CBB156B280FA4E1429A6ECEEB6E5C1BFE4 CA1D 636F6D2E676F6F676C652E616E64726F69642E617070732E6D79617070 E30A DB08 0000000000000001
Accesso al supporto dei file delle regole
Android 7.0 aggiunge il supporto per la lettura delle regole sui privilegi del vettore dal file delle regole di accesso (ARF).
La piattaforma Android tenta innanzitutto di selezionare l'applicazione della regola di accesso (ARA) AID A00000015141434C00
. Se non trova l'AID sull'UICC, ricade su ARF selezionando PKCS15 AID A000000063504B43532D3135
. Android quindi legge il file delle regole di controllo degli accessi (ACRF) in 0x4300
e cerca le voci con AID FFFFFFFFFFFF
. Le voci con AID diversi vengono ignorate, quindi le regole per altri casi d'uso possono coesistere.
Esempio di contenuto ACRF in stringa esadecimale:
30 10 A0 08 04 06 FF FF FF FF FF FF 30 04 04 02 43 10
Esempio di contenuto del file delle condizioni di controllo dell'accesso (ACCF):
30 16 04 14 61 ED 37 7E 85 D3 86 A8 DF EE 6B 86 4B D8 5B 0B FA A5 AF 81
Nell'esempio precedente, 0x4310
61:ED:37:7E:85:D3:86:A8:DF:EE:6B:86:4B:D8:5B:0B:FA:A5:AF:81
. Alle app firmate da questo certificato vengono concessi privilegi di operatore.
API abilitate
Android supporta le seguenti API.
Gestore di telefonia
- Metodo per consentire all'app dell'operatore di chiedere a UICC una sfida/risposta:
getIccAuthentication
. - Metodo per verificare se all'app chiamante sono stati concessi privilegi di operatore:
hasCarrierPrivileges
. - Metodi per sovrascrivere marca e numero:
- Modalità di comunicazione diretta UICC:
- Metodo per impostare la modalità del dispositivo su globale:
setPreferredNetworkTypeToGlobal
. - Metodi per ottenere le identità del dispositivo o della rete:
- Identità internazionale dell'apparecchiatura mobile (IMEI):
getImei
- Identificatore di apparecchiature mobili (MEID):
getMeid
- Identificatore di accesso alla rete (NAI):
getNai
- Numero di serie della SIM:
getSimSerialNumber
- Identità internazionale dell'apparecchiatura mobile (IMEI):
- Metodo per ottenere la configurazione del corriere:
getCarrierConfig
- Metodo per ottenere il tipo di rete per la trasmissione dei dati:
getDataNetworkType
- Metodo per ottenere il tipo di rete per il servizio vocale:
getVoiceNetworkType
- Metodi per ottenere le informazioni sull'app UICC SIM (USIM):
- Numero di serie della SIM:
getSimSerialNumber
- Informazioni sulla carta:
getUiccCardsInfo
- GID1 (ID gruppo livello1):
getGroupIdLevel1
- Stringa del numero di telefono per la riga 1:
getLine1Number
- Rete mobile terrestre pubblica proibita (PLMN):
getForbiddenPlmns
- PLMN casa equivalente:
getEquivalentHomePlmns
- Numero di serie della SIM:
- Metodi per ottenere o impostare il numero della segreteria telefonica:
- Metodo per inviare un codice dialer speciale:
sendDialerSpecialCode
- Metodo per resettare il radio modem:
rebootModem
- Metodi per ottenere o impostare le modalità di selezione della rete:
- Metodo per richiedere una scansione di rete:
requestNetworkScan
- Metodi per ottenere o impostare i tipi di rete consentiti/preferiti:
- Metodi per verificare se i dati mobili o il roaming sono abilitati in base alle impostazioni dell'utente:
- Metodi per controllare o impostare la connessione dati con causale:
- Metodo per ottenere l'elenco dei numeri di emergenza:
getEmergencyNumberList
- Metodi per controllare le reti opportunistiche:
- Metodi per impostare o cancellare la richiesta di aggiornamento dell'intensità del segnale cellulare:
TelefoniaRichiamata
TelephonyCallback
dispone di interfacce con un metodo di callback per notificare all'app chiamante quando cambiano gli stati registrati:
- L'indicatore di messaggio in attesa è cambiato:
onMessageWaitingIndicatorChanged
- L'indicatore di inoltro di chiamata è cambiato:
onCallForwardingIndicatorChanged
- La causa della disconnessione delle chiamate IMS (IP multimedia system) è stata modificata:
onImsCallDisconnectCauseChanged
- Lo stato preciso della connessione dati è cambiato:
onPreciseDataConnectionStateChanged
- L'attuale elenco dei numeri di emergenza è cambiato:
onEmergencyNumberListChanged
- L'ID della sottoscrizione dati attiva è cambiato:
onActiveDataSubscriptionIdChanged
- La rete dell'operatore è cambiata:
onCarrierNetworkChange
- La registrazione di rete o l'aggiornamento di una posizione/instradamento/tracciamento non è riuscito:
onRegistrationFailed
- Le informazioni di blocco cambiano:
onBarringInfoChanged
- L'attuale configurazione del canale fisico è cambiata:
onPhysicalChannelConfigChanged
Subscription Manager
- Metodi per ottenere varie informazioni sull'abbonamento:
- Metodo per ottenere il numero di sottoscrizioni attive:
getActiveSubscriptionInfoCount
- Metodi per gestire i gruppi di abbonamento:
- Metodi per ottenere o impostare la descrizione del piano di relazione di fatturazione tra un vettore e un abbonato specifico:
- Metodo per sovrascrivere temporaneamente il piano di relazione di fatturazione tra un vettore e un abbonato specifico da considerare senza limiti:
setSubscriptionOverrideUnmetered
- Metodo per sovrascrivere temporaneamente il piano di relazione di fatturazione tra un vettore e un abbonato specifico da considerare congestionato:
setSubscriptionOverrideCongested
- Metodo per verificare se l'applicazione con il contesto dato è autorizzata a gestire la sottoscrizione data in base ai suoi metadati:
canManageSubscription
Gestore SMS
- Metodo per consentire al chiamante di creare nuovi messaggi SMS in arrivo:
injectSmsPdu
. - Metodo per inviare un messaggio SMS basato su testo senza scrivere nel provider SMS:
sendTextMessageWithoutPersisting
CarrierConfigManager
- Metodo per notificare la modifica della configurazione:
notifyConfigChangedForSubId
. - Metodo per ottenere la configurazione dell'operatore per l'abbonamento predefinito:
getConfig
- Metodo per ottenere la configurazione dell'operatore per la sottoscrizione specificata:
getConfigForSubId
Per istruzioni, vedere Configurazione del corriere .
BugreportManager
Metodo per avviare una segnalazione di bug di connettività, che è una versione specializzata della segnalazione di bug che include solo informazioni per il debug di problemi relativi alla connettività: startConnectivityBugreport
NetworkStats Manager
- Metodo per interrogare il riepilogo dell'utilizzo della rete:
querySummary
- Metodo per interrogare la cronologia dell'utilizzo della rete:
queryDetails
- Metodi per registrare o annullare la registrazione della richiamata per l'utilizzo della rete:
ImsMmTelManager
- Metodi per registrare o annullare la registrazione della richiamata della registrazione IMS MmTel:
ImsRcs Manager
- Metodi per registrare o annullare la registrazione della richiamata della registrazione IMS RCS:
- Metodi per ottenere lo stato di registrazione IMS o il tipo di trasporto:
Provisioning Manager
- Metodi per registrare e annullare la registrazione del callback degli aggiornamenti del provisioning delle funzionalità IMS:
- Metodi relativi allo stato di provisioning per la funzionalità IMS MmTel o RCS:
Gestore Euicc
Metodo per passare a (abilitare) l'abbonamento specificato: switchToSubscription
CarrierMessagingService
Servizio che riceve le chiamate dal sistema quando vengono inviati o ricevuti nuovi SMS e MMS. Per estendere questa classe, dichiara il servizio nel tuo file manifest con l'autorizzazione android.Manifest.permission#BIND_CARRIER_MESSAGING_SERVICE
e includi un filtro intent con l'azione #SERVICE_INTERFACE
. I metodi includono:
- Metodo per filtrare i messaggi SMS in entrata:
onFilterSms
- Metodo per intercettare gli SMS di testo inviati dal dispositivo:
onSendTextSms
- Metodo per intercettare i messaggi SMS binari inviati dal dispositivo:
onSendDataSms
- Metodo per intercettare SMS lunghi inviati dal dispositivo:
onSendMultipartTextSms
- Metodo per intercettare i messaggi MMS inviati dal dispositivo:
onSendMms
- Metodo per scaricare i messaggi MMS ricevuti:
onDownloadMms
CarrierService
Servizio che espone al sistema funzionalità specifiche del vettore. Per estendere questa classe, dichiara il servizio nel file manifest dell'app con l'autorizzazione android.Manifest.permission#BIND_CARRIER_SERVICES
e includi un filtro intent con l'azione CARRIER_SERVICE_INTERFACE
. Se il servizio ha un'associazione di lunga durata, imposta android.service.carrier.LONG_LIVED_BINDING
su true
nei metadati del servizio.
La piattaforma associa CarrierService
con flag speciali per consentire l'esecuzione del processo del servizio carrier in uno speciale bucket di standby dell'app . Ciò esonera l'app del servizio operatore dalla restrizione di inattività dell'app e rende più probabile che rimanga attiva quando la memoria del dispositivo è bassa. Tuttavia, se l'app del servizio di corriere si arresta in modo anomalo per qualsiasi motivo, perde tutti i privilegi di cui sopra finché l'app non si riavvia e l'associazione non viene ristabilita. Quindi è fondamentale mantenere stabile l'app del servizio di corriere.
I metodi in CarrierService
includono:
- Per eseguire l'override e impostare le configurazioni specifiche del corriere:
onLoadConfig
- Per informare il sistema di un'imminente modifica intenzionale della rete dell'operatore da parte dell'applicazione dell'operatore:
notifyCarrierNetworkChange
Fornitore di telefonia
API del provider di contenuti per consentire modifiche (inserimento, eliminazione, aggiornamento, query) al database di telefonia. I campi dei valori sono definiti in Telephony.Carriers
; per maggiori dettagli si rimanda al riferimento classe Telephony
Wi-FiNetworkSuggerimento
Quando crei un oggetto WifiNetworkSuggestion
, utilizza i seguenti metodi per impostare un ID sottoscrizione o un gruppo di sottoscrizione:
- Metodo per impostare un ID sottoscrizione:
setSubscriptionId
- Metodo per impostare un gruppo di sottoscrizioni:
setSubscriptionGroup
Piattaforma Android
Su un UICC rilevato, la piattaforma crea oggetti UICC interni che includono regole sui privilegi del vettore come parte dell'UICC. UiccCarrierPrivilegeRules.java
carica le regole, le analizza dalla scheda UICC e le memorizza nella cache. Quando è necessario un controllo dei privilegi, UiccCarrierPrivilegeRules
confronta il certificato del chiamante con le proprie regole una per una. Se l'UICC viene rimosso, le regole vengono distrutte insieme all'oggetto UICC.
Convalida
Per convalidare l'implementazione tramite Compatibility Test Suite (CTS) utilizzando CtsCarrierApiTestCases.apk
, è necessario disporre di un UICC per sviluppatori con le regole UICC corrette o il supporto ARF. Chiedi al fornitore della carta SIM di tua scelta di preparare un UICC per sviluppatori con l'ARF corretto come descritto in questa sezione e usa tale UICC per eseguire i test. L'UICC non richiede un servizio cellulare attivo per superare i test CTS.
Preparare l'UICC
Per Android 11 e versioni precedenti, CtsCarrierApiTestCases.apk
è firmato da aosp-testkey
, con valore hash 61:ED:37:7E:85:D3:86:A8:DF:EE:6B:86:4B:D8:5B:0B:FA:A5:AF:81
.
A partire da Android 12, CtsCarrierApiTestCases.apk
è firmato da cts-uicc-2021-testkey
, valore hash CE:7B:2B:47:AE:2B:75:52:C8:F9:2C:C2:91:24:27:98:83:04:1F:B6:23:A5:F1:94:A8:2C:9B:F1:5D:49:2A:A0
Per eseguire i test dell'API dell'operatore CTS in Android 12, il dispositivo deve utilizzare una SIM con privilegi dell'operatore CTS che soddisfi i requisiti specificati nell'ultima versione della specifica del profilo di test GSMA TS.48 di terze parti.
La stessa SIM può essere utilizzata anche per le versioni precedenti ad Android 12.
Modifica del profilo SIM CTS
- Aggiungere: privilegi di vettore CTS nel master dell'applicazione delle regole di accesso (ARA-M) o ARF. Entrambe le firme devono essere codificate nelle regole dei privilegi del vettore:
-
61:ED:37:7E:85:D3:86:A8:DF:EE:6B:86:4B:D8:5B:0B:FA:A5:AF:81
-
CE:7B:2B:47:AE:2B:75:52:C8:F9:2C:C2:91:24:27:98:83:04:1F:B6:23:A5:F1:94:A8:2C:9B:F1:5D:49:2A:A0
-
- Crea: ADF USIM file elementari (EFs) non presenti in TS.48 e necessari per CTS:
- EF_MBDN (6FC7), dimensioni record: 28, numero record: 4
- Contenuto
- Rec1: 566F696365204D61696CFFFFFFFF06915155555555FF…FF
- Rec2-n: FF…FF
- Contenuto
- EF_EXT6 (6FC8), dimensioni record: 13, numero record: 1
- Contenuto: 00FF…FF
- EF_MBI (6FC9), dimensioni record: 4, numero record: 1
- Contenuto: Rec1: 01010101
- EF_MWIS (6FCA), dimensioni record: 5, numero record: 1
- Contenuto: 0000000000
- Contenuto: 00FF…FF
- EF_MBDN (6FC7), dimensioni record: 28, numero record: 4
- Modifica: Tabella servizi USIM: Abilita servizi n°47, n°48
- EF_UST (6F38)
- Contenuto:
9EFFBF1DFFFE0083410310010400406E01
- Contenuto:
- EF_UST (6F38)
- Modifica: file DF-5GS e DF-SAIP
- DF-5GS - EF_5GS3GPPLOCI (USIM/5FC0/4F01)
- Contenuto:
FFFFFFFFFFFFFFFFFFFFFFFFFF42F618FFFFFE01
- Contenuto:
- DF-5GS - EF_5GSN3GPPLOCI (USIM/5FC0/4F02)
- Contenuto:
FFFFFFFFFFFFFFFFFFFFFFFFFF42F618FFFFFE01
- Contenuto:
- DF-5GS - EF SUCI_Calc_Info (USIM/5FC0/4F07)
- Contenuto:
A0020000FF…FF
- Contenuto:
- DF-SAIP - EF SUCI_Calc_Info_USIM (USIM/5FD0/4F01)
- Contenuto:
A0020000FF…FF
- Contenuto:
- DF-5GS - EF_5GS3GPPLOCI (USIM/5FC0/4F01)
- Modifica: utilizza la stringa del nome dell'operatore Android CTS nei rispettivi EF contenenti questa designazione:
- EF_SPN (USIM/6F46)
- Contenuto:
01416E64726F696420435453FF..FF
- Contenuto:
- EF_PNN (USIM/6FC5)
- Contenuto:
Rec1 430B83413759FE4E934143EA14FF..FF
- Contenuto:
- EF_SPN (USIM/6F46)
Corrispondenza alla struttura del profilo di test
Scarica e abbina l' ultima versione delle seguenti strutture di profili di test generici. Questi profili non avranno la regola CTS Carrier Privilege personalizzata o altre modifiche sopra elencate.
Prove in corso
Per comodità, CTS supporta un token del dispositivo che limita l'esecuzione dei test solo sui dispositivi configurati con lo stesso token. I test CTS dell'API Carrier supportano il token del dispositivo sim-card-with-certs
. Ad esempio, il seguente token del dispositivo limita l'esecuzione dei test dell'API dell'operatore solo sul dispositivo abcd1234
:
cts-tradefed run cts --device-token abcd1234:sim-card-with-certs
Quando si esegue un test senza utilizzare un token del dispositivo, il test viene eseguito su tutti i dispositivi.
FAQ
Come si aggiornano i certificati sull'UICC?
R: Usa il meccanismo di aggiornamento OTA della carta esistente.
L'UICC può coesistere con altre regole?
R: Va bene avere altre regole di sicurezza sull'UICC sotto lo stesso AID; la piattaforma li filtra automaticamente.
Cosa succede quando l'UICC viene rimosso per un'app che si basa sui certificati su di essa?
R: L'app perde i suoi privilegi perché le regole associate all'UICC vengono distrutte alla rimozione dell'UICC.
C'è un limite al numero di certificati sulla UICC?
R: La piattaforma non limita il numero di certificati; ma poiché il controllo è lineare, troppe regole possono incorrere in una latenza per il controllo.
C'è un limite al numero di API che possiamo supportare con questo metodo?
R: No, ma limitiamo l'ambito alle API relative al corriere.
Ci sono alcune API che non possono utilizzare questo metodo? Se sì, come li fai rispettare? (ovvero, hai test per convalidare quali API sono supportate con questo metodo?)
R: Consulta la sezione sulla compatibilità comportamentale dell'API del documento di definizione della compatibilità Android (CDD). Abbiamo alcuni test CTS per assicurarci che il modello di autorizzazione delle API non venga modificato.
Come funziona con la funzione multi-SIM?
R: Viene utilizzata la SIM predefinita specificata dall'utente.
Questo in qualche modo interagisce o si sovrappone con altre tecnologie di accesso SE, ad esempio SEEK?
R: Ad esempio, SEEK utilizza lo stesso AID dell'UICC. Quindi le regole coesistono e vengono filtrate da SEEK o UiccCarrierPrivileges
.
Quando è il momento giusto per controllare i privilegi del corriere?
A: Dopo che lo stato della SIM ha caricato la trasmissione.
Gli OEM possono disabilitare parte delle API dell'operatore?
R: No. Riteniamo che le API attuali siano il set minimo e prevediamo di utilizzare la maschera di bit per un controllo della granularità più preciso in futuro.
setOperatorBrandOverride
esegue l'override di TUTTE le altre forme di stringhe del nome dell'operatore? Ad esempio, SE13, UICC SPN o NITZ basato su rete?
Sì, l'override del marchio dell'operatore ha la massima priorità. Quando è impostato, sovrascrive TUTTE le altre forme di stringhe del nome dell'operatore.
Cosa fa la chiamata al metodo injectSmsPdu
?
R: Questo metodo facilita il backup/ripristino degli SMS nel cloud. La chiamata injectSmsPdu
abilita la funzione di ripristino.
Per il filtraggio degli SMS, la chiamata onFilterSms
è basata sul filtraggio delle porte SMS UDH? Oppure le app dell'operatore hanno accesso a TUTTI gli SMS in arrivo?
R: Gli operatori hanno accesso a tutti i dati SMS.
L'estensione di DeviceAppID-REF-DO
per supportare 32 byte sembra essere incompatibile con l'attuale specifica GP (che consente solo 0 o 20 byte), quindi perché stai introducendo questa modifica? SHA-1 non è sufficiente per evitare collisioni? Hai già proposto questa modifica a GP, in quanto potrebbe essere incompatibile con le versioni precedenti di ARA-M/ARF?
R: Per fornire una sicurezza a prova di futuro, questa estensione introduce SHA-256 per DeviceAppID-REF-DO
oltre a SHA-1, che attualmente è l'unica opzione nello standard GP SEAC. Consigliamo vivamente di utilizzare SHA-256.
Se DeviceAppID
è 0 (vuoto), applichi la regola a tutte le app del dispositivo non coperte da una regola specifica?
R: Le API dell'operatore richiedono il popolamento DeviceAppID-REF-DO
. Il vuoto è destinato a scopi di test e non è consigliato per le distribuzioni operative.
Secondo le tue specifiche, PKG-REF-DO
usato da solo, senza DeviceAppID-REF-DO
, non dovrebbe essere accettato. Ma è ancora descritto nella Tabella 6-4 della specifica come estensione della definizione di REF-DO
. È questo apposta? Come si comporta il codice quando viene utilizzato solo PKG-REF-DO
in REF-DO
?
R: L'opzione di avere PKG-REF-DO
come elemento a valore singolo in REF-DO
è stata rimossa nell'ultima versione. PKG-REF-DO
dovrebbe verificarsi solo in combinazione con DeviceAppID-REF-DO
.
Partiamo dal presupposto di poter concedere l'accesso a tutte le autorizzazioni basate sull'operatore o avere un controllo più dettagliato. In tal caso, cosa definisce la mappatura tra la maschera di bit e le autorizzazioni effettive? Un permesso per classe? Un'autorizzazione per metodo? 64 autorizzazioni separate sono sufficienti a lungo termine?
A: Questo è riservato per il futuro e accettiamo suggerimenti.
Puoi definire ulteriormente DeviceAppID
per Android in modo specifico? Questo è il valore hash SHA-1 (20 byte) del certificato dell'editore utilizzato per firmare l'app specificata, quindi il nome non dovrebbe riflettere tale scopo? (Il nome potrebbe creare confusione per molti lettori poiché la regola è quindi applicabile a tutte le app firmate con lo stesso certificato dell'editore.)
R: Il DeviceAppID
che archivia i certificati è supportato dalle specifiche esistenti. Abbiamo cercato di ridurre al minimo le modifiche alle specifiche per abbassare la barriera per l'adozione. Per i dettagli, vedere Regole su UICC .