Перейти к содержанию

Экспортированный Activity

Описание

Класс Activity — это важнейший компонент приложения Android. В отличие от парадигм программирования, в которых приложения запускаются с помощью метода main(), система Android инициирует код в экземпляре Activity, вызывая определенные методы, которые соответствуют определенным этапам его жизненного цикла. Когда одно приложение вызывает другое, вызывающее приложение вызывает Activity в другом приложении. Таким образом, Activity служит точкой входа для взаимодействия приложения с пользователем.

Чтобы приложение могло использовать Activity, вы должны объявить Activity и некоторые её атрибуты в файле AndroidManifest.xml.

<manifest ... >
  <application ... >
      <activity android:name=".ExampleActivity" />
      ...
  </application ... >
  ...
</manifest >

Одним из атрибутов Activity является android:exported, он определяет, может ли Activity запускаться компонентами других приложений. Если значение атрибута равно true, любое приложение может получить доступ к Activity и запустить его по точному имени класса. Если значение false, только компоненты одного и того же приложения, приложения с тем же идентификатором пользователя или привилегированные системные компоненты могут запускать этот Activity.

Логика значения этого атрибута по умолчанию со временем менялась и различалась в зависимости от типов компонентов и версий Android. Например, на уровне API 16 (Android 4.1.1) или ниже атрибут android:exported по умолчанию имеет значение true. Если этот атрибут не задан явно, существует риск того, что на некоторых устройствах будут разные значения по умолчанию. А вот уже с версии API 31 (Android 12) требуется в обязательном порядке явно указывать значение атрибута android:exported. Также важно упомянуть, что наличие интент-фильтров и явное отсутствии значения атрибута android:exported - автоматически делает компонент экспортируемым.

Проблема

Ситуация с разными значениями атрибута android:exported по умолчанию означает, что вы можете случайно раскрыть внутренние компоненты приложения. Таким образом другие приложения неправомерно получают доступ к внутренним компонентам вашего приложения и может произойти утечка конфиденциальных данных или даже выполнение кода в контексте уязвимого приложения.

Рекомендации

Всегда явно устанавливайте атрибут android:exported. Это не оставит места для интерпретации и четко сигнализирует о вашем намерении относительно видимости компонента. Также будьте внимательны при объявлении интент-фильтров у Activity.

Ссылки

  1. Экспортируемость компонентов

  2. About Activity

К началу