Окружающие возможности

Возможности позволяют процессам Linux отказываться от большинства привилегий root, сохраняя при этом подмножество привилегий, необходимых им для выполнения своих функций. Первоначальная реализация возможностей не позволяла процессам fork+exec наследовать возможности, если для исполняемых файлов не были настроены возможности файлов. Файловые возможности, в свою очередь, представляют угрозу безопасности, поскольку любой процесс, выполняющий файл с файловыми возможностями, сможет получить эти возможности.

Возможности окружения позволяют системным службам, запускаемым init, настраивать возможности в своих файлах .rc , перенося конфигурацию в один файл вместо разделения конфигурации в файле fs_config.c . Это означает, что для любой службы, запущенной init, вы можете использовать файл .rc , связанный со службой, для настройки возможностей этой службы.

Возможности окружения являются предпочтительным механизмом для установки возможностей для служб, запускаемых init (этот метод сохраняет все аспекты конфигурации службы в одном файле .rc ). Мы рекомендуем использовать внешние возможности, а не настраивать возможности файловой системы с помощью раздела caps в файлах config.fs .

При настройке возможностей для служб, не запускаемых init , продолжайте настраивать возможности файловой системы с помощью fs_config.c .

Включение окружающих возможностей

Чтобы включить внешние возможности для данной службы, используйте ключевое слово capabilities в init. Подробности о текущем языке инициализации см. в файле init README.md .

Например, чтобы включить внешние возможности для службы AOSP wificond , файл .rc для службы wificond настраивает соответствующего пользователя и группы и предоставляет службе указанные возможности с помощью ключевого слова capabilities :

service wificond /system/bin/wificond
    class main
    user wifi
    group wifi net_raw net_admin
    capabilities NET_RAW NET_ADMIN

Эталонная реализация

Эталонной реализацией является общее ядро ​​Android https://android.googlesource.com/kernel/common/ .

Требуемые патчи

Необходимые исправления были перенесены на все соответствующие общие ветки ядра Android.

Патч основных возможностей окружения https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08 был перенесен в:

Небольшое исправление безопасности https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b7f76ea2ef6739ee484a165ffbac98deb855d3d3 было перенесено в:

Проверка

Бионические модульные тесты включают модульные тесты для внешних возможностей. Кроме того, использование ключевого слова «capabilities» в Android init для службы, а затем проверка того, что служба получает ожидаемые возможности, позволит протестировать эту функцию во время выполнения.