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

Возможности позволяют процессам 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 был портирован в:

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

Проверка

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