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

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

Логика сборки 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 находится в разрешающем режиме (а не в принудительном). Процесс инициализации выполняет следующие задачи:

  • Загружает файлы 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 на соответствующем разделе. Последовательность действий включает:

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

Политика публичного доступа к платформе

В публичную политику безопасности платформы входит все, что определено в 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 .