İ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, çekirdek (Android tanımlı) AID'leri gereksiz yere kullanıyor; çoğu durumda bunun yerine OEM (OEM tanımlı) AID'leri kullanabilirsiniz.

Android'in önceki sürümleri (Android 7.x ve altı), dosya sistemi yeteneklerini ve/veya özel OEM AID'lerini belirtmek için cihaza özel bir android_filesystem_config.h dosyası kullanarak AID mekanizmasını genişletti. Ancak bu sistem, OEM AID'ler için güzel adlar kullanmayı desteklemediğinden, kullanıcı ve grup alanları için kolay bir adı sayısal AID ile ilişkilendirmenin bir yolu olmadan ham sayısal belirtmenizi gerektirdiğinden sezgisel değildi.

Android'in daha yeni sürümleri (Android 8.0 ve üzeri), 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 fazla kaynak konumu (genişletilebilir yapı yapılandırmalarına olanak tanır).
  • OEM AID değerlerinin yapım aşamasında akıl sağlığı kontrolü.
  • Gerektiğinde kaynak dosyalarda kullanılabilecek özel bir OEM AID başlığının oluşturulması.
  • Kolay bir ismin gerçek OEM AID değeriyle ilişkilendirilmesi. Kullanıcı ve grup için sayısal olmayan dize bağımsız değişkenlerini, yani "2901" yerine "foo"yu destekler.

Ek iyileştirmeler arasında android_ids[] dizisinin system/core/libcutils/include/private/android_filesystem_config.h dosyasından kaldırılması yer alır. Bu dizi artık Bionic'te getpwnam() ve getgrnam() yoluyla erişenlerle tamamen özel olarak oluşturulmuş bir dizi olarak mevcut. (Bunun, çekirdek AID'ler değiştirildiğinden kararlı ikili dosyalar üretme yan etkisi vardır.) Araçlar ve daha fazla ayrıntı içeren README dosyası için build/make/tools/fs_config dosyasına bakın.

Android Kimlikleri (AID'ler) Ekleme

Android 8.0, android_ids[] dizisini Android Açık Kaynak Projesinden (AOSP) kaldırdı. Bunun yerine tüm AID dostu adlar, Bionic android_ids[] dizisi oluşturulurken system/core/libcutils/include/private/android_filesystem_config.h başlık dosyasından oluşturulur. AID_* ile eşleşen herhangi bir define takım tarafından alınır ve *, küçük harf adı olur.

Örneğin, private/android_filesystem_config.h dosyasında:

#define AID_SYSTEM 1000

Şuna dönüşür:

  • Kolay isim: sistem
  • kullanıcı kimliği: 1000
  • sayı: 1000

Yeni bir AOSP çekirdek AID'si eklemek için #define android_filesystem_config.h başlık dosyasına eklemeniz yeterlidir. AID, derleme sırasında oluşturulacak ve kullanıcı ve grup argümanlarını kullanan arayüzlere sunulacaktır. Araç, yeni AID'nin APP veya OEM aralıklarında olmadığını doğrular; aynı zamanda bu aralıklardaki değişikliklere de saygı duyar ve değişikliklere veya OEM tarafından ayrılmış yeni aralıklara göre otomatik olarak yeniden yapılandırılmalıdır.

AID'leri Yapılandırma

Yeni AID mekanizmasını etkinleştirmek için BoardConfig.mk dosyasında TARGET_FS_CONFIG_GEN ayarlayın. Bu değişken, yapılandırma dosyalarının bir listesini tutar ve gerektiğinde dosyaları eklemenizi sağlar.

Geleneksel olarak yapılandırma dosyaları config.fs adını kullanır, ancak pratikte herhangi bir adı kullanabilirsiniz. config.fs dosyaları Python ConfigParser ini formatındadır ve büyük harfler bölümü (dosya sistemi yeteneklerini yapılandırmak için) ve AID'ler bölümünü (OEM AID'lerini yapılandırmak için) içerir.

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

Büyük harfler bölümü, yapı içindeki dosya sistemi nesnelerinde dosya sistemi yeteneklerinin ayarlanmasını destekler (dosya sisteminin kendisi de bu işlevselliği desteklemelidir).

Android'de kararlı bir hizmeti kök olarak çalıştırmak Uyumluluk Test Paketi (CTS) hatasına neden olduğundan, bir işlemi veya hizmeti çalıştırırken bir yeteneğin korunmasına yönelik önceki gereksinimler, yeteneklerin ayarlanmasını ve ardından çalıştırılacak uygun bir AID için setuid / setgid kullanılmasını içeriyordu. Büyük harflerle bu gereksinimleri atlayabilir ve çekirdeğin bunu sizin için yapmasını sağlayabilirsiniz. Kontrol main() a devredildiğinde, süreciniz zaten ihtiyaç duyduğu yeteneklere sahiptir, böylece hizmetiniz root olmayan bir kullanıcı ve grubu kullanabilir (ayrıcalıklı hizmetleri başlatmak için tercih edilen yol budur).

Büyük harfler 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 halde bir dosyadır.

Farklı dosyalarda aynı [path] ile birden fazla bölümün belirtilmesi bir hatadır. Python <= 3.2 sürümlerinde, 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 basamaktan oluşan geçerli bir sekizlik dosya modu. 3 belirtilirse önüne 0 eklenir, aksi takdirde mod olduğu gibi kullanılır.
user AID_<kullanıcı> Ya geçerli bir AID için C define ya da kolay ad (örn. hem AID_RADIO hem de radio kabul edilebilir). Özel bir AID tanımlamak için AID'yi Yapılandırma bölümüne bakın.
group AID_<grup> Kullanıcıyla aynı.
caps kap* Başında CAP_ olmadan bionic/libc/kernel/uapi/linux/capability.h dosyasında bildirilen ad. Karışık duruma izin verilir. Kapaklar ayrıca ham olabilir:
  • ikili (0b0101)
  • sekizlik (0455)
  • int (42)
  • onaltılık (0xFF)
Birden çok büyük harfi boşluk kullanarak ayırın.

Kullanım örneği için bkz. Dosya sistemi yeteneklerini kullanma .

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

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

Bölüm Değer Tanım
[AID_<name>] <name> büyük harf, rakam ve alt çizgi karakterlerini içerebilir. Kolay ad olarak küçük harfli sürüm kullanılır. Kodun eklenmesi için oluşturulan başlık dosyası tam olarak AID_<name> dosyasını kullanır.

Aynı AID_<name> ile birden fazla bölümün belirtilmesi bir hatadır ( [path] ile aynı kısıtlamalarla büyük/küçük harfe duyarlı değildir).

<name> farklı kaynaklarla çakışmadığından emin olmak için bir bölüm 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 fazla bölümün belirtilmesi bir hatadır.

Değer seçenekleri <name> de kullanılan bölüme karşılık gelen aralıkta belirtilmelidir. Geçerli bölümlerin listesi ve bunlara karşılık gelen aralıklar system/core/libcutils/include/private/android_filesystem_config.h dosyasında tanımlanmıştır. 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ölümü
    • 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ölümü
    • 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. OEM AID adlarını tanımlama ve OEM AID'leri kullanma .

Kullanım örnekleri

Aşağıdaki örnekler, OEM AID'nin nasıl tanımlanıp kullanılacağını ve dosya sistemi özelliklerinin nasıl etkinleştirileceğini ayrıntılı olarak açıklamaktadır. OEM AID adları ( [AID_ adı ] ), gelecekteki AOSP adlarıyla veya diğer bölümlerle çakışmamalarını sağlamak için " satıcı_ " gibi bir bölüm adıyla başlamalıdır.

OEM AID adlarını tanımlama

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

[AID_VENDOR_FOO]
value: 2900

Dosyayı oluşturduktan sonra TARGET_FS_CONFIG_GEN değişkenini ayarlayın ve BoardConfig.mk bunun üzerine gelin. Örneğin, device/x/y/BoardConfig.mk dosyasında aşağıdakileri ayarlayın:

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

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

OEM AID'lerini kullanma

Bir OEM AID kullanmak için, C kodunuza oemaids_headers ilgili Makefile dosyasına ekleyin ve #include "generated_oem_aid.h" ekleyin, ardından bildirilen tanımlayıcıları kullanmaya başlayın. Örneğin, my_file.c dosyasına aşağıdakileri ekleyin:

#include "generated_oem_aid.h"
…

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

İlişkili Android.bp dosyanıza aşağıdakileri ekleyin:

header_libs: ["oemaids_headers"],

Android.mk dosyası kullanıyorsanız aşağıdakileri ekleyin:

LOCAL_HEADER_LIBRARIES := oemaids_headers

Dost isimleri kullanma

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

  • some/init.rc dosyasındaki chown komutunda:
    chown vendor_foo /vendor/some/vendor_foo/file
    
  • some/init.rc dosyasındaki bir service :
    service vendor_foo /vendor/bin/foo_service
        user vendor_foo
        group vendor_foo
    

Kolay addan kullanıcı kimliğine dahili eşleme /vendor/etc/passwd ve /vendor/etc/group tarafından gerçekleştirildiğinden, satıcı bölümünün takılması gerekir.

Kolay isimlerin ilişkilendirilmesi

Android 9, kolay bir adı gerçek OEM AID değeriyle ilişkilendirme desteğini içerir. Kullanıcı ve grup için sayısal olmayan dize bağımsız değişkenleri kullanabilirsiniz; örneğin "2901" yerine " satıcı_ foo".

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

OEM AID'ler için, Android 8.x, getpwnam ve benzer işlevlerle birlikte oem_#### kullanımının yanı sıra getpwnam aracılığıyla aramaları işleyen yerlerde ( init komut dosyaları gibi) kullanılmasını gerektiriyordu. Android 9'da, Bionic'teki getpwnam ve getgrnam arkadaşlarını, Android kimliklerini (AID'ler) kolay adlara (veya tam tersi) dönüştürmek için kullanabilirsiniz.

Dosya sistemi yeteneklerini kullanma

Dosya sistemi yeteneklerini etkinleştirmek için config.fs dosyasında bir büyük harf bölümü oluşturun. Örneğin, device/x/y/config.fs dosyasına 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 TARGET_FS_CONFIG_GEN BoardConfig.mk içindeki o dosyayı işaret edecek şekilde ayarlayın. Örneğin, device/x/y/BoardConfig.mk dosyasında aşağıdakileri ayarlayın:

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

vendor_ foo hizmeti yürütüldüğünde, setuid ve setgid çağrıları olmadan CAP_SYS_ADMIN ve CAP_SYS_NICE yetenekleriyle başlar. Ek olarak, vendor_ foo hizmetinin SELinux politikası artık setuid ve setgid yeteneklerine ihtiyaç duymaz ve silinebilir.

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

Android 6.0 fs_config ve ilgili yapı tanımlarını ( system/core/include/private/android_filesystem_config.h ) system/core/libcutils/fs_config.c dosyasına taşıdı; burada /system/etc/fs_config_dirs dizinine yüklenen ikili dosyalar tarafından güncellenebilir veya geçersiz kılınabilir. /system/etc/fs_config_files . Dizinler ve dosyalar için ayrı eşleştirme ve ayrıştırma kuralları kullanmak (ek glob ifadeleri kullanabilir), Android'in iki farklı tablodaki dizinleri ve dosyaları işlemesini sağladı. system/core/libcutils/fs_config.c dosyasındaki yapı tanımları, yalnızca dizinlerin ve dosyaların çalışma zamanında okunmasına izin vermekle kalmadı, aynı zamanda ana bilgisayar, derleme süresi boyunca ${OUT}/system/etc/fs_config_dirs ve ${OUT}/system/etc/fs_config_files olarak dosya sistemi görüntüleri oluşturmak için aynı dosyaları kullanabilir. ${OUT}/system/etc/fs_config_files .

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

Geçersiz kılma dosyaları oluşturuluyor

/system/etc/fs_config_dirs ve /system/etc/fs_config_files hizalanmış ikili dosyalarını build/tools/fs_config dosyasındaki fs_config_generate aracını kullanarak oluşturabilirsiniz. Araç, DAC gereksinimlerini bir arabellekte yönetmek için bir libcutils kitaplık işlevini ( fs_config_generate() ) kullanır ve DAC kurallarını kurumsallaştırmak amacıyla bir içerme dosyası için kurallar tanımlar.

Kullanmak için, device/ vendor / device /android_filesystem_config.h dosyasında geçersiz kılma görevi görecek bir içerme dosyası oluşturun. Dosyanın system/core/include/private/android_filesystem_config.h dosyasında tanımlanan structure fs_path_config biçimini, dizin ve dosya sembolleri için aşağıdaki yapı başlatmalarıyla birlikte kullanması gerekir:

  • Dizinler için android _device _dirs[] kullanın.
  • Dosyalar için android _device _files[] kullanın.

android_device_dirs[] ve android_device_files[] kullanılmadığında, NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS ve NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES tanımlayabilirsiniz (aşağıdaki örneğe bakın). Ayrıca geçersiz kılma dosyasını, pano yapılandırmasında TARGET_ANDROID_FILESYSTEM_CONFIG_H kullanarak, zorunlu kılınan android_filesystem_config.h temel adıyla belirtebilirsiniz.

Geçersiz kılma dosyaları dahil

Dosyaları dahil etmek için PRODUCT_PACKAGES fs_config_dirs ve/veya fs_config_files içerdiğinden emin olun, böylece bunları sırasıyla /system/etc/fs_config_dirs ve /system/etc/fs_config_files dizinine yükleyebilir. Derleme sistemi, BoardConfig.mk bulunduğu $(TARGET_DEVICE_DIR) dosyasında özel android_filesystem_config.h dosyasını arar. Bu dosya başka bir yerde mevcutsa, TARGET_ANDROID_FILESYSTEM_CONFIG_H kart yapılandırma değişkenini bu konumu işaret edecek şekilde ayarlayın.

Dosya sistemini yapılandırma

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

  1. $(TARGET_DEVICE_DIR)/android_filesystem_config.h dosyasını oluşturun.
  2. fs_config_dirs ve/veya fs_config_files pano yapılandırma dosyasındaki PRODUCT_PACKAGES ekleyin (örneğin, $(TARGET_DEVICE_DIR)/device.mk ).

Örneği geçersiz kıl

Bu örnek device/ vendor / device dizinine uyandırma kilidi desteği eklemek için system/bin/glgps arka plan programını geçersiz kılmak için bir yamayı gösterir. 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 #defines manifestosunu ( AID_ROOT , AID_SHELL , CAP_BLOCK_SUSPEND ) sağlamak için otomatik olarak eklenir.
  • android_device_files[] bölümü, belirtilmediğinde system/etc/fs_config_dirs dosyasına erişimi engelleyen bir eylem içerir; bu, dizin geçersiz kılma içerik eksikliği nedeniyle ek bir DAC koruması görevi görür. Ancak bu zayıf bir korumadır; Eğer birisi /system üzerinde kontrole sahipse, genellikle istediği 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)

Önceki sürümlerden dosya sistemlerini taşıma

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

  • Bazı içermeleri, yapıları ve satır içi tanımları kaldırır.
  • Doğrudan system/core/include/private/android_filesystem_config.h dosyasından çalıştırmak yerine libcutils referans gerektirir. Dosya veya dizin yapıları veya fs_config için system/code/include/private_filesystem_config.h bağlı olan cihaz üreticisinin özel yürütülebilir dosyaları, libcutils kitaplığı bağımlılıklarını eklemelidir.
  • system/core/include/private/android_filesystem_config.h cihaz üreticisinin özel dal kopyalarının device/ vendor / device /android_filesystem_config.h konumuna taşınabilmesi için mevcut hedeflerdeki ekstra içeriğe sahip olmasını gerektirir.
  • Hedef sistemdeki yapılandırma dosyalarına SELinux Zorunlu Erişim Denetimlerini (MAC) uygulama hakkını saklı tutar; fs_config() kullanan özel hedef yürütülebilir dosyaları içeren uygulamalar erişimi sağlamalıdır.