Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Kiểm soát truy cập tùy ý (DAC)

Các đối tượng và dịch vụ hệ thống tập tin được thêm vào bản dựng thường cần các ID riêng biệt, duy nhất, được gọi là ID Android (AID). Hiện tại, nhiều tài nguyên như tệp và dịch vụ sử dụng AID cốt lõi (do Android xác định) một cách không cần thiết; trong nhiều trường hợp, bạn có thể sử dụng AID OEM (do OEM xác định) để thay thế.

Phiên bản trước của Android (Android 7.x và hạ thấp) mở rộng cơ chế AIDs sử dụng một thiết bị cụ thể android_filesystem_config.h tập tin để xác định khả năng hệ thống tập tin và / hoặc tùy chỉnh OEM AIDS. Tuy nhiên, hệ thống này không trực quan vì nó không hỗ trợ sử dụng tên đẹp cho AID OEM, yêu cầu bạn chỉ định số thô cho trường người dùng và nhóm mà không có cách nào để liên kết tên thân thiện với AID số.

Các phiên bản Android mới hơn (Android 8.0 trở lên) hỗ trợ một phương pháp mới để mở rộng khả năng của hệ thống tệp. Phương pháp mới này hỗ trợ những điều sau:

  • Nhiều vị trí nguồn cho tệp cấu hình (cho phép cấu hình bản dựng có thể mở rộng).
  • Kiểm tra sự tỉnh táo trong thời gian xây dựng của các giá trị AID OEM.
  • Tạo tiêu đề OEM AID tùy chỉnh có thể được sử dụng trong các tệp nguồn nếu cần.
  • Liên kết tên thân thiện với giá trị OEM AID thực tế. Hỗ trợ các đối số chuỗi không phải số cho người dùng và nhóm, tức là "foo" thay vì "2901".

Cải tiến bổ sung bao gồm việc loại bỏ các android_ids[] array từ system/core/libcutils/include/private/android_filesystem_config.h . Mảng này ngay bây giờ tồn tại trong Bionic là một mảng được tạo ra hoàn toàn tư nhân, với accessors qua getpwnam()getgrnam() . (Điều này có tác dụng phụ của sản xuất nhị phân ổn định như AIDs lõi được sửa đổi.) Đối với dụng cụ và một tập tin README với biết thêm chi tiết, hãy tham khảo build/make/tools/fs_config .

Thêm ID Android (AID)

Android 8.0 loại bỏ các android_ids[] mảng từ các dự án mã nguồn mở Android (AOSP). Tất cả các tên AID thân thiện đang thay vì tạo ra từ các system/core/libcutils/include/private/android_filesystem_config.h tập tin tiêu đề khi tạo Bionic android_ids[] mảng. Bất kỳ define phù hợp với AID_* được chọn của các dụng cụ và * trở thành tên chữ thường.

Ví dụ, trong private/android_filesystem_config.h :

#define AID_SYSTEM 1000

Trở thành:

  • Tên thân thiện: hệ thống
  • uid: 1000
  • gid: 1000

Để thêm một AID AOSP lõi mới, chỉ cần thêm #define đến android_filesystem_config.h tập tin tiêu đề. AID sẽ được tạo khi xây dựng và có sẵn cho các giao diện sử dụng đối số người dùng và nhóm. Công cụ xác nhận AID mới không nằm trong phạm vi APP hoặc OEM; nó cũng tôn trọng các thay đổi đối với các phạm vi đó và sẽ tự động định cấu hình lại trên các thay đổi hoặc phạm vi OEM mới dành riêng.

Định cấu hình AID

Để kích hoạt cơ chế AIDs mới, bộ TARGET_FS_CONFIG_GEN trong BoardConfig.mk tập tin. Biến này chứa một danh sách các tệp cấu hình, cho phép bạn nối các tệp khi cần.

Theo quy ước, các file cấu hình sử dụng tên config.fs , nhưng trong thực tế bạn có thể sử dụng bất kỳ tên. config.fs tập tin nằm trong các định dạng ini Python ConfigParser và bao gồm một phần mũ (cho cấu hình khả năng hệ thống tập tin) và một phần AIDs (đối với cấu hình OEM AIDS).

Định cấu hình phần mũ

Phần mũ hỗ trợ thiết lập khả năng hệ thống tập tin trên hệ thống tập tin đối tượng trong xây dựng (hệ thống tập tin riêng của mình cũng phải hỗ trợ chức năng này).

Bởi vì chạy một dịch vụ ổn định như là người chủ trong Android gây ra một Compatibility Test Suite (CTS) thất bại, yêu cầu trước để giữ lại một khả năng trong khi chạy một quá trình hoặc dịch vụ liên quan đến việc thiết lập khả năng sau đó sử dụng setuid / setgid đến một AID thích hợp để chạy. Với mũ, bạn có thể bỏ qua các yêu cầu này và để nhân làm việc đó cho bạn. Khi kiểm soát được giao cho main() , quy trình của bạn đã có khả năng nó cần để dịch vụ của bạn có thể sử dụng một người sử dụng không phải root và nhóm (đây là cách thuận lợi nhất để bắt đầu các dịch vụ ưu tiên).

Phần viết hoa sử dụng cú pháp sau:

Phần Giá trị Sự định nghĩa
[path] Đường dẫn hệ thống tệp để định cấu hình. Một đường dẫn kết thúc bằng / được coi là một dir, nếu không nó là một tệp.

Đây là một lỗi để xác định nhiều phần với cùng [path] trong các tập tin khác nhau. Trong các phiên bản Python <= 3.2, cùng một tệp có thể chứa các phần ghi đè phần trước đó; trong Python 3.2, nó được đặt ở chế độ nghiêm ngặt.
mode Chế độ tệp bát phân Chế độ tệp bát phân hợp lệ gồm ít nhất 3 chữ số. Nếu 3 được chỉ định, nó có tiền tố là 0, chế độ khác được sử dụng nguyên trạng.
user AID_ <người dùng> Hoặc là C define cho một AID hợp lệ hoặc tên thân thiện (ví dụ cả AID_RADIOradio được chấp nhận). Để xác định một AID tùy chỉnh, xem Cấu hình phần AID .
group AID_ <group> Giống như người dùng.
caps mũ lưỡi trai* Tên như khai báo trong bionic/libc/kernel/uapi/linux/capability.h mà không có sự lãnh đạo CAP_ . Cho phép trường hợp hỗn hợp. Mũ cũng có thể là nguyên:
  • nhị phân (0b0101)
  • bát phân (0455)
  • int (42)
  • hex (0xFF)
Phân tách nhiều chữ hoa bằng cách sử dụng khoảng trắng.

Đối với một ví dụ sử dụng, xem Sử dụng khả năng hệ thống tập tin .

Định cấu hình phần AID

Phần AID chứa OEM AID và sử dụng cú pháp sau:

Phần Giá trị Sự định nghĩa
[AID_<name>] Các <name> có thể chứa các ký tự trong tập hợp chữ hoa, chữ số, và dấu gạch dưới. Phiên bản chữ thường được sử dụng làm tên thân thiện. Được tạo ra tập tin tiêu đề cho mã bao gồm sử dụng chính xác các AID_<name> .

Đây là một lỗi để xác định nhiều phần với cùng AID_<name> (case insensitive với các khó khăn tương tự như [path] ).

<name> phải bắt đầu bằng một tên phân vùng để đảm bảo rằng nó không mâu thuẫn với các nguồn khác nhau.
value <số> Chuỗi số kiểu C hợp lệ (hex, bát phân, nhị phân và thập phân).

Đó là một lỗi khi chỉ định nhiều phần với cùng một tùy chọn giá trị.

Tùy chọn giá trị phải được xác định trong phạm vi tương ứng với phân vùng được sử dụng trong <name> . Danh sách các phân vùng hợp lệ và phạm vi tương ứng của họ được định nghĩa trong system/core/libcutils/include/private/android_filesystem_config.h . Các tùy chọn là:
  • Phân vùng nhà cung cấp
    • AID_OEM_RESERVED_START (2900) - AID_OEM_RESERVED_END (2999)
    • AID_OEM_RESERVED_2_START (5000) - AID_OEM_RESERVED_2_END (5999)
  • Phân vùng hệ thống
    • AID_SYSTEM_RESERVED_START (6000) - AID_SYSTEM_RESERVED_END (6499)
  • Phân vùng ODM
    • AID_ODM_RESERVED_START (6500) - AID_ODM_RESERVED_END (6999)
  • Phân vùng sản phẩm
    • AID_PRODUCT_RESERVED_START (7000) - AID_PRODUCT_RESERVED_END (7499)
  • Phân vùng System_ext
    • AID_SYSTEM_EXT_RESERVED_START (7500) - AID_SYSTEM_EXT_RESERVED_END (7999)

Đối với ví dụ sử dụng, nhìn thấy tên AID Xác định OEMSử dụng OEM AIDS .

Các ví dụ sử dụng

Các ví dụ sau trình bày chi tiết cách xác định và sử dụng OEM AID cũng như cách bật các khả năng của hệ thống tệp. Tên OEM AID ([tên AID_]) phải bắt đầu bằng một tên phân vùng như "vendor_" để đảm bảo chúng không xung đột với tên AOSP trong tương lai hoặc phân vùng khác.

Xác định tên AID OEM

Để xác định một OEM AID, tạo một config.fs tập tin và thiết lập giá trị AID. Ví dụ, trong device/x/y/config.fs , thiết lập như sau:

[AID_VENDOR_FOO]
value: 2900

Sau khi tạo tập tin, thiết lập các TARGET_FS_CONFIG_GEN biến và trỏ đến nó trong BoardConfig.mk . Ví dụ, trong device/x/y/BoardConfig.mk , thiết lập những điều sau đây:

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

AID tùy chỉnh của bạn hiện có thể được hệ thống sử dụng rộng rãi trên một bản dựng mới.

Sử dụng AID OEM

Để sử dụng một OEM AID, trong mã C của bạn, bao gồm các oemaids_headers trong Makefile liên quan đến bạn, và add #include "generated_oem_aid.h" , sau đó bắt đầu sử dụng định danh công bố. Ví dụ, trong my_file.c , thêm những điều sau đây:

#include "generated_oem_aid.h"
…

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

Trong liên quan của bạn Android.bp tập tin, thêm những điều sau đây:

header_libs: ["oemaids_headers"],

Nếu bạn đang sử dụng một Android.mk tập tin, sau đó thêm những điều sau đây:

LOCAL_HEADER_LIBRARIES := oemaids_headers

Sử dụng tên thân thiện

Trong Android 9, bạn có thể sử dụng tên thân thiện cho bất kỳ giao diện nào hỗ trợ tên AID. Ví dụ:

  • Trong một chown lệnh trong some/init.rc :
    chown vendor_foo /vendor/some/vendor_foo/file
    
  • Trong một service trong some/init.rc :
    service vendor_foo /vendor/bin/foo_service
        user vendor_foo
        group vendor_foo
    

Bởi vì các bản đồ nội bộ từ tên thân thiện với uid được thực hiện bởi /vendor/etc/passwd/vendor/etc/group , phân vùng cung cấp phải được gắn kết.

Liên kết tên thân thiện

Android 9 bao gồm hỗ trợ liên kết tên thân thiện với giá trị OEM AID thực tế. Bạn có thể sử dụng đối số chuỗi không phải số cho người dùng và nhóm, tức là "vendor_ foo" thay cho "2901".

Chuyển đổi từ AID sang tên thân thiện

Đối với OEM AIDs , Android 8.x yêu cầu sử dụng của oem_#### với getpwnam và chức năng tương tự, cũng như ở những nơi mà xử lý tra cứu qua getpwnam (như init script). Trong Android 9, bạn có thể sử dụng getpwnamgetgrnam bạn bè trong Bionic để chuyển đổi từ Android ID (AIDS) với tên thân thiện và ngược lại.

Sử dụng các khả năng của hệ thống tệp

Để kích hoạt tính năng hệ thống tập tin, tạo ra một phần mũ trong config.fs tập tin. Ví dụ, trong device/x/y/config.fs , thêm phần sau:

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

Sau khi tạo tập tin, thiết lập các TARGET_FS_CONFIG_GEN để trỏ đến tập tin đó trong BoardConfig.mk . Ví dụ, trong device/x/y/BoardConfig.mk , thiết lập những điều sau đây:

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

Khi dịch vụ vendor_ foo được thực thi, nó bắt đầu với khả năng CAP_SYS_ADMINCAP_SYS_NICE mà không setuidsetgid cuộc gọi. Bên cạnh đó, vendor_ foo chính sách SELinux dịch vụ không còn cần khả năng setuidsetgid và có thể bị xóa.

Định cấu hình ghi đè (Android 6.x-7.x)

Android 6.0 di dời fs_config và định nghĩa cấu trúc liên quan ( system/core/include/private/android_filesystem_config.h ) để system/core/libcutils/fs_config.c nơi họ có thể được cập nhật hoặc ghi đè bởi các tập tin nhị phân được cài đặt trong /system/etc/fs_config_dirs/system/etc/fs_config_files . Việc sử dụng các quy tắc đối sánh và phân tích cú pháp riêng biệt cho các thư mục và tệp (có thể sử dụng các biểu thức toàn cầu bổ sung) đã cho phép Android xử lý các thư mục và tệp trong hai bảng khác nhau. Định nghĩa cấu trúc trong system/core/libcutils/fs_config.c không chỉ cho phép thời gian chạy đọc file và thư mục, nhưng chủ nhà có thể sử dụng các tập tin tương tự trong thời gian xây dựng hình ảnh hệ thống tập tin cấu trúc như ${OUT}/system/etc/fs_config_dirs${OUT}/system/etc/fs_config_files .

Mặc dù phương pháp ghi đè mở rộng hệ thống tệp đã được thay thế bằng hệ thống cấu hình mô-đun được giới thiệu trong Android 8.0, bạn vẫn có thể sử dụng phương pháp cũ nếu muốn. Các phần sau trình bày chi tiết cách tạo và bao gồm các tệp ghi đè và định cấu hình hệ thống tệp.

Tạo tệp ghi đè

Bạn có thể tạo ra các liên kết nhị phân file /system/etc/fs_config_dirs/system/etc/fs_config_files sử dụng fs_config_generate công cụ trong build/tools/fs_config . Công cụ này sử dụng một libcutils chức năng thư viện ( fs_config_generate() ) để quản lý các yêu cầu DAC vào một bộ đệm và định nghĩa quy tắc cho một bao gồm tập tin để thể chế hóa các quy tắc DAC.

Để sử dụng, tạo ra một bao gồm tập tin trong device/ vendor / device /android_filesystem_config.h hoạt động như ghi đè. Các tập tin phải sử dụng các structure fs_path_config định dạng được định nghĩa trong system/core/include/private/android_filesystem_config.h với khởi tạo cấu trúc sau đây cho thư mục và tập tin biểu tượng:

  • Đối với thư mục, sử dụng android _device _dirs[] .
  • Cho các tập tin, sử dụng android _device _files[] .

Khi không sử dụng android_device_dirs[]android_device_files[] , bạn có thể xác định NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRSNO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES (xem ví dụ dưới đây). Bạn cũng có thể chỉ định các tập tin ghi đè bằng TARGET_ANDROID_FILESYSTEM_CONFIG_H trong cấu hình bảng, với basename thi hành của android_filesystem_config.h .

Bao gồm các tệp ghi đè

Để đưa các file, đảm bảo rằng PRODUCT_PACKAGES bao gồm fs_config_dirs và / hoặc fs_config_files để nó có thể cài đặt chúng vào /system/etc/fs_config_dirs/system/etc/fs_config_files , tương ứng. Các tìm kiếm xây dựng hệ thống tùy chỉnh android_filesystem_config.h trong $(TARGET_DEVICE_DIR) , nơi BoardConfig.mk tồn tại. Nếu file này tồn tại ở nơi khác, bộ biến bảng cấu hình TARGET_ANDROID_FILESYSTEM_CONFIG_H để trỏ đến vị trí đó.

Định cấu hình hệ thống tệp

Để định cấu hình hệ thống tệp trong Android 6.0 trở lên:

  1. Tạo $(TARGET_DEVICE_DIR)/android_filesystem_config.h tập tin.
  2. Thêm fs_config_dirs và / hoặc fs_config_files để PRODUCT_PACKAGES trong file cấu hình bảng (ví dụ: $(TARGET_DEVICE_DIR)/device.mk ).

Ghi đè ví dụ

Ví dụ này cho thấy một bản vá cho trọng các system/bin/glgps daemon để hỗ trợ thêm khóa trỗi dậy trong device/ vendor / device thư mục. Hãy ghi nhớ những điều sau:

  • Mỗi mục cấu trúc là chế độ, uid, gid, khả năng và tên. system/core/include/private/android_filesystem_config.h được bao gồm tự động để cung cấp các # định nghĩa manifest ( AID_ROOT , AID_SHELL , CAP_BLOCK_SUSPEND ).
  • Các android_device_files[] phần bao gồm một hành động để truy cập suppress để system/etc/fs_config_dirs khi không xác định, phục vụ như là thêm một bảo vệ DAC vì thiếu nội dung cho ghi đè thư mục. Tuy nhiên, đây là khả năng bảo vệ yếu; nếu ai đó có quyền kiểm soát /system , họ thường có thể làm bất cứ điều gì họ muốn.
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)

Di chuyển hệ thống tệp từ các bản phát hành trước đó

Khi di chuyển hệ thống tệp từ Android 5.x trở về trước, hãy nhớ rằng Android 6.x

  • Loại bỏ một số bao gồm, cấu trúc và định nghĩa nội tuyến.
  • Đòi hỏi một tham chiếu đến libcutils thay vì chạy trực tiếp từ system/core/include/private/android_filesystem_config.h . Sản xuất thiết bị thực thi riêng mà phụ thuộc vào system/code/include/private_filesystem_config.h cho các tập tin hoặc thư mục cấu trúc hoặc fs_config phải thêm libcutils phụ thuộc thư viện.
  • Đòi hỏi nhà sản xuất thiết bị sao chép chi nhánh riêng của system/core/include/private/android_filesystem_config.h với nội dung thêm vào các mục tiêu hiện có để chuyển sang device/ vendor / device /android_filesystem_config.h .
  • Dự trữ quyền để áp dụng SELinux điều khiển truy cập bắt buộc (MAC) cho các file cấu hình trên hệ thống mục tiêu, triển khai bao gồm thực thi mục tiêu tùy chỉnh sử dụng fs_config() phải đảm bảo tiếp cận.