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

Приложение не использует объявленное разрешение

Описание

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

Разрешения защищают доступ к:

  • данным с ограниченным правом на использование, таким как состояние системы и контактная информация пользователей;

  • запрещенным действиям, среди которых — подключение к сопряженному устройству и запись звука.

Многие механизмы безопасности Android основаны на принципах классических Linux-систем и способы работы с разрешениями — не исключение. Каждое приложение, установленное на устройстве, имеет собственного пользователя и группу в Linux. На этой особенности реализован механизм песочницы. То есть никто, кроме этого пользователя, не имеет права доступа к директории приложения.

Общие положения Android-разрешений

Существует несколько типов разрешений:

Install-time permissions — предоставляются автоматически при установке приложения. Разрешения во время загрузки дают приложению неполный доступ к данным или позволяют ему выполнять ограниченные действия, которые минимально влияют на систему или другие программные продукты. Android включает несколько install-time permissions: normal permissions и signature permissions, которые отличаются уровнем защиты (normal и signature).

Runtime permissions (dangerous permissions) — требуют, чтобы приложение запросило разрешение во время выполнения. Предоставляет продукту дополнительный доступ к данным с ограниченными правами или разрешает ему выполнять некоторые действия, которые существенно влияют на систему и другие приложения. Этим permissions система присваивает dangerous уровень защиты.

Special permissions — соответствуют конкретным операциям приложения. Только Android-платформа и OEM (оригинальный производитель оборудования) могут определять специальные разрешения в тех случаях, когда хотят защитить доступ к особенно мощным действиям, таким как отрисовка поверх других приложений. Этим разрешениям система присваивает appop уровень защиты. В отличие от runtime permissions, здесь пользователь должен предоставить специальные разрешения на странице «Доступ к специальному приложению» в системных настройках. Приложения могут отправлять туда пользователей с помощью Intent, который приостанавливает ПО и запускает соответствующую страницу настроек для данного специального разрешения. После того, как пользователь вернется в приложение, оно может проверить, предоставлено ли разрешение в функции onResume().

Группы разрешений

Разрешения могут принадлежать группам, которые состоят из набора логически связанных permissions. Например, разрешения на отправку и получение SMS могут входить в одну группу, поскольку оба они относятся к взаимодействию приложения с сообщениями.

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

<permission-group android:name="android.permission-group.MESSAGES"
    android:label="@string/permgrouplab_messages"
    android:icon="@drawable/perm_group_messages"
    android:description="@string/permgroupdesc_messages"
    android:permissionGroupFlags="personalInfo"
    android:priority="360"/>

<!-- Allows an application to monitor incoming SMS messages, to record or perform processing on them. -->
<permission android:name="android.permission.RECEIVE_SMS"
    android:permissionGroup="android.permission-group.MESSAGES"
    android:protectionLevel="dangerous"
    android:label="@string/permlab_receiveSms"
    android:description="@string/permdesc_receiveSms" />

<!-- Allows an application to send SMS messages. -->
<permission android:name="android.permission.SEND_SMS"
    android:permissionGroup="android.permission-group.MESSAGES"
    android:protectionLevel="dangerous"
    android:permissionFlags="costsMoney"
    android:label="@string/permlab_sendSms"
    android:description="@string/permdesc_sendSms" />

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

<uses-permission android:name="android.permission.READ_CONTACTS" />

Это встроенное разрешение, которое имеет уровень защиты (protectionLevel) — dangerous. При установке приложения с данным разрешением Android ОС спросит пользователя, хочет ли он предоставить доступ к данным своих контактов.

Разработчики могут создать свои разрешения. Для этого их нужно прописать в файле AndroidManifest.xml:

<permission android:name="com.mycoolcam.USE_COOL_CAMERA"
    android:protectionLevel="dangerous" />

<activity android:name=".CoolCamActivity" android:exported="true" android:permission="com.mycoolcam.USE_COOL_CAMERA">
<intent-filter>
    <action android:name="com.mycoolcam.LAUNCH_COOL_CAM" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

Если какое-то стороннее приложение захочет использовать данные Activity, то разрешения необходимо также прописать в файле AndroidManifest.xml этого продукта:

<uses-permission android:name="com.mycoolcam.USE_COOL_CAMERA" />

И тогда при установке приложения ОС Android спросит пользователя, давать ли доступ приложению к камере или нет.

Уровни разрешений

  1. normal — пользователь не знает, что приложение запрашивает доступ к этому ресурсу, потому что права предоставляются автоматически при установке;

  2. dangerous — этот уровень требует, чтобы пользователь подтвердил, может ли приложение получить доступ к определенному ресурсу;

  3. signature — приложение, использующее этот уровень разрешений, должно быть подписано тем же сертификатом, что и продукт, объявивший его. Это не позволяет злоумышленнику прописать <uses-permission> с этим разрешением в файле AndroidManifest.xml, потому что Android не даст установить приложение;

  4. Есть несколько других уровней, таких как system, installer, privileged, appop и т. д., которые используются системными приложениями. Их следует рассматривать как уровень signature с точки зрения злоумышленника, т. е. разрешения, использующие этот уровень защиты, не могут быть объявлены в <uses-permission>.

Некоторые разрешения, такие как CAMERA, позволяют вашему приложению получать доступ к аппаратным частям, которые есть только у некоторых устройств Android. Если ваше приложение объявляет одно из этих hardware-associated permissions, подумайте, сможет ли оно работать на устройстве, не имеющем этого оборудования. В большинстве случаев оборудование является необязательным, поэтому лучше и назвать его таковым, задав для android:required значение false в объявлении <uses-feature>, как показано в следующем фрагменте кода из файла AndroidManifest.xml:

<uses-feature android:name="android.hardware.camera"
    android:required="false" />

Если вы не установите для android:required значение false в объявлении <uses-feature>, Android предположит, что для запуска вашего приложения требуется аппаратное обеспечение. Система запретит некоторым устройствам устанавливать ваше приложение.

При объявлении основных компонентов (Activity, Content Provider, Broadcast Receiver, Service), у каждого компонента можно указать атрибут android:permission.

<activity
    android:name=".ui.webview.WebViewActivity"
    android:screenOrientation="portrait"
    android:permission="android.permission.CALL_PHONE"
    android:theme="@style/AppTheme.LightSystemBars" />

В атрибуте android:permission указывается имя разрешения, которое клиенты должны иметь для доступа к данным компонента. Необходимо внимательно указывать значение атрибута и не допускать ошибок.

Проблема

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

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

Необходимо избегать опечаток в названии разрешений в месте их использования (у компонента) и не объявлять неиспользуемые разрешения.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <permission
        android:name="com.test.MyNotUsedPermission"
        android:protectionLevel="dangerous" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.SuperApp">
        <activity
            android:name=".UiCatalogActivity"
            android:permission="com.test.MyUsedPermission"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Мы видим, что в данном файле AndroidManifest.xml объявлено кастомное разрешение (смотрим на тэг <permission…). В данном примере компонент Activity под названием UiCatalogActivity использует "com.test.MyUsedPermission" кастомное разрешение, хотя ожидается, что будет использоваться "com.test.MyNotUsedPermission".

Плохо Хорошо
У UiCatalogActivity указано несуществующее разрешение — com.test.MyUsedPermission У UiCatalogActivity указано объявленное разрешение — com.test.MyNotUsedPermission

Ссылки

  1. Permissions on Android
  2. Распространенные ошибки при использовании разрешений в Android
  3. Permissions в Android: как не допустить ошибок при разработке
К началу