Возможности позволяют процессам Linux отказаться от большинства привилегий root, сохраняя при этом подмножество привилегий, которые им требуются для выполнения их функции. Первоначальная реализация возможностей сделала невозможным для процессов fork+exec'd наследовать возможности, если только исполняемые файлы не имели настроенных возможностей файла. Возможности файла, в свою очередь, представляют риск безопасности, поскольку любой процесс, выполняющий файл с возможностями файла, может получить эти возможности.
Возможности окружения позволяют системным службам, запущенным init, настраивать возможности в своих .rc
файлах, объединяя конфигурацию в один файл вместо разделения конфигурации в файле fs_config.c
. Это означает, что для любой службы, запущенной init, вы можете использовать .rc
файл, связанный со службой, для настройки возможностей этой службы.
Возможности окружения являются предпочтительным механизмом для настройки возможностей для служб, запущенных init (этот метод сохраняет все аспекты конфигурации службы в одном файле .rc
). Мы рекомендуем использовать возможности окружения вместо настройки возможностей файловой системы с помощью раздела caps в файлах config.fs
.
При настройке возможностей для служб , не запущенных init , продолжайте настраивать возможности файловой системы с помощью fs_config.c
.
Включить окружающие возможности
Чтобы включить внешние возможности для данной службы, используйте ключевое слово capabilities
в init. Для получения информации о текущем языке init обратитесь к файлу README.md init .
Например, чтобы включить внешние возможности для службы 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 был перенесен в:
- андроид-3.18:
- андроид-4.1:
Небольшое исправление безопасности https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b7f76ea2ef6739ee484a165ffbac98deb855d3d3 было портировано в:
- андроид-3.18:
- андроид-4.1:
Проверка
Бионические модульные тесты включают модульные тесты для внешних возможностей. Помимо этого, использование ключевого слова "capabilities" в Android init для службы, а затем проверка того, что служба получает ожидаемые возможности, позволит проводить тестирование этой функции во время выполнения.