İ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ü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 AIDs mekanizmasını genişletti. Ancak, OEM AID'ler için güzel adların kullanılmasını desteklemediğinden bu sistem sezgisel değildi ve sayısal AID ile kolay bir ad ilişkilendirmenin bir yolu olmadan kullanıcı ve grup alanları için 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ına olanak tanır).
  • 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 iyileştirmeler, android_ids[] dizisinin system/core/libcutils/include/private/android_filesystem_config.h . Bu dizi artık Bionic'te, getpwnam() ve getgrnam() aracılığıyla erişimcilerle tamamen özel olarak oluşturulmuş bir dizi olarak bulunmaktadır. (Bu, çekirdek AID'ler değiştirilirken kararlı ikili dosyalar üretmenin yan etkisine sahiptir.) Takımlar ve daha fazla ayrıntı içeren bir BENİOKU dosyası için build/make/tools/fs_config .

Android kimlikleri (AID'ler) ekleme

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

Örneğin, private/android_filesystem_config.h içinde:

#define AID_SYSTEM 1000

olur:

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

Yeni bir AOSP çekirdek AID'si eklemek için android_filesystem_config.h başlık dosyasına #define eklemeniz yeterlidir. 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 tarafından ayrılmış aralıklarda 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, gerektiğinde dosya eklemenizi sağlayan yapılandırma dosyalarının bir listesini tutar.

Konvansiyonel olarak, yapılandırma dosyaları config.fs adını kullanır, ancak pratikte herhangi bir adı kullanabilirsiniz. config.fs dosyaları Python ConfigParser ini biçimindedir ve bir büyük harf bölümü (dosya sistemi özelliklerini yapılandırmak için) ve bir AIDs bölümü (OEM AID'leri yapılandırmak için) içerir.

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

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

Android'de kök olarak kararlı bir hizmet çalıştırmak bir Uyumluluk Testi Paketi (CTS) hatasına neden olduğundan, bir işlemi veya hizmeti çalıştırırken bir yeteneği korumak için önceki gereksinimler, yeteneklerin ayarlanmasını ve ardından çalıştırmak için uygun bir AID'ye setuid / setgid kullanılmasını içeriyordu. Büyük harflerle bu gereksinimleri atlayabilir ve çekirdeğin sizin için yapmasını sağlayabilirsiniz. Kontrol main() öğesine verildiğinde, işleminiz hizmetinizin root olmayan bir kullanıcı ve grup kullanabilmesi için ihtiyaç duyduğu yeteneklere zaten sahiptir (ayrıcalıklı hizmetleri başlatmak için tercih edilen yol budur).

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.

Farklı dosyalarda aynı [path] ile birden çok bölüm belirtmek bir hatadır. 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ı> C, geçerli bir AID veya kolay ad için define (örneğin, 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ı ile aynı.
caps başlık* bionic/libc/kernel/uapi/linux/capability.h içinde bildirildiği şekliyle ad, başında CAP_ olmadan. Karışık vakaya izin verilir. Kapaklar ayrıca ham olabilir:
  • ikili (0b0101)
  • sekizli (0455)
  • int (42)
  • altıgen (0xFF)
Boşlukları kullanarak birden çok büyük harf ayırın.

Bir 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'lerini içerir ve aşağıdaki sözdizimini kullanır:

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

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

<name> , farklı kaynaklarla çakışmamasını sağlamak 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 çok bölüm belirtmek bir hatadır.

Değer seçenekleri, <name> içinde 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 içinde tanımlanı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ö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ölmesi
    • 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, 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 AID adları ( [AID_ adı ] ), gelecekteki AOSP adları 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 içinde 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 içinde ona gelin. Örneğin, device/x/y/BoardConfig.mk içinde aşağıdakileri ayarlayın:

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

Bir OEM AID kullanmak için, C kodunuzda, ilişkili Makefile'nize oemaids_headers ekleyin ve #include "generated_oem_aid.h" öğesini ekleyin, ardından belirtilen tanımlayıcıları kullanmaya başlayın. Örneğin, my_file.c aşağıdakini 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"],

Bir Android.mk dosyası kullanıyorsanız aşağıdakileri 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:

  • some/init.rc içindeki bir chown komutunda:
    chown vendor_foo /vendor/some/vendor_foo/file
    
  • some/init.rc içindeki 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 yapıldığından, satıcı bölümü monte edilmelidir.

Dost isimleri ilişkilendirmek

Android 9, gerçek OEM AID değeriyle kolay bir ad ilişkilendirme desteği içerir. Kullanıcı ve grup için sayısal olmayan dize bağımsız değişkenleri kullanabilirsiniz, yani "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 oem_#### 'ın ve ayrıca getpwnam aracılığıyla aramaları işleyen yerlerde ( init komut dosyaları gibi) kullanılmasını gerektiriyordu. Android 9'da, getpwnam ve getgrnam arkadaşlarını Android kimliklerinden (AID'ler) kolay adlara veya tam tersi şekilde dönüştürmek için kullanabilirsiniz.

Dosya sistemi yeteneklerini kullanma

Dosya sistemi özelliklerini 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 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 dosyaya işaret edecek şekilde ayarlayın. Örneğin, device/x/y/BoardConfig.mk içinde aşağıdakileri ayarlayın:

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

Servis vendor_ foo yürütüldüğünde, setuid ve setgid çağrıları olmadan CAP_SYS_ADMIN ve CAP_SYS_NICE yetenekleriyle başlar. Ayrıca, vendor_ foo hizmetinin SELinux ilkesi artık setuid ve setgid yeteneğine ihtiyaç duymaz ve silinebilir.

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

Android 6.0, fs_config ve ilişkili yapı tanımlarını ( system/core/include/private/android_filesystem_config.h ) system/core/libcutils/fs_config.c taşındı ve burada /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ı. system/core/libcutils/fs_config.c içindeki yapı tanımları, yalnızca dizinlerin ve dosyaların çalışma zamanında okunmasına izin vermekle kalmaz, aynı zamanda ana bilgisayar, dosya sistemi görüntülerini ${OUT}/system/etc/fs_config_dirs ve ${OUT}/system/etc/fs_config_files olarak oluşturmak için derleme süresi sırasında aynı dosyaları kullanabilir. ${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

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

Kullanmak için device/ vendor / device /android_filesystem_config.h içinde geçersiz kılma işlevi gören bir içerme dosyası oluşturun. Dosya, system/core/include/private/android_filesystem_config.h içinde tanımlanan structure fs_path_config biçimini, dizin ve dosya sembolleri için aşağıdaki yapı başlatmalarıyla birlikte kullanmalıdır:

  • 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, tahta yapılandırmasında TARGET_ANDROID_FILESYSTEM_CONFIG_H kullanarak, zorunlu bir android_filesystem_config.h temel adıyla geçersiz kılma dosyasını 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 . Derleme sistemi, BoardConfig.mk bulunduğu $(TARGET_DEVICE_DIR) içinde özel android_filesystem_config.h dosyasını arar. Bu dosya başka bir yerde mevcutsa, TARGET_ANDROID_FILESYSTEM_CONFIG_H pano yapılandırma değişkenini bu konumu gösterecek şekilde ayarlayın.

Dosya sistemini yapılandırma

Dosya sistemini Android 6.0 ve sonraki sürümlerde 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 dizininde 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 bildirimini sağlamak için otomatik olarak dahil edilir ( AID_ROOT , AID_SHELL , CAP_BLOCK_SUSPEND ).
  • android_device_files[] bölümü, belirtilmediğinde system/etc/fs_config_dirs erişimi bastırmak için bir eylem içerir ve bu, dizin geçersiz kılmaları için içerik eksikliği için ek bir DAC koruması görevi görür. Ancak bu zayıf bir korumadır; birinin /system üzerinde kontrolü varsa, genellikle istedikleri her şeyi yapabilirler.
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.
  • Doğrudan system/core/include/private/android_filesystem_config.h çalıştırmak yerine libcutils bir başvuru gerektirir. Dosya veya dizin yapıları veya fs_config için system/code/include/private_filesystem_config.h öğesine bağlı olan aygıt üreticisi özel yürütülebilir dosyaları, libcutils kitaplık bağımlılıkları eklemelidir.
  • system/core/include/private/android_filesystem_config.h device/ vendor / device /android_filesystem_config.h taşınması için mevcut hedeflerde ekstra içerikle birlikte cihaz üreticisinin özel dal kopyalarını gerektirir.
  • Hedef sistemdeki yapılandırma dosyalarına SELinux Zorunlu Erişim Kontrollerini (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.