Идентификаторы устройств

Android 10 изменяет разрешения для идентификаторов устройств, поэтому теперь все идентификаторы устройств защищены разрешением READ_PRIVILEGED_PHONE_STATE . До Android 10 постоянные идентификаторы устройств (IMEI / MEID, IMSI, SIM и серийный номер сборки) были защищены разрешением времени выполнения READ_PHONE_STATE . Разрешение READ_PRIVILEGED_PHONE_STATE предоставляется только приложениям, подписанным с помощью ключа платформы, и привилегированным системным приложениям.

Дополнительную информацию о новых требованиях к разрешениям можно найти на страницах документации Javadoc для TelephonyManager.java и Build.java .

Это изменение влияет на следующие API:

  • TelephonyManager # getDeviceId
  • TelephonyManager # getImei
  • TelephonyManager # getMeid
  • TelephonyManager # getSimSerialNumber
  • TelephonyManager # getSubscriberId
  • Сборка # getSerial

Доступ для приложений оператора связи без разрешения READ_PRIVILEGED_PHONE_STATE

Предварительно загруженные приложения оператора связи, которые не соответствуют требованиям READ_PRIVILEGED_PHONE_STATE могут реализовать один из вариантов, указанных в таблице ниже.

Вариант Описание Ограничения
Привилегии оператора связи UICC Платформа Android загружает сертификаты, хранящиеся в UICC, и предоставляет приложениям, подписанным этими сертификатами, разрешение на выполнение вызовов специальных методов. У устаревших операторов есть большое количество установленных SIM-карт, которые нелегко обновить. Кроме того, операторы, у которых нет прав на создание новых SIM-карт (например, MVNO, у которых SIM-карты выпущены из MNO), не могут добавлять или обновлять сертификаты на SIM-картах.
Белый список OEM OEM-производители могут использовать OP_READ_DEVICE_IDENTIFIER для предоставления идентификаторов устройств приложениям из белого списка. Это решение не масштабируется для всех операторов связи.
Код присвоения типа (TAC) Используйте метод getTypeAllocationCode , представленный в Android 10, чтобы предоставить TAC, который возвращает информацию о производителе и модели. Информация в TAC неадекватна для идентификации конкретного устройства.
MSISDN Операторы могут использовать номер телефона (MSISDN), доступный в TelephonyManager с группой разрешений PHONE , для поиска IMEI в своих внутренних системах. Это требует от перевозчиков значительных вложений. Операторам, которые отображают свои сетевые ключи с помощью IMSI, требуются значительные технические ресурсы для перехода на MSISDN .

Все приложения оператора связи могут получить доступ к идентификаторам устройств, обновив файл CarrierConfig.xml с помощью хэша сертификата подписи приложения оператора связи. Когда приложение-перевозчик вызывает метод для чтения привилегированной информации, платформа ищет совпадение хэша сертификата подписи приложения (подпись сертификата SHA-1 или SHA-256) в файле CarrierConfig.xml . Если совпадение найдено, возвращается запрошенная информация. Если совпадений не найдено, возвращается исключение безопасности.

Чтобы реализовать это решение, операторы ДОЛЖНЫ выполнить следующие действия:

  1. Обновите CarrierConfig.xml с помощью хэша сертификата подписи приложения оператора связи и отправьте исправление .
  2. Попросите OEM-производителей обновить свою сборку с помощью QPR1 + (рекомендуется) ИЛИ эти необходимые исправления платформы и исправление, содержащее обновленный файл CarrierConfig.xml из шага 1 выше.

Выполнение

Обновите свой белый список привилегированных разрешений, чтобы предоставить READ_PRIVILEGED_PHONE_STATE тем привилегированным приложениям, которым требуется доступ к идентификаторам устройств.

Чтобы узнать больше о белых списках, обратитесь к разделу « Белый список привилегированных разрешений» .

Чтобы вызвать затронутые API, приложение должно соответствовать одному из следующих требований:

  • Если приложение является предварительно загруженным привилегированным приложением, ему требуется разрешение READ_PRIVILEGED_PHONE_STATE объявленное в AndroidManifest.xml. Приложению также необходимо внести это привилегированное разрешение в белый список.
  • Для приложений, доставляемых через Google Play, требуются права оператора связи. Дополнительные сведения о предоставлении привилегий оператора связи см. На странице « Привилегии оператора связи UICC» .
  • Приложение владельца устройства или профиля, которому предоставлено разрешение READ_PHONE_STATE .

Приложение, которое не соответствует ни одному из этих требований, ведет себя следующим образом:

  • Если приложение READ_PHONE_STATE на pre-Q и не имеет разрешения READ_PHONE_STATE , запускается SecurityException . это текущее поведение до Q, поскольку это разрешение требуется для вызова этих API.
  • Если приложение READ_PHONE_STATE на pre-Q и ему READ_PHONE_STATE разрешение READ_PHONE_STATE , оно получает нулевое значение для всех API TelephonyManager и Build.UNKNOWN для метода Build#getSerial .
  • Если приложение предназначено для Android 10 или более поздней версии и не соответствует ни одному из новых требований, оно получает исключение SecurityException.

Валидация и тестирование

Набор тестов совместимости (CTS) включает тесты для проверки ожидаемого поведения доступа к идентификатору устройства для приложений с правами оператора, владельцев устройств и профилей, а также тех приложений, которые, как ожидается, не будут иметь доступа к идентификаторам устройств.

Следующие тесты CTS относятся к этой функции.

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

FAQs

Сколько приложений можно добавить в белый список CarrierConfig.xml для данного (MCC, MNC)?

Нет ограничений на количество хэшей сертификатов, включенных в массив.

Какие параметры CarrierConfig в CarrierConfig.xml мне нужно использовать, чтобы приложение было внесено в белый список?

Используйте следующий элемент конфигурации верхнего уровня в конкретном CarrierConfig.xml из настраиваемых параметров AOSP:

<string-array name="carrier_certificate_string_array" num="2">
    <item value="BF02262E5EF59FDD53E57059082F1A7914F284B"/>
    <item value="9F3868A3E1DD19A5311D511A60CF94D975A344B"/>
</string-array>

Есть ли базовый шаблон CarrierConfig, который я могу использовать?

Используйте следующий шаблон. Его следует добавить к соответствующему активу .

<?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>

Должна ли быть SIM-карта оператора связи в устройстве для доступа к идентификаторам устройства?

Используемый CarrierConfig.xml определяется на основе SIM-карты, которая вставлена ​​в данный момент. Это означает, что если приложение оператора X пытается получить права доступа, пока SIM-карта оператора Y вставлена, устройство не найдет совпадения для хэша и вернет исключение безопасности.

На устройствах с несколькими SIM-картами оператор №1 имеет права доступа только для SIM-карты №1 и наоборот.

Как операторы конвертируют сертификат подписи приложения в хэш?

Чтобы преобразовать сертификаты подписи в хэш перед добавлением их в CarrierConfig.xml , выполните следующие действия:

  1. Преобразуйте подпись сертификата подписи в массив байтов с помощью toByteArray .
  2. Используйте MessageDigest для преобразования массива байтов в хэш типа byte [].
  3. Преобразуйте хэш из байта [] в формат шестнадцатеричной строки. Для примера см. 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 - это массив размера 2 со значениями 12345 и 54321 , добавьте следующее в файл конфигурации оператора связи.

    <string-array name="carrier_certificate_string_array" num="2">
        <item value="12345"/>
        <item value="54321"/>
    </string-array>