Android 10 cambia los permisos de
identificadores de dispositivos para que todos estén protegidos
el permiso READ_PRIVILEGED_PHONE_STATE
Antes de
Android 10, identificadores de dispositivos persistentes
(IMEI/MEID, IMSI, SIM y número de serie de compilación) estaban protegidos
Permiso de tiempo de ejecución READ_PHONE_STATE
.
El permiso READ_PRIVILEGED_PHONE_STATE
solo es
se otorgan a apps firmadas con la clave de la plataforma y apps del sistema con privilegios.
Puedes obtener más información sobre los nuevos requisitos de permisos en el Páginas de Javadoc para TelephonyManager.java y Build.java.
Este cambio afecta a las siguientes APIs:
- TelephonyManager#getDeviceId
- Administrador de telefonía#getImei
- TelephonyManager#getMeid
- Administrador de telefonía#getSimSerialNumber
- TelephonyManager#getSubscriberId
- Compilación#getSerial
Acceso para apps del operador sin el permiso READ_PRIVILEGED_PHONE_STATE
las apps del operador precargadas que no cumplen con los requisitos para
READ_PRIVILEGED_PHONE_STATE
permiso puede implementar una de las opciones de la siguiente tabla.
Opción | Descripción | Limitaciones |
---|---|---|
Privilegios del operador de UICC | La plataforma de Android carga los certificados almacenados en el UICC y otorga permiso a las apps firmadas por estos certificados para realizar llamadas a servicios . | Los operadores heredados tienen una gran cantidad de SIM establecida, que no es que se pueden actualizar fácilmente. Además, los proveedores que no tengan derechos de autor sobre Las tarjetas SIM (por ejemplo, los MVNO que tienen SIM emitidas por MNO) no pueden agregar ni actualizar certificados en las SIM. |
Incluir OEM en la lista de entidades permitidas | Los OEM pueden usar OP_READ_DEVICE_IDENTIFIER para proporcionar
identificadores a las apps del operador incluidas en la lista de entidades permitidas. |
Esta solución no es escalable para todos los operadores. |
Código de asignación de tipo (TAC) | Usa el
getTypeAllocationCode
, que se introdujo en
Android 10, para exponer el TAC que muestra el fabricante y el modelo
información. |
La información del TAC no es adecuada para identificar un dispositivo específico. |
MSISDN | Los operadores pueden usar el número de teléfono (MSISDN), disponible en
TelephonyManager con el permiso PHONE
para buscar el IMEI en los sistemas de backend. |
Esto requiere una inversión significativa para las empresas de transporte. Operadores que mapean sus claves de red con IMSI requieren una inversión recursos técnicos para cambiar a la MSISDN. |
Todas las apps del operador pueden acceder a los identificadores de dispositivos actualizando
el archivo CarrierConfig.xml
con el hash del certificado de firma de
la app del operador. Cuando la app del operador llama a un método de lectura de
de la aplicación, la plataforma busca una coincidencia con el certificado de firma de la aplicación.
hash (firma SHA-1 o SHA-256 del certificado) en la
Archivo CarrierConfig.xml
. Si se encuentra una coincidencia, se
para que se muestre la información. Si no se encuentra una coincidencia, se aplicará una excepción de seguridad.
que se devuelven.
Para implementar esta solución, los operadores DEBEN seguir estos pasos:
- Actualizar
CarrierConfig.xml
por el hash del certificado de firma del app del operador y enviar un parche. - Solicita a los OEM que actualicen su compilación con QPR1+ (recomendado), O BIEN estos
parches de plataforma necesarios y el parche que contiene
Se actualizó
CarrierConfig.xml
archivo del paso 1 anterior.
Implementación
Actualiza tu lista de permisos con privilegios para otorgar
READ_PRIVILEGED_PHONE_STATE
para los usuarios con privilegios
apps que requieren acceso a identificadores de dispositivos.
Para obtener más información sobre la lista de entidades permitidas, consulta Información Lista de entidades permitidas de permisos.
Para invocar las APIs afectadas, una app debe cumplir con una de las siguientes condiciones: requisitos:
- Si la aplicación es una aplicación con privilegios precargada, necesita la
Se declaró
READ_PRIVILEGED_PHONE_STATE
permiso en AndroidManifest.xml La app también debe incluirse en la lista de entidades permitidas este permiso con privilegios. - Las apps que se entregan a través de Google Play necesitan privilegios de operador. Más información sobre cómo conceder privilegios de operador en el operador de UICC Privilegios.
- Una app del propietario del perfil o del dispositivo a la que se le haya otorgado
READ_PHONE_STATE
.
Una app que no cumpla con ninguno de estos requisitos tiene las siguientes características: comportamiento:
- Si la app se orienta a campañas anteriores a Q y no tiene
READ_PHONE_STATE
permiso otorgado,SecurityException
. este es el comportamiento previo a Q, ya que este permiso se requiere para invocar estas APIs. - Si la app se orienta a campañas anteriores a Q y tiene
READ_PHONE_STATE
otorgado, recibe un Un valor nulo para todas las APIs de TelephonyManager y paraBuild.UNKNOWN
para el métodoBuild#getSerial
. - Si la app se orienta a Android 10 o versiones posteriores, y no cumple con ninguno de los nuevos del cliente, recibe una SecurityException.
Validación y prueba
La página de compatibilidad El conjunto de pruebas (CTS) incluye pruebas para verificar el identificador de dispositivo esperado el comportamiento de acceso a las apps con privilegios de operador, el dispositivo y propietarios de perfiles de Google y las apps que no deberían tener acceso al dispositivo identificadores.
Las siguientes pruebas de CTS son específicas para esta función.
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
Preguntas frecuentes
¿Cuántas apps se pueden incluir en la lista de entidades permitidas de CarrierConfig.xml
para un determinado (MCC, MNC)?
No hay límite para la cantidad de hash de certificados incluidos en el array.
¿Qué parámetros de CarrierConfig en CarrierConfig.xml
debo usar para que se incluya una app en la lista de entidades permitidas?
Usa el siguiente elemento de configuración de nivel superior dentro del
CarrierConfig.xml
de las opciones de AOSP que estás configurando:
<string-array name="carrier_certificate_string_array" num="2"> <item value="BF02262E5EF59FDD53E57059082F1A7914F284B"/> <item value="9F3868A3E1DD19A5311D511A60CF94D975A344B"/> </string-array>
¿Hay una plantilla de CarrierConfig base que pueda usar?
Usa la siguiente plantilla. Esto debe agregarse al recurso relevante.
<?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>
¿La SIM del operador tiene que estar en el dispositivo para acceder a los identificadores del dispositivo?
El CarrierConfig.xml
que se usa se determina en función de la
SIM insertada. Esto significa que si la app del operador X intenta
obtener privilegios de acceso mientras la SIM del operador Y está insertada, el dispositivo no encontrará
una coincidencia para el hash y devuelve una excepción de seguridad.
En dispositivos multiSIM, el operador núm. 1 solo tiene privilegios de acceso para la tarjeta SIM núm. 1 y vice versa.
¿Cómo convierten los operadores el certificado de firma de una app en un hash?
Para convertir certificados de firma en un hash antes de agregarlos a
CarrierConfig.xml
, haz lo siguiente:
- Convierte la firma del certificado de firma en un array de bytes usando
toByteArray
- Utilizar
MessageDigest
para convertir el array de bytes en un hash de byte[]. -
Convierte el hash de byte[] en un formato de cadena hexadecimal. Por ejemplo, consulta
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())); }
Si
certHashes
es un array de tamaño2
con un valor de12345
y54321
, agrega lo siguiente al archivo de configuración del proveedor.<string-array name="carrier_certificate_string_array" num="2"> <item value="12345"/> <item value="54321"/> </string-array>