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