На этой странице описывается, как формируется политика SELinux. Политика SELinux формируется из комбинации основной политики AOSP (платформа) и политики, специфичной для устройства (производитель). Процесс формирования политики SELinux для Android 4.4–7.0 объединял все фрагменты политики SELinux, а затем генерировал монолитные файлы в корневом каталоге. Это означало, что производители SoC и ODM-производители изменяли boot.img (для устройств, не относящихся к A/B) или system.img (для устройств A/B) каждый раз, когда изменялась политика.
В Android 8.0 и выше политика платформы и политика производителя формируются отдельно. SoC и OEM-производители могут обновлять свои части политики, создавать свои образы (например, vendor.img и boot.img ), а затем обновлять эти образы независимо от обновлений платформы.
Однако, поскольку модульные файлы политик SELinux хранятся на разделах /vendor , процессу init необходимо предварительно смонтировать system и раздел поставщика, чтобы он мог прочитать файлы SELinux с этих разделов и объединить их с основными файлами SELinux в system каталоге (до загрузки их в ядро).
Исходные файлы
Логика сборки 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: Основные конфигурации политик SELinux для Android, включая контексты и файлы политик. Здесь же находится основная логика сборки sepolicy (system/sepolicy/Android.mk).
Для получения более подробной информации о файлах в system/sepolicy см. раздел «Ключевые файлы» .
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 находится в разрешающем режиме (а не в принудительном). Процесс инициализации выполняет следующие задачи:
- Загружает файлы
sepolicyиз оперативной памяти в ядро через/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.bp .
Данная политика действует в следующих местах:
| Расположение | Содержит |
|---|---|
system/sepolicy/public | API политики безопасности платформы |
system/sepolicy/private | Детали реализации платформы (поставщики могут их игнорировать) |
system/sepolicy/vendor | Файлы политик и контекста, которые могут использовать поставщики (поставщики могут игнорировать) |
BOARD_SEPOLICY_DIRS | политика поставщика |
BOARD_ODM_SEPOLICY_DIRS (Android 9 и выше) | политика ODM |
SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS (Android 11 и выше) | system_ext sepolicy API |
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 Common Intermediate Language (CIL), а именно:
- Политика публичной платформы (
system,system_ext,product) - Совместная частная и государственная политика
- Политика в отношении общественности, поставщиков и
BOARD_SEPOLICY_DIRS
- Политика публичной платформы (
- Сформулируйте версию политики, предоставленной публикой, как часть политики поставщика. Используйте созданную публичную политику CIL, чтобы указать объединенной публичной политике, политике поставщика и политике
BOARD_SEPOLICY_DIRS, какие части должны быть преобразованы в атрибуты, связанные с политикой платформы. - Создайте файл сопоставления, связывающий части, относящиеся к платформе и поставщику. Первоначально он просто связывает типы из общедоступной политики с соответствующими атрибутами в политике поставщика; позже он также послужит основой для файла, поддерживаемого в будущих версиях платформы, обеспечивая совместимость с политикой поставщика, ориентированной на эту версию платформы.
- Объедините файлы политик (опишите как решения, встроенные в устройство, так и предварительно скомпилированные решения).
- Объедините политики сопоставления, платформы и поставщика.
- Скомпилировать выходной двоичный файл политики.
Политика публичного доступа к платформе
В публичную политику безопасности платформы входит все, что определено в system/sepolicy/public . Платформа может предполагать, что типы и атрибуты, определенные в публичной политике, являются стабильными API для данной версии платформы. Это составляет часть политики безопасности, экспортируемую платформой, на основе которой разработчики политик поставщика (то есть устройства) могут создавать дополнительные политики, специфичные для устройства.
Типы версионируются в соответствии с версией политики, для которой записываются файлы поставщика, определяемой переменной сборки PLATFORM_SEPOLICY_VERSION . Версионированная публичная политика затем включается в политику поставщика и (в исходном виде) в политику платформы. Таким образом, окончательная политика включает частную политику платформы, публичную политику sepolicy текущей платформы, политику, специфичную для устройства, и версионированную публичную политику, соответствующую версии платформы, для которой была написана политика устройства.
частная политика платформы
Политика приватности платформы включает в себя все, что определено в /system/sepolicy/private . Эта часть политики формирует типы, разрешения и атрибуты, необходимые только для работы платформы. Они не экспортируются разработчикам политик от поставщика и устройства. Разработчики политик, не связанных с платформой, не должны создавать свои расширения политик на основе типов, атрибутов и правил, определенных в политике приватности платформы. Более того, эти правила могут быть изменены или могут исчезнуть в рамках обновления только фреймворка.
Частное сопоставление платформы
Сопоставление частных атрибутов платформы включает в себя операторы политики, которые сопоставляют атрибуты, отображаемые в публичной политике платформы предыдущих версий, с конкретными типами, используемыми в текущей публичной политике платформы. Это гарантирует, что политика поставщика, написанная на основе публичных атрибутов платформы из предыдущих версий публичной политики платформы, будет продолжать работать. Версионирование основано на переменной сборки PLATFORM_SEPOLICY_VERSION установленной в AOSP для данной версии платформы. Для каждой предыдущей версии платформы, из которой ожидается, что данная платформа будет принимать политику поставщика, существует отдельный файл сопоставления. Для получения более подробной информации см. раздел «Совместимость политик» .
Android 11 и выше
В этом разделе рассматривается, как формируется политика SELinux в Android 11 и более поздних версиях.
system_ext и политика продукта
В Android 11 добавлены политики system_ext и product . Подобно политике платформы sepolicy, политики system_ext и product разделены на публичную и частную.
Публичная политика экспортируется поставщику. Типы и атрибуты становятся стабильным API, и политика поставщика может ссылаться на типы и атрибуты в публичной политике. Типы версионируются в соответствии с PLATFORM_SEPOLICY_VERSION , и версионированная политика включается в политику поставщика. Исходная политика включается в каждый из разделов system_ext и product .
Частная политика содержит типы, разрешения и атрибуты, доступные только для system_ext и product разделов system_ext необходимые для их функционирования. Частная политика невидима для поставщика, что означает product что эти правила являются внутренними и могут быть изменены.
сопоставление system_ext и продукта
system_ext и product могут экспортировать свои назначенные общедоступные типы поставщику. Однако каждый партнер несет ответственность за поддержание совместимости. Для обеспечения совместимости партнеры могут предоставлять собственные файлы сопоставления, которые сопоставляют версионированные атрибуты предыдущих версий с конкретными типами, используемыми в текущей политике общедоступности:
- Для установки файла сопоставления для
system_extпоместите CIL-файл, содержащий необходимую информацию о сопоставлении, в папку{SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil, а затем добавьтеsystem_ext_{ver}.cilвPRODUCT_PACKAGES. - Чтобы установить файл сопоставления для
product, поместите CIL-файл, содержащий необходимую информацию о сопоставлении, в папку{PRODUCT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil, а затем добавьтеproduct_{ver}.cilв папкуPRODUCT_PACKAGES.
Обратитесь к примеру , в котором добавляется файл сопоставления раздела product устройства 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 .