На этой странице описывается, как строится политика SELinux. Политика SELinux формируется на основе комбинации базовой политики AOSP (платформы) и политики, специфичной для устройства (производителя). Процесс сборки политики SELinux для Android 4.4 – Android 7.0 объединял все фрагменты sepolicy, а затем генерировал монолитные файлы в корневом каталоге. Это означало, что производители SoC и ODM-производители модифицировали boot.img
(для устройств, отличных от A/B) или system.img
(для устройств A/B) при каждом изменении политики.
В Android 8.0 и более поздних версиях политика платформы и поставщика разрабатывается отдельно. Производители ПО и OEM-оборудования могут обновлять свои разделы политики, создавать свои образы (например, vendor.img
и boot.img
), а затем обновлять их независимо от обновлений платформы.
Однако, поскольку модульные файлы политики SELinux хранятся в разделах /vendor
, процесс init
должен смонтировать системные и разделы поставщика раньше, чтобы иметь возможность прочитать файлы SELinux из этих разделов и объединить их с основными файлами SELinux в системном каталоге (перед загрузкой их в ядро).
Исходные файлы
Логика сборки SELinux содержится в этих файлах:
-
external/selinux
: Внешний проект SELinux, используемый для сборки утилит командной строки HOST для компиляции политики и меток SELinux.-
external/selinux/libselinux
: Android использует только подмножество внешнего проектаlibselinux
с некоторыми специфичными для Android настройками. Подробности см. в файлеexternal/selinux/README.android
. -
external/selinux/libsepol
: -
external/selinux/checkpolicy
: компилятор политики SELinux (исполняемые файлы хоста:checkpolicy
,checkmodule
иdispol
). Зависит отlibsepol
.
-
-
system/sepolicy
: основные конфигурации политик Android SELinux, включая контексты и файлы политик. Основная логика сборки sepolicy также находится здесь (system/sepolicy/Android.mk
).
Более подробную информацию о файлах в system/sepolicy
можно найти в разделе Реализация SELinux .
Android 7.x и ниже
В этом разделе описывается, как строится политика SELinux в Android 7.x и ниже.
Процесс сборки для Android 7.x и ниже
Политика SELinux создаётся путём объединения базовой политики AOSP с настройками, специфичными для устройства. Объединённая политика затем передаётся компилятору политики и различным средствам проверки. Настройка, специфичная для устройства, осуществляется с помощью переменной BOARD_SEPOLICY_DIRS
, определённой в файле Boardconfig.mk
, специфичном для устройства. Эта глобальная переменная сборки содержит список каталогов, определяющих порядок поиска дополнительных файлов политики.
Например, поставщик SoC и ODM могут добавить по каталогу: один для настроек, специфичных для SoC, и другой для настроек, специфичных для устройства, чтобы сгенерировать окончательные конфигурации SELinux для данного устройства:
-
BOARD_SEPOLICY_DIRS += device/ SOC /common/sepolicy
-
BOARD_SEPOLICY_DIRS += device/ SoC / DEVICE /sepolicy
Содержимое файлов file_contexts в system/sepolicy
и BOARD_SEPOLICY_DIRS
объединяется для создания файла file_contexts.bin
на устройстве:

Рисунок 1. Логика сборки SELinux.
Файл sepolicy
состоит из нескольких исходных файлов:
- Простой текстовый файл
policy.conf
создается путем объединения файловsecurity_classes
,initial_sids
,*.te
,genfs_contexts
иport_contexts
в указанном порядке. - Для каждого файла (например,
security_classes
) его содержимое представляет собой объединение файлов с тем же именем вsystem/sepolicy/
иBOARDS_SEPOLICY_DIRS
. - Файл
policy.conf
отправляется компилятору SELinux для проверки синтаксиса и компилируется в двоичный формат какsepolicy
на устройстве.Рисунок 2. Файл политики SELinux.
Файлы SELinux
После компиляции устройства Android под управлением версии 7.x и более ранних версий обычно содержат следующие файлы, связанные с SELinux:
-
selinux_version
- sepolicy: двоичный вывод после объединения файлов политики (таких как
security_classes
,initial_sids
и*.te
) -
file_contexts
-
property_contexts
-
seapp_contexts
-
service_contexts
-
system/etc/mac_permissions.xml
Более подробную информацию см. в разделе Реализация SELinux .
Инициализация SELinux
При загрузке системы SELinux находится в разрешительном режиме (а не в принудительном). Процесс init выполняет следующие задачи:
- Загружает файлы
sepolicy
из ramdisk в ядро через/sys/fs/selinux/load
. - Переводит SELinux в принудительный режим.
- Запускает
re-exec()
для применения правила домена SELinux к себе.
Чтобы сократить время загрузки, выполните re-exec()
в процессе init
как можно скорее.
Android 8.0 и выше
В Android 8.0 политика SELinux разделена на компоненты платформы и поставщика, что позволяет выполнять независимые обновления политики платформы/поставщика, сохраняя при этом совместимость.
Платформенная политика дополнительно разделена на частную и публичную части для экспорта определённых типов и атрибутов разработчикам политик поставщика. Публичные типы/атрибуты платформы гарантированно поддерживаются в качестве стабильных API для данной версии платформы. Совместимость с публичными типами/атрибутами предыдущих платформ может быть гарантирована для нескольких версий с помощью файлов сопоставления платформ.
Процесс сборки для Android 8.0
Политика SELinux в Android 8.0 создается путем объединения компонентов из /system
и /vendor
. Логика правильной настройки описана в файле /platform/system/sepolicy/Android.mk
.
Политика существует в следующих местах:
Расположение | Содержит |
---|---|
system/sepolicy/public | API sepolicy платформы |
system/sepolicy/private | Детали реализации платформы (поставщики могут игнорировать) |
system/sepolicy/vendor | Файлы политики и контекста, которые могут использовать поставщики (при желании поставщики могут их игнорировать) |
BOARD_SEPOLICY_DIRS | Политика поставщика |
BOARD_ODM_SEPOLICY_DIRS (Android 9 и выше) | Odm sepolicy |
SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS (Android 11 и выше) | API политики безопасности System_ext |
SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (Android 11 и выше) | Подробности реализации System_ext (поставщики могут игнорировать) |
PRODUCT_PUBLIC_SEPOLICY_DIRS (Android 11 и выше) | API политики безопасности продукта |
PRODUCT_PRIVATE_SEPOLICY_DIRS (Android 11 и выше) | Подробности реализации продукта (поставщики могут игнорировать) |
Система сборки использует эту политику и создаёт компоненты политики system, system_ext, product, vendor и odm в соответствующем разделе. Шаги включают:
- Преобразование политик в формат общего промежуточного языка SELinux (CIL), а именно:
- политика публичной платформы (система + system_ext + продукт)
- комбинированная частная + государственная политика
- публичная + поставщик и политика
BOARD_SEPOLICY_DIRS
- Версионирование политики, предоставляемой публичной частью политики поставщика. Выполняется с использованием созданной публичной политики CIL для информирования объединённой политики (публичной, поставщика и
BOARD_SEPOLICY_DIRS
о том, какие части необходимо преобразовать в атрибуты, связанные с политикой платформы. - Создание файла сопоставления, связывающего компоненты платформы и поставщика. Изначально это просто связывает типы из публичной политики с соответствующими атрибутами в политике поставщика; впоследствии он также станет основой для файла, поддерживаемого в будущих версиях платформы, обеспечивая совместимость с политикой поставщика, ориентированной на данную версию платформы.
- Объединение файлов политики (опишите как локальные, так и предварительно скомпилированные решения).
- Объедините политику сопоставления, платформы и поставщика.
- Скомпилировать выходной двоичный файл политики.
Платформа публичной политики
Публичная политика платформы sepolicy включает в себя всё, что определено в разделе system/sepolicy/public
. Платформа может предполагать, что типы и атрибуты, определённые в публичной политике, являются стабильными API для данной версии платформы. Это часть sepolicy, экспортируемая платформой, на основе которой разработчики политики поставщика (то есть устройства) могут создавать дополнительные политики, специфичные для конкретного устройства.
Версии типов определяются в соответствии с версией политики, для которой написаны файлы поставщика, определяемой переменной сборки PLATFORM_SEPOLICY_VERSION
. Версионированная публичная политика затем включается в политику поставщика и (в исходном виде) в политику платформы. Таким образом, итоговая политика включает в себя частную политику платформы, публичную политику текущей платформы, политику, специфичную для устройства, и версионированную публичную политику, соответствующую версии платформы, для которой была написана политика устройства.
Платформа частной политики
Частная политика платформы sepolicy включает в себя всё, что определено в /system/sepolicy/private
. Эта часть политики формирует типы, разрешения и атрибуты, действующие только на платформе и необходимые для функциональности платформы. Они не экспортируются разработчикам политик vendor/device
. Разработчики политик, не относящиеся к платформе, не должны создавать свои расширения политик на основе типов/атрибутов/правил, определённых в частной политике платформы sepolicy. Более того, эти правила могут быть изменены или удалены в рамках обновления, затрагивающего только фреймворк.
Платформа частного картографирования
Платформенное частное сопоставление включает в себя операторы политики, которые сопоставляют атрибуты, представленные в публичной политике платформы предыдущих версий, с конкретными типами, используемыми в текущей публичной политике платформы. Это гарантирует, что политика поставщика, написанная на основе публичных атрибутов платформы из предыдущих версий публичной политики платформы, продолжит работать. Управление версиями основано на переменной сборки PLATFORM_SEPOLICY_VERSION
, заданной в AOSP для данной версии платформы. Для каждой предыдущей версии платформы, с которой данная платформа должна принимать политику поставщика, существует отдельный файл сопоставления. Подробнее см. в разделе «Совместимость» .
Android 11 и выше
system_ext и политика безопасности продукта
В Android 11 добавлены политики system_ext и product. Как и политика платформы sepolicy, политики system_ext и product разделены на публичную и частную.
Публичная политика экспортируется в систему поставщика. Типы и атрибуты становятся стабильными API, и политика поставщика может ссылаться на типы и атрибуты в публичной политике. Типы версионируются в соответствии с PLATFORM_SEPOLICY_VERSION
, а версионированная политика включается в политику поставщика. Исходная политика включается в каждый раздел system_ext и раздел продукта.
Частная политика содержит типы, разрешения и атрибуты, доступные только для system_ext и только для product, необходимые для работы разделов system_ext и product. Частная политика невидима для поставщика, что подразумевает, что эти правила являются внутренними и могут быть изменены.
system_ext и сопоставление продуктов
system_ext и product могут экспортировать свои назначенные публичные типы в Vendor. Однако ответственность за поддержание совместимости лежит на каждом партнере. Для обеспечения совместимости партнеры могут предоставить собственные файлы сопоставления, которые сопоставляют версионированные атрибуты предыдущих версий с конкретными типами, используемыми в текущей публичной политике.
- Чтобы установить файл сопоставления для system_ext, поместите cil-файл, содержащий нужную информацию о сопоставлении, в
{SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil
, а затем добавьтеsystem_ext_{ver}.cil
вPRODUCT_PACKAGES
. - Чтобы установить файл сопоставления для продукта, поместите cil-файл, содержащий нужную информацию о сопоставлении, в
{PRODUCT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil
, а затем добавьтеproduct_{ver}.cil
вPRODUCT_PACKAGES
.
Обратитесь к примеру , в котором добавляется файл сопоставления раздела продукта устройства Redbull.
Предварительно скомпилированная политика SELinux
Перед тем, как init
включит SELinux, init
собирает все CIL-файлы из разделов ( system
, system_ext
, product
, vendor
и odm
) и компилирует их в двоичную политику, формат, который может быть загружен в ядро. Поскольку компиляция занимает время (обычно 1-2 секунды), CIL-файлы предварительно компилируются во время сборки и помещаются либо в /vendor/etc/selinux/precompiled_sepolicy
, либо /odm/etc/selinux/precompiled_sepolicy
вместе с хэшами sha256 входных CIL-файлов. Во время выполнения init
проверяет, был ли обновлен какой-либо файл политики, сравнивая хэши. Если ничего не изменилось, init
загружает предварительно скомпилированную политику. Если нет, init
компилирует ее «на лету» и использует вместо предварительно скомпилированной.
Более конкретно, предкомпилированная политика используется при соблюдении всех следующих условий. Здесь {partition}
представляет раздел, в котором находится предкомпилированная политика: либо vendor
, либо odm
.
- Оба
/system/etc/selinux/plat_sepolicy_and_mapping.sha256
и/{partition}/etc/selinux/precompiled_sepolicy.plat_sepolicy_and_mapping.sha256
существуют и идентичны. - Оба файла
/system_ext/etc/selinux/system_ext_sepolicy_and_mapping.sha256
и/{partition}/etc/selinux/precompiled_sepolicy.system_ext_sepolicy_and_mapping.sha256
не существуют. Или оба существуют и идентичны. - Оба
/product/etc/selinux/product_sepolicy_and_mapping.sha256
и/{partition}/etc/selinux/precompiled_sepolicy.product_sepolicy_and_mapping.sha256
не существуют. Или оба существуют и идентичны.
Если какой-либо из них отличается, init
возвращается к пути компиляции на устройстве. Подробнее см. в файле system/core/init/selinux.cpp