Дискреционный контроль доступа (DAC)

Объекты файловой системы и службы, добавленные в сборку, часто нуждаются в отдельных уникальных идентификаторах, известных как идентификаторы Android (AID). В настоящее время многие ресурсы, такие как файлы и службы, без надобности используют основные (определенные Android) AID; во многих случаях вместо этого можно использовать OEM (определенные OEM) идентификаторы AID.

Более ранние версии Android (Android 7.x и низшему) расширен механизм с использованием СО СПИДОМ для конкретного устройства android_filesystem_config.h файл для определения возможности файловой системы и / или пользовательские OEM Aids. Однако эта система была не интуитивно понятной, поскольку не поддерживала использование красивых имен для OEM AID, требуя, чтобы вы указывали необработанные числовые значения для полей пользователя и группы без возможности связать понятное имя с числовым AID.

Более новые версии Android (Android 8.0 и выше) поддерживают новый метод расширения возможностей файловой системы. Этот новый метод поддерживает следующее:

  • Множественные исходные расположения для файлов конфигурации (позволяет расширять конфигурации сборки).
  • Проверка корректности значений OEM AID во время сборки.
  • Создание настраиваемого заголовка OEM AID, который можно использовать в исходных файлах по мере необходимости.
  • Связь понятного имени с фактическим значением OEM AID. Поддерживает нечисловые строковые аргументы для пользователя и группы, то есть «foo» вместо «2901».

Дополнительные улучшения включают в себя удаление android_ids[] массив из system/core/libcutils/include/private/android_filesystem_config.h . Этот массив существует в настоящее время в Bionic как полностью частный сгенерированный массив, с аксессорами через getpwnam() и getgrnam() . (Это имеет побочный эффект получения стабильных бинарных файлов в качестве основного AIDs модифицируется.) Для получения технологической оснастки и README файла с более подробной информацией см build/make/tools/fs_config .

Добавление идентификаторов Android (AID)

Android 8.0 удалила android_ids[] массив из проекта Android Open Source (AOSP). Все AID чистого имена вместо генерируется из system/core/libcutils/include/private/android_filesystem_config.h заголовок файла при создании бионической android_ids[] массив. Любые define соответствие AID_* подхватывается оснастки и * становится именем в нижнем регистре.

Например, в private/android_filesystem_config.h :

#define AID_SYSTEM 1000

Становится:

  • Понятное имя: система
  • uid: 1000
  • гид: 1000

Для добавления нового ядра AOSP AID, просто добавьте #define в android_filesystem_config.h файл заголовок. AID будет сгенерирован при сборке и станет доступным для интерфейсов, использующих аргументы пользователя и группы. Инструмент проверяет, что новый AID не входит в диапазон APP или OEM; он также учитывает изменения в этих диапазонах и должен автоматически перенастраивать при изменениях или новых диапазонах, зарезервированных OEM.

Настройка AID

Для того, чтобы включить новый механизм борьбы со СПИДом, набор TARGET_FS_CONFIG_GEN в BoardConfig.mk файле. Эта переменная содержит список файлов конфигурации, позволяющий добавлять файлы по мере необходимости.

По соглашению, файлы конфигурации используется имя config.fs , но на практике вы можете использовать любое имя. config.fs файлы в ини формате Python ConfigParser и включают в себя раздел колпачков (для конфигурирования возможности файловой системы) и раздел по СПИДу (для настройки OEM СПИД).

Настройка раздела шапки

Колпачки раздел поддерживает настройки возможностей файловой системы на объекты файловой системы в сборке (сама файловая система должна также поддерживать эту функцию).

Потому что работает стабильный сервис как корень в Android вызывает совместимость Test Suite (CTS) отказ, предыдущие требования к сохраняя возможность во время выполнения процесса или службы , участвующие настройки возможности затем с помощью setuid / setgid к правильному AID бежать. С помощью caps вы можете пропустить эти требования, и ядро ​​сделает это за вас. Когда управление передаются на main() , ваш процесс уже имеет возможности, необходимые , чтобы ваш сервис может использовать не суперпользователь и группы (это предпочтительный способ для запуска льготных услуг).

В разделе шапки используется следующий синтаксис:

Раздел Ценить Определение
[path] Путь к файловой системе для настройки. Путь, заканчивающийся на /, считается директорией, иначе это файл.

Это ошибка , чтобы указать несколько разделов с тем же [path] в разных файлах. В версиях Python <= 3.2 один и тот же файл может содержать разделы, которые переопределяют предыдущий раздел; в Python 3.2 он установлен в строгий режим.
mode Восьмеричный файловый режим Допустимый восьмеричный файловый режим, содержащий не менее 3-х цифр. Если указано 3, перед ним стоит префикс 0, иначе режим используется как есть.
user AID_ <пользователь> Либо C define для действительного AID или понятного имени (например , как AID_RADIO и radio являются приемлемыми). Чтобы определить пользовательский AID см Настройка раздела AID .
group AID_ <группа> То же, что и пользователь.
caps шапка* Название , как заявлено в bionic/libc/kernel/uapi/linux/capability.h без ведущего CAP_ . Допускается смешанный случай. Колпачки также могут быть необработанными:
  • двоичный (0b0101)
  • восьмеричный (0455)
  • интервал (42)
  • шестнадцатеричный (0xFF)
Разделите несколько заглавных букв пробелами.

Для примера использования см Использование возможностей файловой системы .

Настройка раздела AID

Раздел AID содержит идентификаторы OEM AID и использует следующий синтаксис:

Раздел Ценить Определение
[AID_<name>] <name> может содержать символы в наборе прописных, цифр и символов подчеркивания. Версия в нижнем регистре используется как понятное имя. Созданный файл заголовка для включения кода использует точный AID_<name> .

Это ошибка , чтобы указать несколько разделов с одинаковым AID_<name> (чувствительно к регистру с теми же ограничениями , как [path] ).

<name> должно начинаться с названия раздела , чтобы убедиться , что это не конфликт с различными источниками.
value <число> Допустимая числовая строка в стиле C (шестнадцатеричная, восьмеричная, двоичная и десятичная).

Ошибочно указывать несколько разделов с одним и тем же параметром значения.

Параметры Значение должно быть указано в диапазоне , соответствующем разделе используемого в <name> . Список допустимых разделов и их соответствующих диапазонов определяется в system/core/libcutils/include/private/android_filesystem_config.h . Возможные варианты:
  • Раздел поставщика
    • AID_OEM_RESERVED_START (2900) - AID_OEM_RESERVED_END (2999)
    • AID_OEM_RESERVED_2_START (5000) - AID_OEM_RESERVED_2_END (5999)
  • Системный раздел
    • AID_SYSTEM_RESERVED_START (6000) - AID_SYSTEM_RESERVED_END (6499)
  • Раздел ODM
    • AID_ODM_RESERVED_START (6500) - AID_ODM_RESERVED_END (6999)
  • Раздел продукта
    • AID_PRODUCT_RESERVED_START (7000) - AID_PRODUCT_RESERVED_END (7499)
  • System_ext Раздел
    • AID_SYSTEM_EXT_RESERVED_START (7500) - AID_SYSTEM_EXT_RESERVED_END (7999)

Примеры использования см Определение OEM имен AID и с помощью OEM со СПИДом .

Примеры использования

В следующих примерах подробно описано, как определить и использовать OEM AID и как включить возможности файловой системы. Имена OEM AID ([имя AID_]) должны начинаться с названия разделов , таких как «vendor_» , чтобы гарантировать , что они не противоречат друг другу с будущими именами AOSP или другим разделам.

Определение имен OEM AID

Для определения OEM AID, создать config.fs файл и установите значение AID. Например, в device/x/y/config.fs , установить следующее:

[AID_VENDOR_FOO]
value: 2900

После создания файла, установите TARGET_FS_CONFIG_GEN переменную и указать на него в BoardConfig.mk . Например, в device/x/y/BoardConfig.mk , установить следующее:

TARGET_FS_CONFIG_GEN += device/x/y/config.fs

Теперь ваш пользовательский AID может использоваться системой в целом в новой сборке.

Использование OEM AID

Для того, чтобы использовать OEM AID, в коде C, включают oemaids_headers в вашей связанной Makefile, а также добавить #include "generated_oem_aid.h" , а затем начать использовать объявленные идентификаторы. Например, в my_file.c , добавьте следующее:

#include "generated_oem_aid.h"
…

If (ipc->uid == AID_VENDOR_FOO) {
  // Do something
...

В вашем связанном Android.bp файл, добавьте следующее:

header_libs: ["oemaids_headers"],

Если вы используете Android.mk файл, а затем добавьте следующее:

LOCAL_HEADER_LIBRARIES := oemaids_headers

Использование понятных имен

В Android 9 вы можете использовать понятное имя для любого интерфейса, поддерживающего имена AID. Например:

  • В chown команде в some/init.rc :
    chown vendor_foo /vendor/some/vendor_foo/file
    
  • В service в some/init.rc :
    service vendor_foo /vendor/bin/foo_service
        user vendor_foo
        group vendor_foo
    

Так как внутреннее отображение имени дружественного к UID осуществляются /vendor/etc/passwd и /vendor/etc/group /vendor/etc/passwd и /vendor/etc/group и /vendor/etc/group , раздел поставщика должен быть установлен.

Связывание дружественных имен

Android 9 включает поддержку связывания понятного имени с фактическим значением OEM AID. Вы можете использовать не-числовые аргументы строки для пользователя и группы, то есть «vendor_ Foo» вместо «2901».

Преобразование из AID в понятные имена

Для OEM ПОСОБИЯ , Android 8.x требуется использование oem_#### с getpwnam и подобными функциями, а также в местах , которые рукоятки Lookups через getpwnam (например, init скриптов). В Android 9, вы можете использовать getpwnam и getgrnam друг в Bionic для преобразования из Android идентификаторов (СПИД) дружественные имена и наоборот.

Использование возможностей файловой системы

Для включения файловой системы возможности, создать раздел шапки в config.fs файл. Например, в device/x/y/config.fs , добавьте следующий раздел:

[system/bin/foo_service]
mode: 0555
user: AID_VENDOR_FOO
group: AID_SYSTEM
caps: SYS_ADMIN | SYS_NICE

После создания файла, установите TARGET_FS_CONFIG_GEN в точку к этому файлу в BoardConfig.mk . Например, в device/x/y/BoardConfig.mk , установить следующее:

TARGET_FS_CONFIG_GEN += device/x/y/config.fs

Когда служба vendor_ foo выполняется, он начинает с возможностями CAP_SYS_ADMIN и CAP_SYS_NICE без setuid и setgid вызовов. Нет Кроме того, vendor_ foo политика SELinux сервиса больше не нуждается в возможностях setuid и setgid и может быть удалена.

Настройка переопределений (Android 6.x-7.x)

Android 6,0 Relocated fs_config и связанные с ними определения структуры ( system/core/include/private/android_filesystem_config.h ) для system/core/libcutils/fs_config.c , где они могут быть обновлены или переопределены бинарные файлы устанавливаются в /system/etc/fs_config_dirs и /system/etc/fs_config_dirs и /system/etc/fs_config_files и /system/etc/fs_config_files . Использование отдельных правил сопоставления и анализа для каталогов и файлов (которые могут использовать дополнительные глобальные выражения) позволило Android обрабатывать каталоги и файлы в двух разных таблицах. Определения структуры в system/core/libcutils/fs_config.c позволила не только во время выполнения чтения каталогов и файлов, но хозяин может использовать одни и те же файлы во время сборки для построения файловой системы образов , как ${OUT}/system/etc/fs_config_dirs и ${OUT}/system/etc/fs_config_files ${OUT}/system/etc/fs_config_dirs и ${OUT}/system/etc/fs_config_files и ${OUT}/system/etc/fs_config_files .

Хотя метод переопределения расширения файловой системы был заменен модульной системой конфигурации, представленной в Android 8.0, при желании вы все равно можете использовать старый метод. В следующих разделах подробно описано, как создавать и включать файлы переопределения и настраивать файловую систему.

Создание файлов переопределения

Вы можете создавать выровненные бинарные файлы /system/etc/fs_config_dirs и /system/etc/fs_config_files fs_config_generate build/tools/fs_config /system/etc/fs_config_dirs и /system/etc/fs_config_files и /system/etc/fs_config_files используя fs_config_generate инструмент в build/tools/fs_config . Инструмент использует libcutils библиотечную функцию ( fs_config_generate() ) для управления требованиями DAC в буфер и определяет правила инклюдник институционализации правила DAC.

Для использования, создать включаемый файл в device/ vendor / device /android_filesystem_config.h , которое действует как переопределения. Файл должен использовать structure fs_path_config формат , определенный в system/core/include/private/android_filesystem_config.h со следующими инициализаций структуры каталогов и файлов символов:

  • Для каталогов, используйте android _device _dirs[] .
  • Для файлов, используйте android _device _files[] .

Если вы не используете android_device_dirs[] и android_device_files[] , вы можете определить NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS и NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES (см пример ниже). Кроме того, можно указать файл переопределение с помощью TARGET_ANDROID_FILESYSTEM_CONFIG_H в конфигурации платы, с принудительным базовым именем android_filesystem_config.h .

Включение файлов переопределения

Чтобы включить файлы, убедитесь , что PRODUCT_PACKAGES включает fs_config_dirs и / или fs_config_files поэтому их можно установить в /system/etc/fs_config_dirs и /system/etc/fs_config_files /system/etc/fs_config_dirs и /system/etc/fs_config_files и /system/etc/fs_config_files соответственно. Система сборки поиск пользовательских android_filesystem_config.h в $(TARGET_DEVICE_DIR) , где BoardConfig.mk существует. Если этот файл существует в другом месте, набор платы конфигурации переменной TARGET_ANDROID_FILESYSTEM_CONFIG_H до точки в этом месте.

Настройка файловой системы

Чтобы настроить файловую систему в Android 6.0 и выше:

  1. Создание $(TARGET_DEVICE_DIR)/android_filesystem_config.h файл.
  2. Добавьте fs_config_dirs и / или fs_config_files к PRODUCT_PACKAGES в файле конфигурации платы (например, $(TARGET_DEVICE_DIR)/device.mk ).

Пример переопределения

Этот пример показывает , патч для переопределения system/bin/glgps демон , чтобы добавить поддержку блокировки бодрствования в device/ vendor / device каталога. Помните следующее:

  • Каждая запись структуры - это режим, uid, gid, возможности и имя. system/core/include/private/android_filesystem_config.h включается автоматически , чтобы обеспечить манифеста #defines ( AID_ROOT , AID_SHELL , CAP_BLOCK_SUSPEND ).
  • В android_device_files[] раздел включает в себя действие для подавления доступа к system/etc/fs_config_dirs и system/etc/fs_config_dirs , когда определено, что служит в качестве дополнительной защиты ЦАП из- за отсутствия контента для переопределения каталогов. Однако это слабая защита; если кто - то имеет контроль над /system , они могут , как правило , делают все , что хотят.
diff --git a/android_filesystem_config.h b/android_filesystem_config.h
new file mode 100644
index 0000000..874195f
--- /dev/null
+++ b/android_filesystem_config.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+/* This file is used to define the properties of the filesystem
+** images generated by build tools (eg: mkbootfs) and
+** by the device side of adb.
+*/
+
+#define NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
+/* static const struct fs_path_config android_device_dirs[] = { }; */
+
+/* Rules for files.
+** These rules are applied based on "first match", so they
+** should start with the most specific path and work their
+** way up to the root. Prefixes ending in * denotes wildcard
+** and will allow partial matches.
+*/
+static const struct fs_path_config android_device_files[] = {
+  { 00755, AID_ROOT, AID_SHELL, (1ULL << CAP_BLOCK_SUSPEND),
"system/bin/glgps" },
+#ifdef NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
+  { 00000, AID_ROOT, AID_ROOT, 0, "system/etc/fs_config_dirs" },
+#endif
+};


diff --git a/device.mk b/device.mk
index 0c71d21..235c1a7 100644
--- a/device.mk
+++ b/device.mk
@@ -18,7 +18,8 @@ PRODUCT_PACKAGES := \
     libwpa_client \
     hostapd \
     wpa_supplicant \
-    wpa_supplicant.conf
+    wpa_supplicant.conf \
+    fs_config_files

 ifeq ($(TARGET_PREBUILT_KERNEL),)
 ifeq ($(USE_SVELTE_KERNEL), true)

Перенос файловых систем из более ранних выпусков

При миграции файловых систем с Android 5.x и более ранних версий помните, что Android 6.x

  • Удаляет некоторые включения, структуры и встроенные определения.
  • Требуется ссылка на libcutils вместо запуска непосредственно из system/core/include/private/android_filesystem_config.h . Производитель устройства частные исполняемые файлы , которые зависят от system/code/include/private_filesystem_config.h для файла или структур каталогов или fs_config должен добавить libcutils библиотеки зависимостей.
  • Требуется производитель устройства учрежденческой копии из system/core/include/private/android_filesystem_config.h с дополнительным содержанием на существующих целевых задачах , чтобы перейти к device/ vendor / device /android_filesystem_config.h .
  • Оставляю за собой право применять управление SELinux Обязательного доступа (MAC) в файлы конфигурация на целевой системе, реализации , которые включают в себя пользовательские целевые исполняемые файлы с помощью fs_config() должен обеспечивать доступ.