Разрешения и группы разрешений
Описание
Разрешения, или Permissions, в официальной документации — это механизмы разграничения доступа к различным функциям на устройстве. Они служат для обеспечения конфиденциальности пользователей, чтобы последние понимали, к каким данным и действиям имеет доступ приложение и что оно может делать.
Разрешения защищают доступ к:
-
данным с ограниченным правом на использование, таким как состояние системы и контактная информация пользователей;
-
запрещенным действиям, среди которых — подключение к сопряженному устройству и запись звука.
Многие механизмы безопасности Android основаны на принципах классических Linux-систем и способы работы с разрешениями — не исключение. Каждое приложение, установленное на устройстве, имеет собственного пользователя и группу в Linux. На этой особенности реализован механизм песочницы. То есть никто, кроме этого пользователя, не имеет права доступа к директории приложения.
На этой же основе построены и разрешения. В файле frameworks/base/data/etc/platform.xml имена разрешений, которые есть в Android, сопоставлены с наименованиями групп в Linux.
<permissions>
<!-- ================================================================== -->
<!-- ================================================================== -->
<!-- ================================================================== -->
<!-- The following tags are associating low-level group IDs with
permission names. By specifying such a mapping, you are saying
that any application process granted the given permission will
also be running with the given group ID attached to its process,
so it can perform any filesystem (read, write, execute) operations
allowed for that group. -->
...
<permission name="android.permission.INTERNET" >
<group gid="inet" />
</permission>
<permission name="android.permission.READ_LOGS" >
<group gid="log" />
</permission>
<permission name="android.permission.BLUETOOTH" >
<group gid="net_bt" />
</permission>
...
</permissions>
Если пойти чуть глубже и посмотреть, что представляют из себя группы и как они работают внутри системы, то в файле system/core/include/private/android_filesystem_config.h можно увидеть сопоставление групп с их числовыми идентификаторами:
...
#define AID_ROOT 0 /* traditional unix root user */
#define AID_SYSTEM 1000 /* system server */
#define AID_RADIO 1001 /* telephony subsystem, RIL */
#define AID_BLUETOOTH 1002 /* bluetooth subsystem */
#define AID_CAMERA 1006 /* camera devices */
...
static const struct android_id_info android_ids[] = {
{ "root", AID_ROOT, },
{ "system", AID_SYSTEM, },
{ "radio", AID_RADIO, },
{ "bluetooth", AID_BLUETOOTH, },
{ "camera", AID_CAMERA, },
...
Когда приложение запрашивает какие-то привилегии в системе, используя механизм разрешений, всё, что происходит «под капотом» — это добавление пользователя в определенную группу. Соответственно, когда приложение пробует воспользоваться, например камерой, на уровне системы происходит проверка присутствия клиента в нужной группе.
Общие положения 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:
Это встроенное разрешение, которое имеет уровень защиты (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 этого продукта:
И тогда при установке приложения ОС Android спросит пользователя, давать ли доступ приложению к камере или нет.
Уровни разрешений
-
normal — пользователь не знает, что приложение запрашивает доступ к этому ресурсу, потому что права предоставляются автоматически при установке;
-
dangerous — этот уровень требует, чтобы пользователь подтвердил, может ли приложение получить доступ к определенному ресурсу;
-
signature — приложение, использующее этот уровень разрешений, должно быть подписано тем же сертификатом, что и продукт, объявивший его. Это не позволяет злоумышленнику прописать
<uses-permission>
с этим разрешением в файле AndroidManifest.xml, потому что Android не даст установить приложение; -
Есть несколько других уровней, таких как system, installer, privileged, appop и т. д., которые используются системными приложениями. Их следует рассматривать как уровень signature с точки зрения злоумышленника, т. е. разрешения, использующие этот уровень защиты, не могут быть объявлены в
<uses-permission>
.
Некоторые разрешения, такие как CAMERA, позволяют вашему приложению получать доступ к аппаратным частям, которые есть только у некоторых устройств Android. Если ваше приложение объявляет одно из этих hardware-associated permissions, подумайте, сможет ли оно работать на устройстве, не имеющем этого оборудования. В большинстве случаев оборудование является необязательным, поэтому лучше и назвать его таковым, задав для android:required
значение false
в объявлении <uses-feature>
, как показано в следующем фрагменте кода из файла AndroidManifest.xml:
Если вы не установите для android:required
значение false
в объявлении <uses-feature>
, Android предположит, что для запуска вашего приложения требуется аппаратное обеспечение. Система запретит некоторым устройствам устанавливать ваше приложение.