На этой странице описывается, как строится политика SELinux. Политика SELinux строится из комбинации базовой политики AOSP (платформа) и политики, специфичной для устройства (поставщик). Поток сборки политики SELinux для Android 4.4 через Android 7.0 объединил все фрагменты sepolicy, а затем сгенерировал монолитные файлы в корневом каталоге. Это означало, что поставщики SoC и производители ODM изменяли boot.img
(для устройств, не относящихся к A/B) или system.img
(для устройств A/B) каждый раз при изменении политики.
В Android 8.0 и выше политика платформы и поставщика строится отдельно. SOC и OEM могут обновлять свои части политики, создавать свои образы (например, vendor.img
и boot.img
), а затем обновлять эти образы независимо от обновлений платформы.
Однако, поскольку модульные файлы политики SELinux хранятся в разделах /vendor
, процесс init
должен смонтировать системный и разделы vendor заранее, чтобы иметь возможность прочитать файлы 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 разделена на компоненты платформы и поставщика, что позволяет выполнять независимые обновления политики платформы/поставщика, сохраняя при этом совместимость.
Платформенная sepolicy далее разделена на части platform private и platform public для экспорта определенных типов и атрибутов разработчикам политики поставщика. Платформенные public типы/атрибуты гарантированно поддерживаются как стабильные API для данной версии платформы. Совместимость с предыдущими platform public типами/атрибутами может быть гарантирована для нескольких версий с использованием файлов сопоставления платформы.
Процесс сборки для 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 sepolicy System_ext |
SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (Android 11 и выше) | Детали реализации System_ext (поставщики могут игнорировать) |
PRODUCT_PUBLIC_SEPOLICY_DIRS (Android 11 и выше) | API sepolicy продукта |
PRODUCT_PRIVATE_SEPOLICY_DIRS (Android 11 и выше) | Детали реализации продукта (поставщики могут игнорировать) |
Система сборки берет эту политику и создает компоненты политики system, system_ext, product, vendor и odm на соответствующем разделе. Шаги включают:
- Преобразование политик в формат общего промежуточного языка SELinux (CIL), а именно:
- политика публичной платформы (система + system_ext + продукт)
- комбинированная частная + государственная политика
- публичная + поставщик и политика
BOARD_SEPOLICY_DIRS
- Версионирование политики, предоставляемой public как часть политики поставщика. Выполняется с использованием созданной public политики CIL для информирования объединенной public + vendor +
BOARD_SEPOLICY_DIRS
политики о том, какие части должны быть преобразованы в атрибуты, которые будут связаны с политикой платформы. - Создание файла сопоставления, связывающего части платформы и поставщика. Первоначально это просто связывает типы из публичной политики с соответствующими атрибутами в политике поставщика; позже это также обеспечит основу для файла, поддерживаемого в будущих версиях платформы, обеспечивая совместимость с политикой поставщика, нацеленной на эту версию платформы.
- Объединение файлов политик (опишите как решения на устройстве, так и предварительно скомпилированные решения).
- Объедините картографию, платформу и политику поставщика.
- Скомпилируйте выходной двоичный файл политики.
Платформа публичная sepolicy
Платформа public sepolicy включает все, что определено в system/sepolicy/public
. Платформа может предполагать, что типы и атрибуты, определенные в public policy, являются стабильными API для данной версии платформы. Это формирует часть sepolicy, которая экспортируется платформой, на которой разработчики политики поставщика (то есть устройства) могут писать дополнительную политику, специфичную для устройства.
Типы версионируются в соответствии с версией политики, на основе которой написаны файлы поставщика, определяемой переменной сборки PLATFORM_SEPOLICY_VERSION
. Версионированная публичная политика затем включается в политику поставщика и (в своей исходной форме) в политику платформы. Таким образом, окончательная политика включает частную политику платформы, публичную политику текущей платформы, политику, специфичную для устройства, и версионированную публичную политику, соответствующую версии платформы, на основе которой была написана политика устройства.
Платформа частная sepolicy
Платформенная частная политика sepolicy включает все, что определено в /system/sepolicy/private
. Эта часть политики формирует типы, разрешения и атрибуты, необходимые только для платформы для функциональности платформы. Они не экспортируются в составители политики vendor/device
. Составители политики, не относящиеся к платформе, не должны писать расширения своей политики на основе типов/атрибутов/правил, определенных в платформенной частной политике sepolicy. Более того, эти правила могут быть изменены или могут исчезнуть как часть обновления только для фреймворка.
Платформа частного картографирования
Частное сопоставление платформы включает в себя операторы политики, которые сопоставляют атрибуты, представленные в публичной политике платформы предыдущих версий платформы, с конкретными типами, используемыми в текущей публичной sepolicy платформы. Это гарантирует, что политика поставщика, написанная на основе публичных атрибутов платформы из предыдущих версий публичной sepolicy платформы, продолжает работать. Управление версиями основано на переменной сборки PLATFORM_SEPOLICY_VERSION
, установленной в AOSP для данной версии платформы. Для каждой предыдущей версии платформы, из которой эта платформа должна принимать политику поставщика, существует отдельный файл сопоставления. Для получения более подробной информации см. Совместимость .
Android 11 и выше
system_ext и политика безопасности продукта
В Android 11 добавлены политика system_ext и политика продукта. Как и sepolicy платформы, политика system_ext и политика продукта разделены на публичную политику и частную политику.
Публичная политика экспортируется в поставщика. Типы и атрибуты становятся стабильным API, и политика поставщика может ссылаться на типы и атрибуты в публичной политике. Типы версионируются в соответствии с PLATFORM_SEPOLICY_VERSION
, а версионированная политика включается в политику поставщика. Исходная политика включается в каждый из разделов system_ext и product.
Частная политика содержит типы system_ext-only и product-only, разрешения и атрибуты, необходимые для функциональности system_ext и product partitions. Частная политика невидима для поставщика, что подразумевает, что эти правила являются внутренними и могут быть изменены.
system_ext и сопоставление продуктов
system_ext и product разрешено экспортировать свои назначенные публичные типы в vendor. Однако ответственность за поддержание совместимости лежит на каждом партнере. Для обеспечения совместимости партнеры могут предоставлять собственные файлы сопоставления, которые сопоставляют версионные атрибуты предыдущих версий с конкретными типами, используемыми в текущей публичной sepolicy.
- Чтобы установить файл сопоставления для 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
.