Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Kontrol Akses Diskresi (DAC)

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

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

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

  • Beberapa lokasi sumber untuk file konfigurasi (mengaktifkan konfigurasi build yang dapat diperluas).
  • Pemeriksaan kewarasan waktu build dari nilai OEM AID.
  • Pembuatan header OEM AID kustom yang dapat digunakan dalam file sumber sesuai kebutuhan.
  • Asosiasi nama yang bersahabat dengan nilai OEM AID yang sebenarnya. Mendukung argumen string non-numerik untuk pengguna dan grup, yaitu "foo" alih-alih "2901".

Perbaikan tambahan termasuk penghapusan android_ids[] array yang dari system/core/libcutils/include/private/android_filesystem_config.h . Array ini sekarang ada di Bionic sebagai array yang dihasilkan sepenuhnya pribadi, dengan accesor melalui getpwnam() dan getgrnam() . (Hal ini memiliki efek samping memproduksi binari stabil seperti AIDS inti yang diubah.) Untuk perkakas dan file README dengan rincian lebih lanjut, lihat build/make/tools/fs_config .

Menambahkan ID Android (AID)

Android 8.0 dihapus android_ids[] array yang dari Proyek Open Source Android (AOSP). Semua nama user-AID malah dihasilkan dari system/core/libcutils/include/private/android_filesystem_config.h file header saat membuat Bionic android_ids[] array yang. Setiap define cocok AID_* diambil oleh perkakas dan * menjadi nama huruf kecil.

Misalnya, dalam private/android_filesystem_config.h :

#define AID_SYSTEM 1000

Menjadi:

  • Nama ramah: sistem
  • Uid: 1000
  • angka: 1000

Untuk menambahkan AID AOSP inti baru, cukup menambahkan #define ke android_filesystem_config.h file header. AID akan dibuat saat pembuatan dan tersedia untuk antarmuka yang menggunakan argumen pengguna dan grup. Perkakas memvalidasi bahwa AID baru tidak berada dalam rentang APP atau OEM; itu juga menghormati perubahan pada rentang tersebut dan harus secara otomatis mengonfigurasi ulang pada perubahan atau rentang baru yang dicadangkan OEM.

Mengonfigurasi AID

Untuk mengaktifkan mekanisme AIDS baru, set TARGET_FS_CONFIG_GEN di BoardConfig.mk berkas. Variabel ini menyimpan daftar file konfigurasi, memungkinkan Anda untuk menambahkan file sesuai kebutuhan.

Dengan konvensi, file-file konfigurasi menggunakan nama config.fs , tetapi dalam prakteknya Anda dapat menggunakan nama apapun. config.fs file di Python ConfigParser Format Penyanyi dan termasuk bagian topi (untuk mengkonfigurasi kemampuan sistem file) dan bagian AIDS (untuk mengkonfigurasi OEM AIDS).

Mengkonfigurasi bagian caps

Dukungan Bagian topi pengaturan kemampuan sistem file di filesystem objek dalam membangun (filesystem itu sendiri juga harus mendukung fungsi ini).

Karena menjalankan layanan yang stabil sebagai root di Android menyebabkan Uji Kompatibilitas Suite (CTS) gagal, persyaratan sebelumnya untuk mempertahankan kemampuan suatu saat menjalankan proses atau jasa melibatkan menyiapkan kemampuan kemudian menggunakan setuid / setgid ke AID yang tepat untuk menjalankan. Dengan huruf besar, Anda dapat melewati persyaratan ini dan meminta kernel melakukannya untuk Anda. Ketika kontrol diserahkan ke main() , proses Anda sudah memiliki kemampuan yang dibutuhkan sehingga layanan Anda bisa menggunakan user non-root dan kelompok (ini adalah cara yang lebih disukai untuk memulai layanan istimewa).

Bagian caps menggunakan sintaks berikut:

Bagian Nilai Definisi
[path] Jalur sistem file untuk dikonfigurasi. Jalur yang diakhiri dengan / dianggap sebagai dir, jika tidak, itu adalah file.

Ini adalah kesalahan untuk menentukan beberapa bagian dengan sama [path] dalam file yang berbeda. Dalam versi Python <= 3.2, file yang sama mungkin berisi bagian yang menimpa bagian sebelumnya; di Python 3.2, disetel ke mode ketat.
mode Modus berkas oktal Mode file oktal yang valid minimal 3 digit. Jika 3 ditentukan, itu diawali dengan 0, mode lain digunakan apa adanya.
user AID_<pengguna> Entah C define untuk AID valid atau nama ramah (misalnya baik AID_RADIO dan radio dapat diterima). Untuk menentukan AID kustom, lihat Konfigurasi bagian AID .
group AID_<grup> Sama dengan pengguna.
caps topi* Nama sebagaimana dinyatakan dalam bionic/libc/kernel/uapi/linux/capability.h tanpa awalan CAP_ . Kasus campuran diperbolehkan. Topi juga bisa mentah:
  • biner (0b0101)
  • oktal (0455)
  • int (42)
  • heksagonal (0xFF)
Pisahkan beberapa huruf besar menggunakan spasi putih.

Untuk contoh penggunaan, lihat Menggunakan kemampuan sistem file .

Mengonfigurasi bagian AID

Bagian AID berisi OEM AID dan menggunakan sintaks berikut:

Bagian Nilai Definisi
[AID_<name>] The <name> dapat berisi karakter di set huruf besar, angka, dan garis bawah. Versi huruf kecil digunakan sebagai nama yang ramah. File header yang dihasilkan untuk kode inklusi menggunakan tepat AID_<name> .

Ini adalah kesalahan untuk menentukan beberapa bagian dengan sama AID_<name> (kasus tidak sensitif dengan kendala yang sama seperti [path] ).

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

Ini adalah kesalahan untuk menentukan beberapa bagian dengan opsi nilai yang sama.

Pilihan nilai harus ditentukan dalam kisaran yang sesuai dengan partisi yang digunakan di <name> . Daftar partisi yang valid dan rentang yang sesuai mereka didefinisikan dalam system/core/libcutils/include/private/android_filesystem_config.h . Pilihannya 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(6500) - AID_ODM_RESERVED_END(6999)
  • Partisi 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 nama-nama AID Mendefinisikan OEM dan Menggunakan OEM AIDS .

Contoh penggunaan

Contoh berikut merinci cara menentukan dan menggunakan OEM AID dan cara mengaktifkan kemampuan sistem file. Nama OEM AID ([nama AID_]) harus dimulai dengan nama partisi seperti "vendor_" untuk memastikan mereka tidak konflik dengan nama AOSP masa depan atau partisi lain.

Mendefinisikan nama OEM AID

Untuk menentukan OEM AID, membuat config.fs berkas dan menetapkan nilai AID. Misalnya, dalam device/x/y/config.fs , mengatur sebagai berikut:

[AID_VENDOR_FOO]
value: 2900

Setelah membuat file, mengatur TARGET_FS_CONFIG_GEN variabel dan arahkan ke dalam BoardConfig.mk . Misalnya, dalam device/x/y/BoardConfig.mk , set berikut:

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

AID kustom Anda sekarang dapat digunakan oleh sistem secara luas pada build baru.

Menggunakan OEM AID

Untuk menggunakan OEM AID, dalam kode C Anda, termasuk oemaids_headers di Makefile Anda terkait, dan add #include "generated_oem_aid.h" , kemudian mulai menggunakan pengidentifikasi diumumkan. Misalnya, dalam my_file.c , tambahkan berikut ini:

#include "generated_oem_aid.h"
…

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

Dalam dikaitkan Anda Android.bp file, tambahkan berikut ini:

header_libs: ["oemaids_headers"],

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

LOCAL_HEADER_LIBRARIES := oemaids_headers

Menggunakan nama yang ramah

Di Android 9, Anda dapat menggunakan nama ramah untuk antarmuka apa pun yang mendukung nama AID. Sebagai contoh:

  • Dalam chown perintah dalam 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 nama ramah uid dilakukan oleh /vendor/etc/passwd dan /vendor/etc/group , partisi penjual harus dipasang.

Mengaitkan nama-nama ramah

Android 9 menyertakan dukungan untuk mengaitkan nama yang ramah dengan nilai OEM AID yang sebenarnya. Anda dapat menggunakan argumen string yang tidak numerik untuk pengguna dan kelompok, yaitu "vendor_ foo" bukan "2901".

Mengubah dari AID menjadi nama yang ramah

Untuk OEM AIDS , 8.x Android diperlukan penggunaan oem_#### dengan getpwnam dan fungsi yang sama, serta di tempat-tempat yang menangani pencarian melalui getpwnam (seperti init script). Di Android 9, Anda dapat menggunakan getpwnam dan getgrnam teman-teman di Bionic untuk mengkonversi dari Android ID (AIDS) untuk nama-nama yang ramah dan sebaliknya.

Menggunakan kemampuan sistem file

Untuk mengaktifkan kemampuan filesystem, membuat bagian topi di config.fs berkas. Misalnya, dalam 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, mengatur TARGET_FS_CONFIG_GEN ke titik ke file di BoardConfig.mk . Misalnya, dalam device/x/y/BoardConfig.mk , set berikut:

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

Ketika layanan vendor_ foo dijalankan, dimulai dengan kemampuan CAP_SYS_ADMIN dan CAP_SYS_NICE tanpa setuid dan setgid panggilan. Selain itu, vendor_ foo kebijakan SELinux layanan ini tidak lagi diperlukan kemampuan setuid dan setgid dan dapat dihapus.

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

Android 6.0 direlokasi fs_config dan terkait definisi struktur ( 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 diinstal di /system/etc/fs_config_dirs dan /system/etc/fs_config_files . Menggunakan aturan pencocokan dan penguraian terpisah untuk direktori dan file (yang dapat menggunakan ekspresi glob tambahan) memungkinkan Android menangani direktori dan file dalam dua tabel berbeda. Definisi struktur dalam system/core/libcutils/fs_config.c tidak hanya diperbolehkan runtime membaca direktori dan file, tetapi tuan rumah bisa menggunakan file yang sama selama waktu membangun gambar filesystem konstruk sebagai ${OUT}/system/etc/fs_config_dirs dan ${OUT}/system/etc/fs_config_files .

Meskipun metode override untuk memperluas sistem file telah digantikan oleh sistem konfigurasi modular yang diperkenalkan di Android 8.0, Anda masih dapat menggunakan metode lama jika diinginkan. Bagian berikut merinci cara membuat dan menyertakan file override dan mengonfigurasi sistem file.

Menghasilkan file penimpaan

Anda dapat menghasilkan selaras biner file /system/etc/fs_config_dirs dan /system/etc/fs_config_files menggunakan fs_config_generate alat dalam build/tools/fs_config . Alat ini menggunakan libcutils fungsi perpustakaan ( fs_config_generate() ) untuk mengelola kebutuhan DAC ke dalam buffer dan mendefinisikan aturan untuk include file untuk melembagakan aturan DAC.

Untuk penggunaan, membuat menyertakan file di device/ vendor / device /android_filesystem_config.h yang bertindak sebagai override. File harus menggunakan structure fs_path_config format yang didefinisikan dalam system/core/include/private/android_filesystem_config.h dengan inisialisasi struktur sebagai berikut untuk direktori dan berkas simbol:

  • Untuk direktori, gunakan android _device _dirs[] .
  • Untuk file, gunakan android _device _files[] .

Bila 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 file override menggunakan TARGET_ANDROID_FILESYSTEM_CONFIG_H dalam konfigurasi papan, dengan basename paksa android_filesystem_config.h .

Termasuk menimpa file

Untuk menyertakan file, memastikan bahwa PRODUCT_PACKAGES termasuk fs_config_dirs dan / atau fs_config_files sehingga dapat menginstal mereka untuk /system/etc/fs_config_dirs dan /system/etc/fs_config_files , masing-masing. Membangun sistem pencarian untuk custom android_filesystem_config.h di $(TARGET_DEVICE_DIR) , di mana BoardConfig.mk ada. Jika file ini ada di tempat lain, set papan config variabel TARGET_ANDROID_FILESYSTEM_CONFIG_H ke titik ke lokasi tersebut.

Mengkonfigurasi sistem file

Untuk mengonfigurasi sistem file di Android 6.0 dan lebih tinggi:

  1. Buat $(TARGET_DEVICE_DIR)/android_filesystem_config.h berkas.
  2. Tambahkan fs_config_dirs dan / atau fs_config_files untuk PRODUCT_PACKAGES di papan file konfigurasi (misalnya, $(TARGET_DEVICE_DIR)/device.mk ).

Ganti contoh

Contoh ini menunjukkan sebuah patch untuk meng-override system/bin/glgps daemon untuk menambahkan dukungan kunci bangun dalam device/ vendor / device direktori. Ingatlah hal berikut:

  • Setiap entri struktur adalah mode, uid, gid, kemampuan, dan nama. system/core/include/private/android_filesystem_config.h disertakan secara otomatis untuk memberikan # mendefinisikan manifest ( AID_ROOT , AID_SHELL , CAP_BLOCK_SUSPEND ).
  • The android_device_files[] bagian mencakup tindakan untuk akses menekan ke system/etc/fs_config_dirs saat yang tidak ditentukan, yang berfungsi sebagai perlindungan DAC tambahan karena kurangnya konten untuk menimpa direktori. Namun, ini adalah perlindungan yang lemah; jika seseorang memiliki kontrol atas /system , mereka biasanya bisa melakukan apa saja yang mereka inginkan.
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)

Migrasi sistem file dari rilis sebelumnya

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

  • Menghapus beberapa penyertaan, struktur, dan definisi sebaris.
  • Membutuhkan referensi untuk libcutils bukan berjalan langsung dari system/core/include/private/android_filesystem_config.h . Produsen perangkat executable pribadi yang bergantung pada system/code/include/private_filesystem_config.h untuk file atau direktori struktur atau fs_config harus menambahkan libcutils dependensi perpustakaan.
  • Mengharuskan produsen perangkat cabang pribadi salinan dari system/core/include/private/android_filesystem_config.h dengan konten tambahan pada target yang ada untuk pindah ke device/ vendor / device /android_filesystem_config.h .
  • Cadangan hak untuk menerapkan SELinux Kontrol Akses Wajib (MAC) ke file-file konfigurasi pada sistem target, implementasi yang mencakup sasaran executable kustom menggunakan fs_config() harus menjamin akses.