Андроид и eSIM

Данная статься является третьей в цикле лекций по изучению процесса перепродажи тарифов eSIM и в ней мы поговорим более подробнее из чего состоит процесс установки eSIM на телефоны с операционной системой Andoird. Первая статья была обзорной и рассказывала об общей актуальности данной темы, вторая статья погружала нас в различные части экосистемы eSIM, а в дальнейшем мы будем рассматривать конкретнее процесс установки eSIM на телефоны на платформе iOS.

Android - это мобильная операционная система с открытым исходным кодом, разработанная в основном для смартфонов и планшетов. Ядро операционной системы Android основано на ядре Linux, и большинство приложений для Android написаны на программном языке Java и выполняются в среде Android runtime (ART), но также могут быть написаны на таких языках, как C++ и Kotlin [21]. Эта глава посвящена программированию и безопасности в Android, а также тому, как это работает вместе с eSIM.

1 SDK

Android SDK (Software Development Kit) - это набор инструментов, используемых при разработке приложений для Android. Он включает в себя стандартные библиотеки, документацию по API и инструменты, используемые для отладки и компиляции приложения. SDK компилирует код и все другие необходимые данные и файлы, такие как файл манифеста, в файл APK (Android Package), который представляет собой архивный файл с расширением .apk. Затем этот файл можно использовать для установки приложения на Android-устройство [21].

2 App Components

Приложение для Android состоит из нескольких компонентов, каждый из которых предназначен для обработки отдельной части приложения. Четырьмя основными компонентами приложения являются действия, сервисы, приемники широковещательной передачи и поставщики контента [21], которые описаны ниже.

2.1 Activities

Activity в приложении представлено одним экраном с пользовательским интерфейсом и является частью приложения, с которой взаимодействует пользователь. Приложение может состоять из одного или нескольких activity и каждое activity является точкой входа в приложение, поскольку приложение не всегда может начинаться с одного и того же действия. Например, одно приложение может вызвать activity в другом приложении, которое может отличаться от того, как если бы приложение было запущено пользователем самостоятельно. Как правило, у приложения есть основное activity, которое является первым activity, которое пользователь видит при запуске приложения. Затем это activity, в свою очередь, может запустить новое activity, создавая для пользователя целостный опыт, даже несмотря на то, что обычно между activity существуют минимальные зависимости [22].

Каждое реализованное activity в приложении должно быть подклассом класса Activity путем его расширения и должно быть объявлено в манифесте [21]. Чтобы позволить пользователю переключаться между activity и выходить из приложения и повторно входить в него без сбоев или потери прогресса пользователя, действие содержит набор из семи методов обратного вызова для управления жизненным циклом действия [23]:

onCreate(): вызывается, когда система создает activity, и используется для инициализации необходимых компонентов, таких как создание представлений.

onStart(): вызывается, когда activity становится видимым для пользователя. Выполняет задания по подготовке мероприятия к тому, чтобы оно стало видимым и интерактивным.

onResume(): вызывается, когда пользователь начинает взаимодействовать с activity. Именно здесь реализован основной функционал activity.

onPause(): вызывается, когда activity теряет состояние переднего плана и переходит в приостановленное состояние.

onStop(): вызывается, когда activity больше не отображается, например, из-за запуска нового действия.

onRestart(): Вызывается при перезапуске activity из остановленного состояния и используется для восстановления состояния activity в то состояние, в котором оно было при остановке.

onDestroy(): вызывается, когда activity уничтожается системой. Используется, например, для освобождения всех ресурсов, удерживаемых активностью.

2.2 Сервисы

Еще одним важным компонентом приложения является сервис. Сервис - это компонент, который может выполнять длительные задачи в фоновом режиме, такие как загрузка данных по сети, не блокируя взаимодействие пользователя с activity. Сервис не предоставляет пользователю пользовательский интерфейс и может быть запущена, например, с помощью activity и продолжать работать, даже если activity остановлено или уничтожено [21].

2.3 Broadcast Receiver

Широковещательный приемник используется приложением для приема объявлений, транслируемых системой в виде широковещательных намерений, даже если приложение в данный момент не запущено. Это способ для приложений и системы взаимодействовать друг с другом. Приложения также могут отправлять широковещательные сообщения, и когда приложение получает широковещательное намерение, оно может быть использовано для запуска компонентов в ответ на содержание намерения [21]. Подробнее о намерениях читайте в разделе 3.

2.4 Content Provider

Поставщик контента - это компонент, который инкапсулирует общий набор данных приложения, хранящихся в файловой системе. Приложения могут запрашивать или изменять данные через поставщика контента, если поставщик контента разрешает это, например, если запрашивающее приложение имеет правильные разрешения [24].

3 Intent

Намерение - это простой объект обмена сообщениями, используемый для обмена данными между различными компонентами системы, такими как activity и сервисами. Все три компонента, упомянутые в предыдущем разделе, инициируют intent и вместе представляют собой три основных варианта использования intent-ов [25]:

  • Запуск activity: новое activity может быть запущено путем передачи намерения, определяющего activity для запуска и содержащего необходимые данные, в метод startActivityForResult() или startActivity().
  • Запуск сервиса: можно запустить новый сервис или предоставить новые инструкции текущей службе, передав методу startService() намерение, описывающее запуск сервиса.
  • Широковещательные сообщения: Широковещательная передача может быть инициирована, например, путем передачи намерения методу sendBroadcast().

Существует два типа намерений: неявные и явные намерения. Явные намерения - это те, в которых вызываемый компонент явно определен, например, запуск определенного действия в приложении. Однако неявные намерения - это намерения, в которых компонент явно не определен. Вместо этого намерение определяет activity, которое должно быть выполнено, и может быть вызван любой компонент, способный выполнить это activity. Это делается путем сравнения намерения с фильтрами намерений, которые объявлены в манифесте в других приложениях на устройстве. Если найдено совпадение, то намерение передается этому компоненту [25].

4 Манифест

Каждое приложение для Android должно иметь AndroidManifest.xml файл, который описывает все основные части приложения, например, операционную систему. Файл манифеста содержит информацию обо всех различных компонентах приложения, таких как activity и сервисы, а также фильтры намерений, используемые для описания того, как компоненты могут быть запущены. В нем также указываются разрешения, необходимые приложению, например, для доступа к защищенным частям системы или для получения доступа к другим приложениям [26].

5 Безопасность в Android

Android имеет несколько встроенных функций безопасности с целью снижения частоты проблем с безопасностью и смягчения последствий в случае возможного нарушения безопасности. Операционная система Android core построена поверх ядра Linux, поэтому Android также может воспользоваться преимуществами механизмов защиты на базе Linux, таких как изоляция процессов [27]. На рисунке 1 показаны компоненты операционной системы Android, где каждый из компонентов зависит от того, что все базовые компоненты тщательно защищены.

Рисунок 1. Программный стек операционной системы Android.
Рисунок 1. Программный стек операционной системы Android.

Вверху находятся приложения и сервисы. Существует два типа приложений: предустановленные и устанавливаемые пользователем. Предустановленные приложения или системные приложения, как их еще называют, уже установлены на устройстве либо Android, либо производителем устройства и помещаются в папку /system / app или / system / priv- app в более поздних версиях Android, оба из которых доступны только для чтения. Системные приложения имеют возможность получать разрешения, которые не могут получить приложения, установленные пользователем, что означает, что они могут получить доступ к большему объему системы. Например, они могут получить разрешение на доступ к eUICC. Однако установленные пользователем приложения - это приложения, которые может разрабатывать третья сторона. Они могут быть загружены конечным пользователем и установлены в папку /data/app на устройстве, которое имеет права как на чтение, так и на запись. Установленные пользователем приложения имеют тот недостаток, что они не могут получить доступ к некоторым API, которые требуют разрешений, предоставляемых только системным приложениям [27].

5.1 Application Sandbox

Большим и важным отличием Android от других сред Linux является application sandbox Android. Все программное обеспечение, работающее поверх ядра, такое как приложения, в том числе написанные на нативном коде, и библиотеки ОС ограничены application sandbox. Application sandbox - это механизм безопасности, используемый для изоляции запущенных приложений и ресурсов друг от друга и от операционной системы с целью защиты приложений и системы от вредоносного программного обеспечения. Android делает это, используя защиту на основе пользователей Linux и назначая UID (идентификатор пользователя) каждому приложению, а затем запускает их в отдельном процессе. Затем ядро обеспечивает безопасность между приложениями и системой [28].

5.2 Permissions

Приложения запускаются в изолированной среде приложений и имеют доступ только к ограниченному числу системных ресурсов и API. Чтобы приложение могло получить доступ к чему-либо за пределами песочницы, ему сначала должны быть предоставлены разрешения на это, чтобы защитить конфиденциальность пользователя.

В зависимости от того, к чему приложение пытается получить доступ и насколько чувствительна эта функция, система может автоматически предоставить разрешение приложению, или пользователю может сначала быть предложено одобрить или отклонить, если приложению следует предоставить разрешение. Разрешения, необходимые приложению, должны быть объявлены в формате XML в манифесте приложения с использованием тега [29]. В основном существует четыре различных уровня защиты, на которые разделены разрешения в Android:

  • Обычные разрешения: разрешения на доступ к данным или ресурсам, которые не представляют никакой или очень незначительной угрозы безопасности для конфиденциальности пользователя или других приложений. Любые приложения, запрашивающие эти разрешения, будут автоматически предоставлены им во время установки.
  • Разрешения на подпись: разрешения, которые предоставляются только приложениям, подписанным тем же сертификатом, что и приложение, определяющее запрашиваемое разрешение.
  • Опасные разрешения: разрешения на данные или ресурсы, которые могут повлиять на другие приложения, данные, хранящиеся пользователем, или включать личную информацию пользователя, например, доступ к текстовым сообщениям пользователя. Пользователь должен сначала предоставить приложению эти разрешения, прежде чем они будут предоставлены.
  • Системные разрешения: Разрешения предоставляются только системным приложениям, а не приложениям, разработанным третьей стороной.

Примерами некоторых соответствующих разрешений (хотя они оба являются системными разрешениями), которые могут быть полезны и далее обсуждаться в этом тезисе, являются:

  • android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS
  • android.permission.READ_PRIVILEGED_PHONE_STATE

6 eSIM на Android

Начиная с Android 9, Android поддерживает eSIM, предоставляя стандартные API для доступа к профилям eSIM и управления ими. Это позволяет третьим сторонам разрабатывать как собственные приложения для IPAD, так и приложения для управления eSIM, такие как загрузка, удаление и переключение профилей для устройств с поддержкой eSIM [30]. В этом разделе будет рассмотрен EuiccManager, используемый при загрузке профилей и управлении ими, и не будет затрагиваться тема разработки сторонних приложений LPA, поскольку это выходит за рамки данного тезиса.

6.1 EuiccManager

Менеджер Euicc - это интерфейс приложения к eUICC и точка входа для приложения, желающего взаимодействовать с LPA. API-интерфейсы в EuiccManager обеспечивают высокоуровневое управление профилями eSIM для загрузки, удаления и переключения профилей подписки [30]. EuiccManager содержит методы для проверки того, поддерживает ли работающее устройство eSIM, и для получения информации, такой как EID, о eUICC. В дополнение к этим четырем основным методам в Quickmanager являются:

  • downloadSubscription(): Попытка асинхронной загрузки профиля подписки. Принимает загружаемую подписку в качестве входных данных, которая, в свою очередь, содержит код активации с адресом SMTP + и токеном кода активации.
  • switchToSubscription(): Включает указанный профиль подписки (отключая текущий включенный профиль, если таковой имеется). Если входным сигналом является SubscriptionManager.INVALID_SUBSCRIPTION_ID, текущий активный профиль будет отключен без включения какого-либо другого профиля.
  • deleteSubscription(): Удаляет указанный профиль подписки. Если профиль, подлежащий удалению, активен при вызове, устройство сначала вызовет switch To- Subscription() с помощью SubscriptionManager.INVALID_SUBSCRIPTION_ID в качестве входных данных, отключив его перед удалением.
  • startResolutionActivity(): Используется, когда пользователь устройства может устранить возникшую проблему, например, при загрузке или переключении подписки.

Поскольку выполнение всех этих методов может занять некоторое время, все они выполняются асинхронно. Они используют обратные вызовы PendingIntent, где PendingIntent содержит определенный фреймворком код результата, который указывает, произошла ли ошибка или операция прошла успешно, а также подробный код результата из LPA. Сам обратный вызов PendingIntent должен быть широковещательным приемником [30]. В некоторых случаях, когда система не может выполнить операцию, код ошибки устанавливается в EuiccManager.EMBEDDED_SUBSCRIPTION_RESULT_RESOLVA- BLE_ERROR. Это означает, что ошибка может быть устранена пользователем устройства. Если, например, для загрузки профиля требуется код подтверждения, он вернет этот код ошибки. Затем можно вызвать startResolutionActivity() в EuiccManager с кодом ошибки в качестве входных данных. Это предложит пользователю через LUI устранить проблему. Если это был код подтверждения, который был необходим, пользователь может ввести его, и затем загрузка профиля возобновится [30]. Разрешимыми ошибками, определенными в настоящее время, являются:

  • ACTION_RESOLVE_DEACTIVATE_SIM: который используется, чтобы предложить пользователю согласиться с тем, что действие деактивирует текущую активную SIM-карту.
  • ACTION_RESOLVE_NO_PRIVILEGES: который используется, чтобы предложить пользователю согласиться с тем, что действие выполняется, даже если приложение не имеет привилегий оператора, таких как переключение профиля, когда приложение не имеет привилегий оператора над текущим активным профилем.
  • ACTION_RESOLVE_RESOLVABLE_ERRORS: который используется, чтобы позволить пользователю устранить все разрешимые ошибки, такие как запрос пользователя ввести код подтверждения оператора.

Методы downloadSubscription(), deleteSubscription() и switchToSubscription() требуют, чтобы вызывающий абонент имел либо разрешение WRITE_EMBEDDED_SUBSCRIPTIONS, либо был уполномочен управлять целевыми профилями, имея права оператора. Метод getid() требует разрешения состояния READ_PRIVILEGED_PHONE_STATE или права оператора.

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

6.2 Привилегии оператора

Чтобы сделать профили доступными только для оператора, которому они принадлежат, Android предоставляет приложениям доступ к некоторым API только в том случае, если у них есть необходимые привилегии. Чтобы несистемное приложение могло получить доступ к eUICC через EuiccManager, приложение должно иметь привилегии оператора. Это делается для того, чтобы один оператор не мог загружать профили других операторов, управлять ими и удалять их [31]. Это делается платформой Android путем загрузки сертификатов, которые хранятся в profiles ARF (Файл правил доступа), а затем предоставления разрешения на выполнение вызовов API EuiccManager только в том случае, если приложение, выполняющее эти вызовы, подписано любым из этих сертификатов [30]. Процесс получения привилегий перевозчика можно разделить на пять этапов, которые описаны ниже [30]:

  • APK приложения подписан и сертификат открытого ключа прикреплен к APK.
  • При подготовке профиля в SM-DP+ идентификатор SHA-1 или SHA-256 сертификата открытого ключа приложения и, при необходимости, имя пакета приложения помещаются в ARF в метаданных профиля.
  • Приложение пытается получить доступ к профилю в eUICC через менеджер Euicc.
  • Теперь платформа Android проверяет, совпадает ли хэш сертификата приложения, пытающегося получить доступ к этим API, с подписью в ARF профиля, и если в ARF включено необязательное имя пакета, то это также соответствует имени пакета вызывающего приложения.
  • Если подписи и имя пакета совпадают, то приложению предоставляются привилегии оператора над этим профилем.

6.3 Девайсы с несколькими eSIM

Начиная с Android 10, также возможно создавать приложения, поддерживающие устройства с несколькими eUICCs, установленными на одном устройстве, с помощью класса EuiccManager. Для этого требуется, чтобы экземпляр класса EuiccManager был создан для каждого из eUICCs с помощью метода createForCardId(), который привязывает результирующий объект EuiccManager к определенному eUICC с учетом его идентификатора карты, где идентификатор карты - это значение, которое однозначно идентифицирует eUICC. Когда объект EuiccManager создан, все последующие операции направляются в eUICC с заданным идентификатором карты [30]. Хотя ни один современный мобильный телефон не имеет более одного eUICC, весьма вероятно, что, поскольку eSIM заменяет обычную SIM-карту, в телефонах будет установлено более одного eUICC, чтобы поддерживать функциональность двух SIM-карт.

Литература

[1] D. Gleeson, eSIM Device Sales Forecast: Smartphones, Tablets, and Wearables, 2019–24, 2019.

https://ovum.informa.com/resources/product-content/esim-device-sales-forecast-smartphones-tablets-and-wearables-201924-ces004-000118

[2] E. Vahidian, Evolution of the SIM to eSIM, Norwegian University of Science and Technology, Department of Telematics, 2013.

[3] D. G. Koshy, S. N. Rao, Evolution of SIM Cards – What’s Next?, Interna- tional Conference on Advances in Computing, Communications and Infor- matics (ICACCI), Bangalore, 2018, pp. 1963-1967.

[4] B. A. Abdou, Commercializing eSIM for Network Operators, 2019 IEEE 5th World Forum on Internet of Things (WF-IoT), Limerick, Ireland, 2019, pp. 616-621.

[5] T. J. Gerpott, S. May, Embedded Subscriber Identity Module eSIM, Business

& Information Systems Engineering 59, 2017, pp. 293–296. https://doi.org/10.1007/s12599-017-0474-4

[6] P. Hristova and J. Bryan, eSIM For The Roaming Consumer, Roaming Con- sultancy Company Limited, 2018.

[7] GSMA, eSIM Whitepaper, The what and how of Remote SIM Provisioning, 2018.

[8] M. Meyer, E. A. Quaglia and B. Smyth, An Overview of GSMA’s M2M Remote Provisioning Specification, 2019.

[9] A. Vesselkov, H. Hammainen and P. Ikalainen, Value networks of embedded SIM-based remote subscription management, 2015 Conference of Telecommu- nication, Media and Internet Techno-Economics (CTTE), Munich, 2015, pp. 1-7.

[10] M. Tsurusawa, Latest Trends in Remote SIM Provisioning Technology, Special Feature - The future of cellular networks, New Breeze Vol. 29 No.3 Summer, 2017, pp. 1-10.

[11] J. Park, K. Baek and C. Kang, Secure Profile Provisioning Architecture for Embedded UICC, 2013 International Conference on Availability, Reliability and Security, Regensburg, 2013, pp. 297-303.

[12] S. Chitroub, N. Zidouni, H. Aouadia, D. Blaid and R. Laouar, SIM Card of the Next-Generation Wireless Networks: Security, Potential Vulnerabilities and Solutions, 2018 2nd European Conference on Electrical Engineering and Computer Science (EECS), Bern, Switzerland, 2018, pp. 502-509.

[13] M. Meyer, E. A. Quaglia and B. Smyth, Attacks against GSMA’s M2M Re- mote Provisioning, Financial Cryptography and Data Security, 2018, pp. 243- 252.

https://www.blackhat.com/docs/eu-17/materials/eu-17-Meyer-Attacks-Against-GSMAS-M2M-Remote-Provisioning-wp.pdf

[14] Ernst & Young Mobile network operator on-demand subscription management study, 2015.

https://www.ey.com/Publication/vwLUAssets/EY-mobile-network-operator-on-demand-subscription-management/%24FILE/EY-mobile-network-operator-on-demand-subscription-management.pdf

[15] GSMA, RSP Technical Specification Version 2.2.1, 2018. https://www.gsma.com/newsroom/wp-content/uploads//SGP.22-v2.2.1-2.pdf

[16] GSMA, RSP Architecture Version 2.2, 2017. https://www.gsma.com/newsroom/wp-content/uploads//SGP.21_v2.2.pdf

[17] T. Chang, eSIMS: Everything You Need to Know, WhistleOut, September 2019. https://www.whistleout.com/CellPhones/Guides/esims

[18] Huawei, HUAWEI P40 Specifications. https://consumer.huawei.com/en/phones/p40/specs/

[19] Apple, Find wireless carriers that offer eSIM service. https://support.apple.com/en-us/HT209096

[20] T-Mobile T-Mobile Prepaid eSIM app.

https://www.t-mobile.com/support/plans-features/t-mobile-esim-app

[21] Android, Application Fundamentals. https://developer.android.com/guide/components/fundamentals

[22] Android, Introduction to Activities. https://developer.android.com/guide/components/activities/intro-activities

[23] Android, Understand the Activity Lifecycle. https://developer.android.com/guide/components/activities/activity-lifecycle

[24] Android, Content providers. https://developer.android.com/guide/topics/providers/content-providers

[25] Android, Intents and Intent Filters. https://developer.android.com/guide/components/intents-filters

[26] Android, App Manifest Overview. https://developer.android.com/guide/topics/manifest/manifest-intro

[27] Android, Secure an Android Device.

https://source.android.com/security

[28] Android, Application Sandbox.

https://source.android.com/security/app-sandbox

[29] Android, Permissions overview. https://developer.android.com/guide/topics/permissions/overview

[30] Android, Implementing eSIM. https://source.android.com/devices/tech/connect/esim-overview

[31] Android, UICC Carrier Privileges. https://source.android.com/devices/tech/config/uicc

33
Начать дискуссию