İsteğe bağlı erişim denetimi (DAC)

Derlemeye eklenen dosya sistemi nesneleri ve hizmetleri için sık sık ayrı, Android kimlikleri (AID'ler) olarak bilinen benzersiz kimlikler. Şu anda, dosyalar ve hizmetler temel (Android tanımlı) AID'leri gereksiz yere kullanıyor; birçok bunun yerine OEM (OEM tarafından tanımlanan) AID'leri kullanabilirsiniz.

Android'in önceki sürümlerinde (Android 7.x ve önceki sürümler) AID'ler genişletildi. Cihaza özel bir android_filesystem_config.h kullanan mekanizma dosyası oluşturun. Ancak bu sistem, OEM AID'ler için güzel adların kullanılmasını desteklemediğinden satıldıkları gibi pratik değildir. olmadan kullanıcı ve grup alanları için işlenmemiş bir kolay bir adı sayısal AID ile ilişkilendirme yöntemidir.

Android'in daha yeni sürümleri (Android 8.0 ve üstü) dosya sistemi özelliklerini artırır. Bu yeni yöntem takip etmek için:

  • Yapılandırma dosyaları için birden fazla kaynak konumu (Genişletilebilir derleme yapılandırmaları).
  • OEM AID değerlerinin derleme zamanında sağlıklı olma kontrolü.
  • Kaynak dosyalarda şu şekilde kullanılabilecek özel bir OEM AID üstbilgisinin oluşturulması: gerekir.
  • Kolay kullanılabilen adın gerçek OEM AID değeriyle ilişkilendirilmesi. Destekler kullanıcı ve grup için sayısal olmayan dize bağımsız değişkenleri, ör. "foo" yerine "2901".

Yapılacak diğer iyileştirmeler arasında android_ids[] adlı SDK'nın kaldırılması yer alıyor. dizi kaynağı system/core/libcutils/include/private/android_filesystem_config.h. Bu dizisi artık Bionic'te tamamen özel oluşturulmuş bir dizi olarak mevcuttur. getpwnam() ve getgrnam() erişimcileri. (Bu, temel AID'ler değiştirildiği için kararlı ikili programlar oluşturmanın yan etkisine neden olabilir.) Örneğin, aracını kullanın ve daha fazla ayrıntı içeren bir BENİOKU dosyası için build/make/tools/fs_config

Android kimlikleri (AID'ler) ekleyin

Android 8.0, android_ids[] dizisini Android'den kaldırdı Açık Kaynak Projesi (AOSP). AID uyumlu tüm adlar bunun yerine şuradan oluşturulmuştur: system/core/libcutils/include/private/android_filesystem_config.h başlık dosyasından oluşan düzenleyiciyi kullanabilirsiniz.android_ids[] Herhangi biri Araç, eşleşen define AID_* seçildi ve * küçük harf adı olur.

Örneğin, private/android_filesystem_config.h:

#define AID_SYSTEM 1000

Şu hale gelir:

  • Kolay ad: sistem
  • uid: 1000
  • gid: 1000

Yeni bir AOSP temel AID eklemek için#define android_filesystem_config.h başlık dosyası. AID: derleme sırasında oluşturulur ve kullanıcı ve grup kullanan arayüzler tarafından kullanılabilir hale getirilir bağımsız değişkenlerdir. Araç, yeni AID'nin uygulamada veya OEM'de olmadığını doğrular aralıklar; bu aralıklardaki değişikliklere de uyum sağlar ve otomatik olarak veya OEM tarafından ayrılmış yeni aralıklarda yeniden yapılandırma yapabilirsiniz.

AID'leri yapılandırın

Yeni AID mekanizmasını etkinleştirmek içinTARGET_FS_CONFIG_GEN BoardConfig.mk dosya Bu değişken, bir yapılandırma listesi içerir dosyaları kullanarak gerektiğinde dosya ekleyebilirsiniz.

Kural olarak, yapılandırma dosyaları config.fs adını kullanır, ancak pratik yapmak. config.fs dosya Python ConfigParser ini biçimindedir ve büyük harf bölümü içerir (dosyayı yapılandırmak için sistem özellikleri) ve AID'ler bölümü (OEM AID'lerini yapılandırmak için).

Sınırlar bölümünü yapılandırma

Sınırlar bölümü, dosya derleme (dosya sistemi) içindeki dosya sistemi nesnelerinde yer alan sistem özellikleri (kendisi de bu işlevi desteklemelidir)].

Çünkü Android'de kök olarak kararlı bir hizmet çalıştırmak Uyumluluk Test Paketi (CTS) sırasında, çalışan bir yeteneğin saklanmasında Süreç veya hizmet, özellikleri ayarlamayı ve ardından Çalıştırmak için uygun bir AID'ye setuid/setgid. Büyük harf kullandığınızda bu gereksinimleri atlayabilir ve çekirdeğin bunu sizin için yapmasını sağlayabilirsiniz. Kontrol şu durumda olduğunda: İşleminiz main() tarafından gerçekleştirilebiliyor. Sürecin gerekli tüm özellikleri zaten mevcut. hizmetinizin kök olmayan bir kullanıcı ve grup kullanabilmesini sağlayın (bu, tercih edilen yöntemini kullanmaya devam edebilirsiniz).

Sınırlar bölümünde aşağıdaki söz dizimi kullanılır:

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

Aynı [path] farklı dosyalarda. Python'un <= 3.2 sürümlerinde, aynı dosya, önceki bölümü geçersiz kılan bölümler içerebilir; Python'da Yüksek düzey modunda 3.2'de ayarlanmış olmalıdır.
mode Sekizli dosya modu En az 3 basamaklı geçerli bir sekizlik dosya modu. 3 belirtilirse eklenir, aksi takdirde mod olduğu gibi kullanılır.
user AID_<kullanıcı> Geçerli bir AID veya kolay ad için C define (ör. hem AID_RADIO hem de radio kabul edilir). Alıcı: özel bir AID tanımlayın. Daha fazla bilgi için girin.
group AID_<grup> Kullanıcı ile aynı.
caps sınır* Belirtilen ad bionic/libc/kernel/uapi/linux/capability.h. CAP_ olmadan. Karma büyük/küçük harfe izin verilir. Başlıklar da ham:
  • ikilik (0b0101)
  • sekizlik (0455)
  • tamsayı (42)
  • onaltılık (0xFF)
ziyaret edin. Boşluk kullanarak birden çok büyük harf ayırın.

Bir kullanım örneği için bkz. Dosya kullanarak sistem özellikleri.

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

AID bölümünde, OEM AID'ler yer alır ve şu söz dizimi kullanılır:

Bölüm Değer Tanım
[AID_<name>] <name>, kümedeki karakterleri içerebilir büyük harf, sayılar ve alt çizgilerden oluşur. Küçük harf sürümü, kolay bir ad. Kod eklemek için oluşturulan başlık dosyası, AID_<name>

Aynı AID_<name> (aynı kısıtlamalara sahip büyük/küçük harfe duyarlı değil) [path]).

<name>, bir bölüm adıyla başlamalıdır. farklı kaynaklarla çakışmadığından emin olun.
value <sayı> Geçerli bir C stili sayı dizesi (onaltılık, sekizlik, ikilik ve ondalık).

Aynı değer seçeneğiyle birden fazla bölümün belirtilmesi hatadır.

Değer seçenekleri, bölüme karşılık gelen aralıkta belirtilmelidir <name> kullanılıyor. Geçerli bölümlerin listesi ve bunlara karşılık gelen aralıklar system/core/libcutils/include/private/android_filesystem_config.h cinsinden tanımlanır. Seçenekler şunlardır:
  • Tedarikçi Bölümü
    • AID_OEM_RESERVED_START(2.900) - AID_OEM_RESERVED_END(2999)
    • AID_OEM_RESERVED_2_START(5.000) - 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(6.500) - AID_ODM_RESERVED_END(6999)
  • Ürün Bölüştürme
    • AID_PRODUCT_RESERVED_START(7000) - AID_PRODUCT_RESERVED_END(7499)
  • Sistem uzantısı bölümü
    • AID_SYSTEM_EXT_RESERVED_START(7.500) - AID_SYSTEM_EXT_RESERVED_END(7999)

Kullanım örnekleri için bkz. OEM'yi tanımlama AID adları ve OEM AID'lerini kullanma.

Kullanım örnekleri

Aşağıdaki örneklerde, OEM AID'nin nasıl tanımlanıp kullanılacağı ve dosya sistemi özelliklerini etkinleştirin. OEM AID adları ([AID_name]) şununla başlamalıdır: "vendor_" gibi bölüm adı çakışmalarını önlemek için AOSP adları veya diğer bölümler.

OEM AID adlarını tanımlayın

OEM AID tanımlamak için config.fs dosyası oluşturun ve AID değerini girin. Örneğin, device/x/y/config.fs içinde takip etmek için:

[AID_VENDOR_FOO]
value: 2900

Dosyayı oluşturduktan sonra TARGET_FS_CONFIG_GEN değişkenini ayarlayın BoardConfig.mk olarak işaretleyin. Örneğin, device/x/y/BoardConfig.mk, aşağıdakileri ayarlayın:

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

Özel AID'niz artık yeni bir derlemede sistem tarafından genel olarak kullanılabilir.

OEM AID'leri kullanın

OEM AID kullanmak için C kodunuza ilişkilendirilmiş oemaids_headers Makefile oluşturup #include "generated_oem_aid.h" ekleyin, ardından beyan edilen dosyayı kullanmaya başlayın tanımlayıcılar. Örneğin, my_file.c için aşağıdakileri ekleyin:

#include "generated_oem_aid.h"
…

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

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

header_libs: ["oemaids_headers"],

Android.mk dosyası kullanıyorsanız şunları ekleyin:

LOCAL_HEADER_LIBRARIES := oemaids_headers

Kolay anlaşılır adlar kullanın

Android 9'da, istediğiniz herhangi bir cihazın kolay adını AID adlarını destekleyen bir arayüz görürsünüz. Örnek:

  • some/init.rc komutunda chown komutunda:
    chown vendor_foo /vendor/some/vendor_foo/file
    
  • some/init.rc bölgesindeki bir service içinde:
    service vendor_foo /vendor/bin/foo_service
        user vendor_foo
        group vendor_foo
    

Kolay addan uid'ye dahili eşleme, Tedarikçi firma /vendor/etc/passwd ve /vendor/etc/group bölümünün eklenmesi gerekir.

Ortak adları ilişkilendir

Android 9, bir yerine gerçek OEM AID değerini girin. Sayısal olmayan bir dize kullanabilirsiniz kullanıcı ve grup için bağımsız değişkenler, yani "vendor_foo" yerine "2901".

AID'den kolay adlara dönüştür

Örneğin, OEM AID'leri, Android 8.x sürümü, getpwnam ve benzer işlevlerle oem_####, as getpwnam ile aramaları işleyen yerlerde (örneğin, init komut dosyası). Android 9'da şunları yapabilirsiniz: Bionic'teki getpwnam ve getgrnam arkadaşlarını şunun için kullan: uygun adlara (AID'ler) dönüştürmenize yardımcı olabilir.

Dosya sistemi özelliklerini kullan

Dosya sistemi özelliklerini etkinleştirmek için config.fs dosyası yükleyin. Ö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 değerini söz konusu dosyayı BoardConfig.mk olarak tanımlar. Örneğin, device/x/y/BoardConfig.mk, aşağıdakileri ayarlayın:

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

vendor_foo hizmeti yürütüldüğünde başlar CAP_SYS_ADMIN ve CAP_SYS_NICE özellikleriyle setuid ve setgid araması olmadan. Ayrıca, vendor_foo hizmetinin SELinux politikası artık geçerli değil setuid ve setgid kapasitesine ihtiyaç vardır ve silindi.

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

Android 6.0, fs_config yerini ve ilişkili yapıyı değiştirdi tanımlar (system/core/include/private/android_filesystem_config.h) - system/core/libcutils/fs_config.c veya şuna yüklenen ikili program dosyaları tarafından geçersiz kılındı: /system/etc/fs_config_dirs ve /system/etc/fs_config_files. Ayrı eşleştirme ve ayrıştırma kullanma dizinler ve dosyalar için kurallar (ek glob ifadeleri kullanabilir) Android'in dizinleri ve dosyaları iki farklı tabloda işlemesini sağladı. system/core/libcutils/fs_config.c dilindeki yapı tanımları dizinlerin ve dosyaların yalnızca çalışma zamanında okunmasına izin verdi, ancak ana makine oluşturmak için derleme sırasında aynı dosyaları ${OUT}/system/etc/fs_config_dirs ve ${OUT}/system/etc/fs_config_files.

Dosya sistemini genişletmenin geçersiz kılma yönteminin yerini modüler yapılandırma sistemini kullanmaktan sorumlu olduğunuzda, yöntemini de kullanabilirsiniz. Aşağıdaki bölümlerde, reklam öğesinin nasıl oluşturulacağı ve dahil edileceği dosyaları geçersiz kılma ve dosya sistemini yapılandırma.

Geçersiz kılma dosyaları oluşturma

Uyumlu ikili dosyalar oluşturabilirsiniz. /system/etc/fs_config_dirs ve /system/etc/fs_config_files build/tools/fs_config aracındaki fs_config_generate aracı İlgili içeriği oluşturmak için kullanılan araç bir libcutils kitaplık işlevi kullanıyor (fs_config_generate()) DAC gereksinimlerini tampon olarak yönetmek için ve DAC kurallarını kurumsalleştirmek için bir dahil etme dosyası kurallarını tanımlar.

Kullanmak için device/vendor/device/android_filesystem_config.h. işlevi görür. Dosya, structure fs_path_config biçimi şurada tanımlanıyor: system/core/include/private/android_filesystem_config.h dizin ve dosya simgeleri için aşağıdaki yapı başlatma işlemleri:

  • Dizinler için android_device_dirs[] kullanın.
  • Dosyalar için android_device_files[] kullanın.

android_device_dirs[] ve android_device_files[], anahtar kelime, NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS ve NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES (bkz. örnek için geçerlidir). Ayrıca, geçersiz kılmayı da Jamboard'da TARGET_ANDROID_FILESYSTEM_CONFIG_H kullanarak dosya zorunlu kılınan temel adı içeren yapılandırma android_filesystem_config.h.

Geçersiz kılma dosyalarını dahil et

Dosya eklemek için PRODUCT_PACKAGES öğesinin içerdiğinden emin olun Bunu yapabilmek için fs_config_dirs ve/veya fs_config_files /system/etc/fs_config_dirs ürününe yükleyin ve Sırasıyla /system/etc/fs_config_files. Derleme sistemi içinde özel android_filesystem_config.h araması BoardConfig.mk özelliğinin bulunduğu $(TARGET_DEVICE_DIR). Bu dosya başka bir yerde mevcutsa pano yapılandırması değişkenini ayarlayın TARGET_ANDROID_FILESYSTEM_CONFIG_H tuşlarına basarak bu konumu görebilirsiniz.

Dosya sistemini yapılandırma

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

  1. $(TARGET_DEVICE_DIR)/android_filesystem_config.h oluşturun dosyası olarak kaydedebilirsiniz.
  2. fs_config_dirs ve/veya fs_config_files ekleyin: PRODUCT_PACKAGES anakart yapılandırma dosyasına (ör. $(TARGET_DEVICE_DIR)/device.mk) bilgileri gösterilir.

Geçersiz kılma örneği

Bu örnekte, system/bin/glgps politikasını geçersiz kılmak için bir yama gösterilmektedir uyanık kalma kilidi desteği eklemek için arka plan device/vendor/device dizini. Şunu sakla: şunları göz önünde bulundurun:

  • Her yapı girişi; mode, uid, gid, özellikler ve addır. system/core/include/private/android_filesystem_config.h #defines manifest dosyasını sağlamak için otomatik olarak eklenir (AID_ROOT, AID_SHELL, CAP_BLOCK_SUSPEND) tıklayın.
  • android_device_files[] bölümünde şunlara yönelik bir işlem yer alır: Belirtilmediğinde system/etc/fs_config_dirs erişimini gizle, Bu, dizin için içerik eksikliğine karşı ek bir DAC koruması işlevi görür geçersiz kılma işlemlerini yapabilirsiniz. Ancak bu, zayıf bir korumadır. herhangi birinin kontrolü sizdeyse /system, 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 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)

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

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

  • Bazı özellikleri, yapıları ve satır içi tanımları kaldırır.
  • Doğrudan çalıştırmak yerine libcutils öğesine referans gerektirir system/core/include/private/android_filesystem_config.h başlangıç fiyatıyla. Dosya için system/code/include/private_filesystem_config.h veya dizin yapıları veya fs_config, libcutils eklemelidir bağımlılıklarını belirleyebilirsiniz.
  • system/core/include/private/android_filesystem_config.h Mevcut hedeflerde taşınacak fazladan içerik device/vendor/device/android_filesystem_config.h.
  • SELinux Zorunlu Erişim Denetimleri'ni (MAC) yapılandırma dosyalarını, hedef sistemde bulunan özel yapılandırma dosyalarını fs_config() kullanılarak yürütülebilir öğelerin hedeflenmesi, erişimin sağlandığından emin olmalıdır.