Создайте политику SELinux

На этой странице описывается, как строится политика 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 :
      • chkcon : определяет, действителен ли контекст безопасности для заданной двоичной политики (исполняемого файла хоста).
      • libsepol : библиотека SELinux для управления бинарными политиками безопасности (хостовая статическая/общая библиотека, целевая статическая библиотека).
    • 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 на устройстве:

На этом изображении показана логика сборки SELinux для Android 7.x.

Рисунок 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 на устройстве.
    На этом изображении показаны файлы, которые генерируют файл политики SELinux для Android 7.x.

    Рисунок 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 в соответствующем разделе. Шаги включают:

  1. Преобразование политик в формат общего промежуточного языка SELinux (CIL), а именно:
    1. политика публичной платформы (система + system_ext + продукт)
    2. комбинированная частная + государственная политика
    3. публичная + поставщик и политика BOARD_SEPOLICY_DIRS
  2. Версионирование политики, предоставляемой публичной частью политики поставщика. Выполняется с использованием созданной публичной политики CIL для информирования объединённой политики (публичной, поставщика и BOARD_SEPOLICY_DIRS о том, какие части необходимо преобразовать в атрибуты, связанные с политикой платформы.
  3. Создание файла сопоставления, связывающего компоненты платформы и поставщика. Изначально это просто связывает типы из публичной политики с соответствующими атрибутами в политике поставщика; впоследствии он также станет основой для файла, поддерживаемого в будущих версиях платформы, обеспечивая совместимость с политикой поставщика, ориентированной на данную версию платформы.
  4. Объединение файлов политики (опишите как локальные, так и предварительно скомпилированные решения).
    1. Объедините политику сопоставления, платформы и поставщика.
    2. Скомпилировать выходной двоичный файл политики.

Платформа публичной политики

Публичная политика платформы 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