İsteğe Bağlı Erişim Kontrolü (DAC)

Derlemeye eklenen dosya sistemi nesneleri ve hizmetleri, sıklıkla Android Kimlikleri (AID'ler) olarak bilinen ayrı, benzersiz kimliklere ihtiyaç duyar. Şu anda, dosyalar ve hizmetler gibi birçok kaynak, gereksiz yere çekirdek (Android tanımlı) AID'leri kullanır; çoğu durumda bunun yerine OEM (OEM tanımlı) AID'leri kullanabilirsiniz.

Android'in önceki sürümlerinde (Android 7.x ve alt) cihaza özgü kullanarak AIDS mekanizmasını genişletilmiş android_filesystem_config.h dosya sistemi yetenekleri ve / veya özel OEM AIDS'le belirtmek için dosyayı. Ancak, OEM AID'ler için güzel adların kullanılmasını desteklemediğinden bu sistem sezgisel değildi ve kullanıcı ve grup alanları için sayısal AID ile kolay bir ad ilişkilendirmenin bir yolu olmadan ham sayısal belirtmenizi gerektiriyordu.

Android'in daha yeni sürümleri (Android 8.0 ve üstü), dosya sistemi yeteneklerini genişletmek için yeni bir yöntemi destekler. Bu yeni yöntem aşağıdakileri destekler:

  • Yapılandırma dosyaları için birden çok kaynak konumu (genişletilebilir yapı yapılandırmalarını etkinleştirir).
  • OEM AID değerlerinin inşa zamanı akıl sağlığı kontrolü.
  • Gerektiğinde kaynak dosyalarda kullanılabilecek özel bir OEM AID başlığının oluşturulması.
  • Gerçek OEM AID değeriyle kolay bir ad ilişkisi. Kullanıcı ve grup için sayısal olmayan dize bağımsız değişkenlerini destekler, yani "2901" yerine "foo".

Ek geliştirmeler kaldırılmasını içerir android_ids[] , sıra system/core/libcutils/include/private/android_filesystem_config.h . Bu dizi, artık ile erişimcilerle, tam özel üretilen dizi olarak biyonik kullanımı bulunmaktadır getpwnam() ve getgrnam() . (Bu çekirdek AİDS değiştirilmiş stabil ikili üreten yan etkisi vardır.) Kalıp ve daha fazla ayrıntı ile README dosyası için, bakınız build/make/tools/fs_config .

Android kimlikleri (AID'ler) ekleme

Robot 8.0 çıkarıldı android_ids[] robot açık kaynak Projesi (AOSP) gelen dizi. Tüm YARDIM uygun isimleri yerine oluşturulur system/core/libcutils/include/private/android_filesystem_config.h biyonik oluştururken başlık dosyasında android_ids[] dizisi. Herhangi define eşleşen AID_* kalıp tarafından yakalandı ve * küçük adı haline gelir.

Örneğin, private/android_filesystem_config.h :

#define AID_SYSTEM 1000

Olur:

  • Dostu isim: sistem
  • kullanıcı kimliği: 1000
  • git: 1000

Yeni bir AOSP çekirdek YARDIM eklemek için, eklemek #define için android_filesystem_config.h başlık dosyasına. AID, derleme sırasında oluşturulacak ve kullanıcı ve grup bağımsız değişkenlerini kullanan arabirimlere sunulacaktır. Takım, yeni AID'nin APP veya OEM aralıklarında olmadığını doğrular; aynı zamanda bu aralıklardaki değişikliklere de uyar ve değişikliklerde veya yeni OEM'e ayrılmış aralıklarda otomatik olarak yeniden yapılandırılmalıdır.

AID'leri Yapılandırma

Yeni AIDS mekanizması, set etkinleştirmek için TARGET_FS_CONFIG_GEN içinde BoardConfig.mk dosyası. Bu değişken, gerektiğinde dosya eklemenizi sağlayan yapılandırma dosyalarının bir listesini tutar.

Geleneksel olarak, yapılandırma dosyaları adı kullanmak config.fs , ama pratikte herhangi bir ad kullanabilirsiniz. config.fs dosyaları içindedir Python ConfigParser ini biçimi ve (dosya sistemi yetenekleri yapılandırmak için) kapaklar bölümü ve (OEM AIDS'le yapılandırmak için) bir AIDS bölüm içerir.

Büyük harf bölümünü yapılandırma

Ayar kapakları bölüm destekleri dosya sistemi yetenekleri dosya sisteminde yapı (dosya sistemi kendisi de bu işlevi desteklemesi gerekir) içinde itiraz ediyor.

Android'de root olarak istikrarlı hizmetini çalıştıran bir neden olduğu için Uyumluluk Testi Suite (CTS) yetmezliği, bir süreç çalışan veya hizmet kullanılarak ardından yetenekleri kurma içeriyordu ederken yeteneği tutulması için önceki gereksinimleri setuid / setgid çalıştırmak için uygun bir AID. Büyük harflerle bu gereksinimleri atlayabilir ve çekirdeğin sizin için yapmasını sağlayabilirsiniz. Kontrol teslim edildiğinde main() , senin süreç zaten servis kök olmayan kullanıcı ve grup (bu ayrıcalıklı hizmetler başlatmak için tercih edilen yoldur) kullanabilir böylece ihtiyacı yeteneklere sahiptir.

Büyük harf bölümü aşağıdaki sözdizimini kullanır:

Bölüm Değer Tanım
[path] Yapılandırılacak dosya sistemi yolu. / ile biten bir yol bir dizin olarak kabul edilir, aksi takdirde bir dosyadır.

Aynı ile birden bölümleri belirtmek için bir hatadır [path] farklı dosyalarda. Python sürümlerinde <= 3.2, aynı dosya önceki bölümü geçersiz kılan bölümler içerebilir; Python 3.2'de katı moda ayarlanmıştır.
mode Sekizli dosya modu En az 3 basamaklı geçerli bir sekizli dosya modu. 3 belirtilirse, önüne 0 eklenir, aksi halde mod olduğu gibi kullanılır.
user AID_<kullanıcı> Her iki Cı define geçerli bir yardım veya kolay adı (örneğin, her ikisi için AID_RADIO ve radio kabul edilebilir). Özel bir AID tanımlamak için, bkz YARDIM bölümüne yapılandırılması .
group AID_<grup> Kullanıcı ile aynı.
caps başlık* Beyan olarak adı bionic/libc/kernel/uapi/linux/capability.h lider olmadan CAP_ . Karışık durumda izin verilir. Kapaklar ayrıca ham olabilir:
  • ikili (0b0101)
  • sekizli (0455)
  • int (42)
  • altıgen (0xFF)
Beyaz boşlukları kullanarak birden çok büyük harf ayırın.

Bir kullanım örneği için bkz dosya sistemi yetenekleri kullanma .

AID bölümünü yapılandırma

AID bölümü, OEM AID'lerini içerir ve aşağıdaki sözdizimini kullanır:

Bölüm Değer Tanım
[AID_<name>] <name> set büyük harf, rakam ve alt çizgi karakterleri içerebilir. Küçük harfli sürüm, kolay ad olarak kullanılır. Kod eklenmesi için oluşturulan üstbilgi dosyası tam kullanan AID_<name> .

Aynı ile birden bölümleri belirtmek için bir hatadır AID_<name> (aynı kısıtlamaları ile büyük harf duyarsız [path] ).

<name> farklı kaynaklarla çatışma değil emin olmak için bir bölme adıyla başlamalıdır.
value <sayı> Geçerli bir C stili sayı dizisi (onaltılı, sekizli, ikili ve ondalık).

Aynı değer seçeneğiyle birden çok bölüm belirtmek bir hatadır.

Değer seçenekleri kullanılan bölüm tekabül aralığında belirtilmelidir <name> . Geçerli bölümleri ve bunların karşılık gelen aralıklar listesi tanımlanan system/core/libcutils/include/private/android_filesystem_config.h . Seçenekler şunlardır:
  • Satıcı Bölümü
    • AID_OEM_RESERVED_START(2900) - AID_OEM_RESERVED_END(2999)
    • AID_OEM_RESERVED_2_START(5000) - AID_OEM_RESERVED_2_END(5999)
  • Sistem Bölmesi
    • AID_SYSTEM_RESERVED_START(6000) - AID_SYSTEM_RESERVED_END(6499)
  • ODM Bölümü
    • AID_ODM_RESERVED_START(6500) - AID_ODM_RESERVED_END(6999)
  • Ürün Bölmesi
    • AID_PRODUCT_RESERVED_START(7000) - AID_PRODUCT_RESERVED_END(7499)
  • System_ext Bölümü
    • AID_SYSTEM_EXT_RESERVED_START(7500) - AID_SYSTEM_EXT_RESERVED_END(7999)

Kullanım örnekleri için bkz tanımlanması OEM YARDIM adlarını ve OEM AIDS'le kullanma .

Kullanım örnekleri

Aşağıdaki örnekler, bir OEM AID'nin nasıl tanımlanıp kullanılacağını ve dosya sistemi yeteneklerinin nasıl etkinleştirileceğini detaylandırmaktadır. OEM YARDIM adları ([AID_ adı]) bu tür gelecek AOSP isimleri veya diğer bölümleri ile çakışmayan sağlamak için "vendor_" gibi bir bölüm adı ile başlamalıdır.

OEM AID adlarını tanımlama

OEM YARDIM tanımlamak için, bir oluşturmak config.fs dosyası ve YARDIM değerini ayarlayın. Örneğin, device/x/y/config.fs , aşağıdakileri ayarlayın:

[AID_VENDOR_FOO]
value: 2900

Dosyayı oluşturduktan sonra, set TARGET_FS_CONFIG_GEN kendisine değişken ve gelin BoardConfig.mk . Örneğin, device/x/y/BoardConfig.mk aşağıdaki tespitleri:

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

Özel AID'niz artık sistem tarafından yeni bir yapı üzerinde tüketilebilir.

OEM AID'leri kullanma

OEM YARDIM kullanabilmek için, C kodunda dahil oemaids_headers sizin ilişkili Makefiledaki ve eklenti #include "generated_oem_aid.h" , daha sonra ilan tanımlayıcıları kullanmaya başlayın. Örneğin, my_file.c aşağıdakileri ekleyin:

#include "generated_oem_aid.h"
…

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

Bunları ilişkili olarak Android.bp dosyası aşağıdakileri ekleyin:

header_libs: ["oemaids_headers"],

Bir kullanıyorsanız Android.mk dosyasını, daha sonra şunları ekleyin:

LOCAL_HEADER_LIBRARIES := oemaids_headers

Dost isimler kullanmak

Android 9'da, AID adlarını destekleyen herhangi bir arabirim için kolay adı kullanabilirsiniz. Örneğin:

  • Bir de chown komutunu some/init.rc :
    chown vendor_foo /vendor/some/vendor_foo/file
    
  • Bir de service içinde some/init.rc :
    service vendor_foo /vendor/bin/foo_service
        user vendor_foo
        group vendor_foo
    

Uid dost adından iç haritalama tarafından gerçekleştirildiğinden /vendor/etc/passwd ve /vendor/etc/group , satıcı bölümü monte edilmelidir.

Dost isimleri ilişkilendirme

Android 9, gerçek OEM AID değeriyle kolay bir ad ilişkilendirme desteği içerir. Kullanıcı ve grup yani yerine "2901" nin "vendor_ foo" için sayısal olmayan dize argümanlarını kullanabilirsiniz.

AID'den dost isimlere dönüştürme

İçin OEM AIDS , Android 8.x kullanımını gerekli oem_#### ile getpwnam ve benzeri fonksiyonların yanı yerlerde olduğu aracılığı sap aramaları getpwnam (örneğin init komut dosyaları). Android 9, sen kullanabilirsiniz getpwnam ve getgrnam dostu isimleri ve tam tersi Android kimlikleri (AIDS) dönüştürme için Bionic arkadaşlar.

Dosya sistemi yeteneklerini kullanma

Dosya sistemi yetenekleri etkinleştirmek için bir kapaklar bölüm oluşturmak config.fs dosyası. Örneğin, device/x/y/config.fs aşağıdaki bölümü ekleyin:

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

Dosyayı oluşturduktan sonra, set TARGET_FS_CONFIG_GEN o dosyaya noktaya BoardConfig.mk . Örneğin, device/x/y/BoardConfig.mk aşağıdaki tespitleri:

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

Servis yaparken vendor_ foo yürütüldüğünde, bu yetenekleri ile başlar CAP_SYS_ADMIN ve CAP_SYS_NICE olmadan setuid ve setgid çağrıları. Buna ek olarak, vendor_ foo hizmetin SELinux'un politikası artık yeteneği ihtiyacı setuid ve setgid ve silinebilir.

Geçersiz kılmaları yapılandırma (Android 6.x-7.x)

Android 6.0 yeniden konumlandırılan fs_config ve ilgili yapı tanımları ( system/core/include/private/android_filesystem_config.h ) için system/core/libcutils/fs_config.c onlar yüklü ikili dosyaları tarafından güncellenen veya geçersiz olabilir /system/etc/fs_config_dirs ve /system/etc/fs_config_files . Dizinler ve dosyalar için (ek glob ifadeleri kullanabilen) ayrı eşleştirme ve ayrıştırma kuralları kullanmak, Android'in dizinleri ve dosyaları iki farklı tabloda işlemesini sağladı. İçinde Yapısı tanımları system/core/libcutils/fs_config.c sadece dizin ve dosya çalışma zamanı okuma izin verilir, ancak ev sahibi olarak yapı dosya sistemi görüntülere inşa süre içinde aynı dosyaları kullanabilirsiniz ${OUT}/system/etc/fs_config_dirs ve ${OUT}/system/etc/fs_config_files .

Dosya sistemini genişletmenin geçersiz kılma yönteminin yerini Android 8.0'da tanıtılan modüler yapılandırma sistemi almış olsa da, isterseniz yine de eski yöntemi kullanabilirsiniz. Aşağıdaki bölümler, geçersiz kılma dosyalarının nasıl oluşturulacağını ve dahil edileceğini ve dosya sisteminin nasıl yapılandırılacağını ayrıntılı olarak açıklamaktadır.

Geçersiz kılma dosyaları oluşturuluyor

Sen hizalanmış ikili dosyaları oluşturabilir /system/etc/fs_config_dirs ve /system/etc/fs_config_files kullanarak fs_config_generate aracı build/tools/fs_config . Aracı kullanır libcutils kütüphane işlevi ( fs_config_generate() ) bir DAC kuralları kurumsallaştırmak dosyası dahil için bir tampon ve tanımlar kural olarak DAC gereksinimleri yönetmek.

Kullanım için, bir dosya içerir oluşturmak device/ vendor / device /android_filesystem_config.h geçersiz olarak hareket eder. Dosyasını kullanmak gerekir structure fs_path_config tanımlanan biçim system/core/include/private/android_filesystem_config.h dizin ve dosya sembolleri aşağıdaki yapıya başlangıç tanımlamaları ile:

  • Dizinleri için kullanmak android _device _dirs[] .
  • Dosyalar için, kullanmak android _device _files[] .

Kullanmadiinizda android_device_dirs[] ve android_device_files[] , Tanımlayabileceğiniz NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS ve NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES (bakınız örnek aşağıda). Ayrıca kullanarak geçersiz kılma dosyasını belirtebilirsiniz TARGET_ANDROID_FILESYSTEM_CONFIG_H bir zorunlu basename ile, tahta yapılandırmasında android_filesystem_config.h .

Geçersiz kılma dosyaları dahil

Dosyaları dahil etmek için emin PRODUCT_PACKAGES içeren fs_config_dirs ve / veya fs_config_files o bunları yükleyebilirsiniz böylece /system/etc/fs_config_dirs ve /system/etc/fs_config_files sırasıyla. Özel için inşa sistemi arar android_filesystem_config.h içinde $(TARGET_DEVICE_DIR) , nerede BoardConfig.mk bulunmaktadır. Bu dosya başka bir yerde bulunuyorsa, set tahta yapılandırma değişken TARGET_ANDROID_FILESYSTEM_CONFIG_H bu konuma noktaya.

Dosya sistemini yapılandırma

Dosya sistemini Android 6.0 ve sonraki sürümlerde yapılandırmak için:

  1. Create $(TARGET_DEVICE_DIR)/android_filesystem_config.h dosyayı.
  2. Ekle fs_config_dirs ve / veya fs_config_files için PRODUCT_PACKAGES tahta yapılandırma dosyası (örneğin, içinde $(TARGET_DEVICE_DIR)/device.mk ).

Örneği geçersiz kıl

Bu örnek gösterir geçersiz kılınmasından bir yama system/bin/glgps içinde uyanıklık kilit desteği eklemek için deamon device/ vendor / device dizininde. Aşağıdakileri aklınızda bulundurun:

  • Her yapı girişi, mod, kullanıcı kimliği, gid, yetenekler ve addır. system/core/include/private/android_filesystem_config.h tezahür #DEFINEs (sağlamak için otomatik olarak dahil AID_ROOT , AID_SHELL , CAP_BLOCK_SUSPEND ).
  • android_device_files[] bölümüne bastırmak erişim için bir eylem içerir system/etc/fs_config_dirs dizini geçersiz kılma için içerik yetersizliği için ek bir DAC koruma olarak hizmet eden belirtilmediğinde,. Ancak bu zayıf bir korumadır; Birisi üzerinde kontrolü varsa /system , bunlar genellikle istedikleri her şeyi yapabilir.
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)

Dosya sistemlerini önceki sürümlerden taşıma

Dosya sistemlerini Android 5.x ve önceki sürümlerden taşırken Android 6.x'in

  • Bazı içermeleri, yapıları ve satır içi tanımları kaldırır.
  • Bir referans gerektirir libcutils yerine şirketinden çalışan system/core/include/private/android_filesystem_config.h . Bağlıdır Cihaz üreticisi özel yürütülebilir system/code/include/private_filesystem_config.h dosya veya dizin yapıları için ya fs_config eklemelisiniz libcutils kütüphane bağımlılıklarını.
  • Cihaz üreticisi özel dal kopyaları gerektirir system/core/include/private/android_filesystem_config.h geçişle mevcut hedeflere ekstra içerikli device/ vendor / device /android_filesystem_config.h .
  • Hedef sistemde yapılandırma dosyaları kullanarak özel hedef yürütülebilir dahil uygulamalarına SELinux'un Zorunlu Erişim Kontrolleri (MAC) uygulamak Rezervler sağ fs_config() erişimini sağlamalıdır.