{i>Discretionary access control

Objek dan layanan sistem file yang ditambahkan ke build sering kali memerlukan ID unik, yang dikenal sebagai ID Android (AID). Saat ini, banyak sumber daya seperti file dan layanan menggunakan AID inti (ditentukan oleh Android) secara tidak perlu; di banyak kasus, Anda dapat menggunakan AID OEM (ditentukan oleh OEM).

Versi Android sebelumnya (Android 7.x dan yang lebih lama) memperluas AID mekanisme yang menggunakan android_filesystem_config.h khusus perangkat untuk menentukan kemampuan sistem file dan/atau AID OEM kustom. Namun, sistem ini tidak intuitif karena tidak mendukung penggunaan nama yang bagus untuk AID OEM, mengharuskan Anda menentukan angka mentah untuk bidang pengguna dan grup tanpa cara untuk mengaitkan nama yang lebih dikenal dengan AID numerik.

Versi Android yang lebih baru (Android 8.0 dan yang lebih tinggi) mendukung metode baru untuk memperluas kemampuan sistem file. Metode baru ini memiliki dukungan untuk berikut ini:

  • Beberapa lokasi sumber untuk file konfigurasi (memungkinkan ekstensif konfigurasi build yang berbeda).
  • Pemeriksaan kesehatan waktu build nilai AID OEM.
  • Pembuatan header AID OEM kustom yang dapat digunakan dalam file sumber sebagai diperlukan.
  • Pengaitan nama yang mudah dipahami dengan nilai AID OEM yang sebenarnya. Mendukung argumen string nonnumerik untuk pengguna dan grup, yaitu "foo" bukannya "2901".

Peningkatan tambahan mencakup penghapusan android_ids[] array dari system/core/libcutils/include/private/android_filesystem_config.h. Ini sekarang ada di Bionic sebagai himpunan yang dihasilkan sepenuhnya pribadi, dengan pengakses dengan getpwnam() dan getgrnam(). (Hal ini memiliki efek samping dari menghasilkan biner stabil saat AID inti dimodifikasi.) Sebagai dan file README dengan detail selengkapnya, lihat build/make/tools/fs_config.

Menambahkan ID Android (AID)

Android 8.0 menghapus array android_ids[] dari Android Proyek Open Source (AOSP). Semua nama yang cocok untuk AID dibuat dari nama system/core/libcutils/include/private/android_filesystem_config.h file header saat membuat array android_ids[] Bionic. Apa saja define yang cocok dengan AID_* diambil oleh alat dan * menjadi nama huruf kecil.

Misalnya, dalam private/android_filesystem_config.h:

#define AID_SYSTEM 1000

Menjadi:

  • Nama yang mudah digunakan: sistem
  • uid: 1000
  • gid: 1000

Untuk menambahkan AID inti AOSP baru, cukup tambahkan #define ke File header android_filesystem_config.h. AID-nya adalah dihasilkan pada build dan disediakan untuk antarmuka yang menggunakan pengguna dan grup argumen. Alat ini memvalidasi AID baru yang tidak berada dalam APP atau OEM rentang; rentang itu juga mengikuti perubahan pada rentang tersebut dan secara otomatis mengonfigurasi ulang berdasarkan perubahan atau rentang yang dicadangkan OEM baru.

Konfigurasi AID

Untuk mengaktifkan mekanisme AID baru, tetapkan TARGET_FS_CONFIG_GEN di File BoardConfig.mk. Variabel ini menyimpan daftar konfigurasi {i>file<i}, yang memungkinkan Anda untuk menambahkan file sesuai kebutuhan.

Berdasarkan konvensi, file konfigurasi menggunakan nama config.fs, tetapi dalam Anda dapat menggunakan nama apa pun. config.fs file ada di Python Format ConfigParser ini dan menyertakan bagian huruf besar (untuk mengonfigurasi file kemampuan sistem) dan bagian AID (untuk mengonfigurasi AID OEM).

Mengonfigurasi bagian huruf besar

Bagian huruf besar mendukung pengaturan berkas kemampuan sistem pada objek sistem file dalam build (sistem file sendiri juga harus mendukung fungsi ini).

Karena menjalankan layanan yang stabil sebagai {i>root<i} di Android akan menyebabkan Compatibility Test Suite (CTS) kegagalan, persyaratan sebelumnya untuk mempertahankan kemampuan saat menjalankan proses atau layanan melibatkan pengaturan kemampuan kemudian menggunakan setuid/setgid untuk bantuan yang tepat agar dapat dijalankan. Dengan huruf besar, Anda dapat melewatkan persyaratan ini dan meminta {i>kernel<i} melakukannya untuk Anda. Saat kontrol diserahkan kepada main(), proses Anda sudah memiliki kemampuan yang sehingga layanan Anda bisa menggunakan pengguna dan grup non-root (ini lebih disarankan untuk memulai layanan dengan hak istimewa).

Bagian huruf besar menggunakan sintaks berikut:

Bagian Nilai Definisi
[path] Jalur sistem file yang akan dikonfigurasi. Jalur yang diakhiri dengan / dianggap sebagai {i>dir<i}, jika tidak, itu adalah file.

Menentukan beberapa bagian dengan judul yang sama adalah sebuah kesalahan [path] dalam file yang berbeda. Di Python versi <= 3.2, file yang sama dapat berisi bagian yang menggantikan bagian sebelumnya; di Python 3.2, ini diatur ke mode ketat.
mode Mode file oktal Mode file oktal yang valid minimal 3 digit. Jika 3 ditentukan, maka diawali dengan 0, mode {i>else<i} akan digunakan sebagaimana adanya.
user AID_<pengguna> C define untuk AID yang valid atau nama yang mudah dipahami (misalnya, AID_RADIO dan radio dapat diterima). Kepada menentukan AID khusus, lihat Mengonfigurasi bagian AID.
group AID_<grup> Sama seperti pengguna.
caps batas* Nama seperti yang dideklarasikan di bionic/libc/kernel/uapi/linux/capability.h tanpa CAP_ di awal. Huruf besar dan kecil diizinkan. {i>Caps<i} juga bisa mentah:
  • biner (0b0101)
  • oktal (0455)
  • int (42)
  • heksadesimal (0xFF)
Pisahkan beberapa huruf besar menggunakan spasi kosong.

Untuk contoh penggunaan, lihat Menggunakan file kemampuan sistem kami.

Mengonfigurasi bagian AID

Bagian AID berisi AID OEM dan menggunakan sintaksis berikut:

Bagian Nilai Definisi
[AID_<name>] <name> dapat berisi karakter dalam kumpulan huruf besar, angka, dan garis bawah. Versi huruf kecil digunakan sebagai nama yang dikenal. File header yang dihasilkan untuk penyertaan kode menggunakan AID_<name>.

Menentukan beberapa bagian dengan judul yang sama adalah sebuah kesalahan AID_<name> (tidak peka huruf besar/kecil dengan batasan yang sama seperti [path]).

<name> harus diawali dengan nama partisi untuk memastikan bahwa data itu tidak bertentangan dengan sumber yang berbeda.
value <angka> String angka gaya C yang valid (hex, oktal, biner, dan desimal).

Menentukan beberapa bagian dengan opsi nilai yang sama merupakan suatu kesalahan.

Opsi nilai harus ditentukan dalam rentang yang sesuai dengan partisi digunakan di <name>. Daftar partisi yang valid dan yang sesuai rentang ditentukan dalam system/core/libcutils/include/private/android_filesystem_config.h. Opsinya adalah:
  • Partisi Vendor
    • AID_OEM_RESERVED_START(2900) - AID_OEM_RESERVED_END(2999)
    • AID_OEM_RESERVED_2_START(5000) - AID_OEM_RESERVED_2_END(5999)
  • Partisi Sistem
    • AID_SYSTEM_RESERVED_START(6000) - AID_SYSTEM_RESERVED_END(6499)
  • Partisi ODM
    • AID_ODM_RESERVED_START(6.500) - AID_ODM_RESERVED_END(6999)
  • Pemisahan Produk
    • AID_PRODUCT_RESERVED_START(7000) - AID_PRODUCT_RESERVED_END(7499)
  • Partisi System_ext
    • AID_SYSTEM_EXT_RESERVED_START(7500) - AID_SYSTEM_EXT_RESERVED_END(7999)

Untuk contoh penggunaan, lihat Menentukan OEM Nama AID dan Menggunakan AID OEM.

Contoh penggunaan

Contoh berikut menjelaskan cara menetapkan dan menggunakan AID OEM serta cara mengaktifkan kemampuan sistem file. Nama AID OEM ([AID_name]) harus diawali dengan nama partisi seperti "vendor_" untuk memastikan agar tidak terjadi konflik dengan masa depan Nama AOSP atau partisi lainnya.

Menentukan nama AID OEM

Untuk menentukan AID OEM, buat file config.fs dan tetapkan nilai AID. Misalnya, dalam device/x/y/config.fs, setel atribut berikut ini:

[AID_VENDOR_FOO]
value: 2900

Setelah membuat file, tetapkan variabel TARGET_FS_CONFIG_GEN dan arahkan ke nilai tersebut di BoardConfig.mk. Misalnya, di device/x/y/BoardConfig.mk, tetapkan nilai berikut ini:

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

AID kustom Anda kini dapat digunakan oleh sistem secara keseluruhan pada build baru.

Gunakan AID OEM

Untuk menggunakan AID OEM, dalam kode C, sertakan oemaids_headers dalam Makefile, dan tambahkan #include "generated_oem_aid.h", lalu mulai gunakan file yang dideklarasikan pengenal. Misalnya, di my_file.c, tambahkan kode berikut:

#include "generated_oem_aid.h"
…

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

Dalam file Android.bp terkait, tambahkan hal berikut:

header_libs: ["oemaids_headers"],

Jika Anda menggunakan file Android.mk, tambahkan berikut ini:

LOCAL_HEADER_LIBRARIES := oemaids_headers

Gunakan nama yang mudah dikenali

Di Android 9, Anda dapat menggunakan nama yang ramah untuk semua yang mendukung nama AID. Contoh:

  • Dalam perintah chown di some/init.rc:
    chown vendor_foo /vendor/some/vendor_foo/file
    
  • Dalam service di some/init.rc:
    service vendor_foo /vendor/bin/foo_service
        user vendor_foo
        group vendor_foo
    

Karena pemetaan internal dari {i> friendly<i} ke UID dilakukan oleh /vendor/etc/passwd dan /vendor/etc/group, vendor partisi harus dipasang.

Nama yang mudah dikenali

Android 9 menyertakan dukungan untuk mengaitkan nama yang ramah dengan nilai AID OEM yang sebenarnya. Anda dapat menggunakan string nonnumerik argumen untuk pengguna dan grup, yaitu "vendor_foo" bukannya "2901".

Konversi dari AID ke nama yang ramah

Sebagai OEM AID, Android 8.x mewajibkan penggunaan oem_#### dengan getpwnam dan fungsi serupa, seperti dengan baik di tempat yang menangani pencarian dengan getpwnam (seperti skrip init). Di Android 9, Anda dapat gunakan teman getpwnam dan getgrnam di Bionic untuk mengonversi dari ID Android (AID) menjadi nama yang cocok dan sebaliknya.

Menggunakan kemampuan sistem file

Untuk mengaktifkan kemampuan sistem file, buat bagian huruf besar pada File config.fs. Misalnya, di device/x/y/config.fs, tambahkan bagian berikut:

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

Setelah membuat file, tetapkan TARGET_FS_CONFIG_GEN agar mengarah ke file tersebut dalam BoardConfig.mk. Misalnya, di device/x/y/BoardConfig.mk, tetapkan nilai berikut ini:

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

Ketika dijalankan, layanan vendor_foo akan dimulai dengan kemampuan CAP_SYS_ADMIN dan CAP_SYS_NICE tanpa panggilan setuid dan setgid. Selain itu, Kebijakan SELinux layanan vendor_foo tidak lagi memerlukan kemampuan setuid dan setgid, serta dapat dihapus.

Mengonfigurasi penggantian (Android 6.x-7.x)

Android 6.0 memindahkan fs_config dan struktur terkait definisi (system/core/include/private/android_filesystem_config.h) ke system/core/libcutils/fs_config.c di mana mereka dapat diperbarui atau diganti oleh file biner yang diinstal di /system/etc/fs_config_dirs dan /system/etc/fs_config_files. Menggunakan pencocokan dan penguraian terpisah aturan untuk direktori dan file (yang dapat menggunakan ekspresi glob tambahan) memungkinkan Android menangani direktori dan file dalam dua tabel yang berbeda. Definisi struktur di system/core/libcutils/fs_config.c tidak hanya mengizinkan pembacaan {i>runtime<i} direktori dan file, tetapi {i>host<i} dapat menggunakan file yang sama selama waktu {i>build<i} untuk membangun {i>image<i} sistem file sebagai ${OUT}/system/etc/fs_config_dirs dan ${OUT}/system/etc/fs_config_files.

Walaupun metode penggantian untuk memperluas sistem file telah digantikan oleh sistem konfigurasi modular yang diperkenalkan di Android 8.0, Anda masih dapat menggunakan jika diinginkan. Bagian berikut menjelaskan cara membuat dan menyertakan mengganti file dan mengkonfigurasi sistem file.

Membuat file pengganti

Anda dapat membuat file biner yang selaras /system/etc/fs_config_dirs dan /system/etc/fs_config_files menggunakan Alat fs_config_generate di build/tools/fs_config. Tujuan alat ini menggunakan fungsi library libcutils (fs_config_generate()) untuk mengelola persyaratan DAC ke buffer dan mendefinisikan aturan untuk file yang disertakan untuk melembagakan aturan DAC.

Untuk menggunakannya, buat file yang disertakan di device/vendor/device/android_filesystem_config.h yang berfungsi sebagai penggantian. File tersebut harus menggunakan atribut Format structure fs_path_config ditentukan dalam system/core/include/private/android_filesystem_config.h dengan inisialisasi struktur berikut untuk simbol direktori dan file:

  • Untuk direktori, gunakan android_device_dirs[].
  • Untuk file, gunakan android_device_files[].

Saat tidak menggunakan android_device_dirs[] dan android_device_files[], Anda dapat menentukan NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS dan NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES (lihat contoh di bawah). Anda juga dapat menentukan penggantian file menggunakan TARGET_ANDROID_FILESYSTEM_CONFIG_H di board dengan nama dasar yang diterapkan, android_filesystem_config.h.

Sertakan file penggantian

Untuk menyertakan file, pastikan PRODUCT_PACKAGES menyertakan fs_config_dirs dan/atau fs_config_files sehingga dapat menginstalnya ke /system/etc/fs_config_dirs dan /system/etc/fs_config_files. Sistem build menelusuri android_filesystem_config.h kustom di $(TARGET_DEVICE_DIR), dengan BoardConfig.mk. Jika file ini ada di tempat lain, setel variabel konfigurasi board TARGET_ANDROID_FILESYSTEM_CONFIG_H untuk menunjuk ke lokasi tersebut.

Mengonfigurasi sistem file

Untuk mengonfigurasi sistem file di Android 6.0 dan versi yang lebih tinggi:

  1. Membuat $(TARGET_DEVICE_DIR)/android_filesystem_config.h .
  2. Tambahkan fs_config_dirs dan/atau fs_config_files ke PRODUCT_PACKAGES di file konfigurasi board (mis., $(TARGET_DEVICE_DIR)/device.mk).

Contoh penggantian

Contoh ini menunjukkan patch untuk mengganti system/bin/glgps untuk menambahkan dukungan penguncian layar saat aktif di Direktori device/vendor/device. Tetap berikut ini:

  • Setiap entri struktur adalah mode, UID, gid, kemampuan, dan nama. system/core/include/private/android_filesystem_config.h sama dengan disertakan secara otomatis untuk menyediakan manifes #defines (AID_ROOT, AID_SHELL, CAP_BLOCK_SUSPEND).
  • Bagian android_device_files[] menyertakan tindakan untuk menyembunyikan akses ke system/etc/fs_config_dirs jika tidak ditentukan, yang berfungsi sebagai perlindungan DAC tambahan untuk kurangnya konten untuk direktori untuk setiap penggantian. Namun, ini adalah perlindungan yang lemah; jika seseorang memiliki kendali atas /system, dia biasanya bisa melakukan apa pun yang diinginkan.
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 file system
+** 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)

Memigrasikan sistem file dari rilis sebelumnya

Saat memigrasikan sistem file dari Android 5.x dan versi sebelumnya, perlu diingat bahwa Android 6.x

  • Menghapus beberapa penyertaan, struktur, dan definisi inline.
  • Memerlukan referensi ke libcutils, bukan berjalan secara langsung dari system/core/include/private/android_filesystem_config.h. File {i>executable<i} pribadi produsen perangkat yang bergantung pada system/code/include/private_filesystem_config.h untuk file atau struktur direktori atau fs_config harus menambahkan libcutils dependensi library.
  • Memerlukan salinan cabang pribadi produsen perangkat system/core/include/private/android_filesystem_config.h dengan konten tambahan pada target yang ada untuk dipindahkan device/vendor/device/android_filesystem_config.h.
  • Memiliki hak untuk menerapkan Mandatory Access Controls (MAC) SELinux untuk file konfigurasi pada sistem target, implementasi yang mencakup file target yang dapat dieksekusi yang menggunakan fs_config() harus memastikan akses.