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