Trang này mô tả cách Android xử lý các vấn đề về khả năng tương thích chính sách với các bản cập nhật nền tảng không dây (OTA), trong đó các chế độ cài đặt SELinux mới của nền tảng có thể khác với các chế độ cài đặt SELinux cũ của nhà cung cấp.
Quyền sở hữu và gắn nhãn đối tượng
Bạn phải xác định rõ quyền sở hữu cho từng đối tượng để tách biệt chính sách của nền tảng và nhà cung cấp. Ví dụ: nếu nhãn chính sách của nhà cung cấp /dev/foo
và nhãn chính sách của nền tảng /dev/foo
trong một OTA tiếp theo, thì sẽ có hành vi không xác định như bị từ chối ngoài dự kiến hoặc nghiêm trọng hơn là lỗi khởi động. Đối với SELinux, điều này biểu hiện dưới dạng xung đột về việc gắn nhãn. Nút thiết bị chỉ có thể có một nhãn duy nhất phân giải thành bất kỳ nhãn nào được áp dụng sau cùng.
Kết quả là:
- Các quy trình cần có quyền truy cập vào nhãn không được áp dụng sẽ mất quyền truy cập vào tài nguyên.
- Các quy trình có quyền truy cập vào tệp có thể bị gián đoạn vì nút thiết bị không chính xác đã được tạo.
Xung đột giữa nhãn nền tảng và nhãn nhà cung cấp có thể xảy ra đối với mọi đối tượng có nhãn SELinux, bao gồm cả thuộc tính, dịch vụ, quy trình, tệp và ổ cắm. Để tránh những vấn đề này, hãy xác định rõ quyền sở hữu của các đối tượng này.
Không gian tên loại/thuộc tính
Ngoài các xung đột về nhãn, tên thuộc tính và loại SELinux cũng có thể xung đột. SELinux không cho phép khai báo nhiều lần cùng một loại và thuộc tính. Một chính sách có các khai báo trùng lặp sẽ không biên dịch được. Để tránh xảy ra xung đột về loại và tên thuộc tính, bạn nên bắt đầu tất cả các khai báo của nhà cung cấp bằng tiền tố vendor_
. Ví dụ: nhà cung cấp nên sử dụng type vendor_foo, domain;
thay vì type foo, domain;
.
Quyền sở hữu tệp
Việc ngăn chặn xung đột cho các tệp là một thách thức vì cả chính sách của nền tảng và nhà cung cấp đều thường cung cấp nhãn cho tất cả các hệ thống tệp. Không giống như việc đặt tên loại, việc đặt không gian tên cho các tệp không thực tế vì nhiều tệp trong số đó được tạo bởi nhân. Để ngăn chặn những xung đột này, hãy làm theo hướng dẫn đặt tên cho hệ thống tệp trong phần này. Đối với Android 8.0, đây là những đề xuất không có biện pháp thực thi về kỹ thuật. Trong tương lai, những đề xuất này sẽ được thực thi bằng Vendor Test Suite (VTS).
Hệ thống (/system)
Chỉ hình ảnh hệ thống mới phải cung cấp nhãn cho các thành phần /system
thông qua file_contexts
, service_contexts
, v.v. Nếu nhãn cho các thành phần /system
được thêm vào chính sách của nhà cung cấp, thì có thể không thực hiện được bản cập nhật OTA chỉ dành cho khung.
Nhà cung cấp (/vendor)
Chính sách SELinux của AOSP đã gắn nhãn các phần của phân vùng vendor
mà nền tảng tương tác. Điều này cho phép viết các quy tắc SELinux cho các quy trình của nền tảng để có thể giao tiếp hoặc truy cập vào các phần của phân vùng vendor
. Ví dụ:
/đường dẫn nhà cung cấp | Nhãn do nền tảng cung cấp | Quy trình của nền tảng tuỳ thuộc vào nhãn |
---|---|---|
/vendor(/.*)?
|
vendor_file
|
Tất cả ứng dụng HAL trong khung, ueventd , v.v.
|
/vendor/framework(/.*)?
|
vendor_framework_file
|
dex2oat , appdomain , v.v.
|
/vendor/app(/.*)?
|
vendor_app_file
|
dex2oat , installd , idmap , v.v.
|
/vendor/overlay(/.*)
|
vendor_overlay_file
|
system_server , zygote , idmap , v.v.
|
Do đó, bạn phải tuân theo các quy tắc cụ thể (được thực thi thông qua neverallows
) khi gắn nhãn các tệp bổ sung trong phân vùng vendor
:
vendor_file
phải là nhãn mặc định cho tất cả các tệp trong phân vùngvendor
. Chính sách nền tảng yêu cầu điều này để truy cập vào các chế độ triển khai HAL truyền qua.- Tất cả
exec_types
mới được thêm vào phân vùngvendor
thông qua chính sách của nhà cung cấp đều phải có thuộc tínhvendor_file_type
. Việc này được thực thi thông qua neverallows. - Để tránh xung đột với các bản cập nhật nền tảng/khung trong tương lai, hãy tránh gắn nhãn cho các tệp khác ngoài
exec_types
trong phân vùngvendor
. - Tất cả các phần phụ thuộc thư viện cho các HAL cùng quy trình do AOSP xác định đều phải được gắn nhãn là
same_process_hal_file.
Procfs (/proc)
Bạn chỉ có thể gắn nhãn cho các tệp trong /proc
bằng nhãn genfscon
. Trong Android 7.0, cả nền tảng và chính sách nhà cung cấp đều dùng genfscon
để gắn nhãn cho các tệp trong procfs
.
Đề xuất: Chỉ có nhãn chính sách nền tảng /proc
.
Nếu các quy trình của nhà cung cấp cần truy cập vào các tệp trong /proc
hiện được gắn nhãn bằng nhãn mặc định (proc
), thì chính sách của nhà cung cấp không được gắn nhãn rõ ràng cho các tệp đó mà thay vào đó phải sử dụng loại proc
chung để thêm các quy tắc cho miền của nhà cung cấp. Điều này cho phép các bản cập nhật nền tảng điều chỉnh các giao diện hạt nhân trong tương lai được hiển thị thông qua procfs
và gắn nhãn rõ ràng cho các giao diện đó khi cần.
Debugfs (/sys/kernel/debug)
Debugfs
có thể được gắn nhãn trong cả file_contexts
và genfscon
. Trong Android 7.0 đến Android 10, cả nhãn nền tảng và nhà cung cấp đều là debugfs
.
Trong Android 11, bạn không thể truy cập hoặc gắn debugfs
trên các thiết bị sản xuất. Nhà sản xuất thiết bị nên xoá debugfs
.
Tracefs (/sys/kernel/debug/tracing)
Tracefs
có thể được gắn nhãn trong cả file_contexts
và genfscon
. Trong Android 7.0, chỉ có nhãn nền tảng tracefs
.
Đề xuất: Chỉ nền tảng mới có thể gắn nhãn tracefs
.
Sysfs (/sys)
Bạn có thể gắn nhãn cho các tệp trong /sys
bằng cả file_contexts
và genfscon
. Trong Android 7.0, cả nền tảng và nhà cung cấp đều sử dụng genfscon
để gắn nhãn cho các tệp trong sysfs
.
Đề xuất: Nền tảng có thể gắn nhãn cho các nút sysfs
không dành riêng cho thiết bị. Nếu không, chỉ nhà cung cấp mới có thể gắn nhãn tệp.
tmpfs (/dev)
Các tệp trong /dev
có thể được gắn nhãn trong file_contexts
. Trong Android 7.0, cả nền tảng và tệp nhãn của nhà cung cấp đều ở đây.
Đề xuất: Nhà cung cấp chỉ có thể gắn nhãn cho các tệp trong /dev/vendor
(ví dụ: /dev/vendor/foo
, /dev/vendor/socket/bar
).
Rootfs (/)
Các tệp trong /
có thể được gắn nhãn trong file_contexts
. Trong Android 7.0, cả tệp nhãn nền tảng và nhà cung cấp đều ở đây.
Đề xuất: Chỉ hệ thống mới có thể gắn nhãn cho các tệp trong /
.
Dữ liệu (/data)
Dữ liệu được gắn nhãn thông qua sự kết hợp giữa file_contexts
và seapp_contexts
.
Đề xuất: Không cho phép việc gắn nhãn của nhà cung cấp ở bên ngoài /data/vendor
. Chỉ nền tảng mới có thể gắn nhãn cho các phần khác của /data
.
Phiên bản nhãn Genfs
Bắt đầu từ cấp độ API của nhà cung cấp 202504, các nhãn SELinux mới hơn được chỉ định bằng genfscon
trong system/sepolicy/compat/plat_sepolicy_genfs_ver.cil
là không bắt buộc đối với các phân vùng vendor
cũ hơn. Điều này cho phép các phân vùng vendor
cũ giữ lại chế độ triển khai SEPolicy hiện có.
Việc này được kiểm soát bằng biến Makefile BOARD_GENFS_LABELS_VERSION
được lưu trữ trong /vendor/etc/selinux/genfs_labels_version.txt
.
Ví dụ:
-
Trong API cấp 202404 của nhà cung cấp, nút
/sys/class/udc
được gắn nhãnsysfs
theo mặc định. -
Kể từ API cấp 202504 của nhà cung cấp,
/sys/class/udc
được gắn nhãnsysfs_udc
.
Tuy nhiên, /sys/class/udc
có thể đang được các phân vùng vendor
sử dụng API cấp 202404, có thể là với nhãn sysfs
mặc định hoặc nhãn dành riêng cho nhà cung cấp. Việc gắn nhãn /sys/class/udc
là sysfs_udc
vô điều kiện có thể làm mất khả năng tương thích với các phân vùng vendor
này. Bằng cách kiểm tra BOARD_GENFS_LABELS_VERSION
, nền tảng sẽ tiếp tục sử dụng các nhãn và quyền trước đó cho các phân vùng vendor
cũ hơn.
BOARD_GENFS_LABELS_VERSION
có thể lớn hơn hoặc bằng cấp độ API của nhà cung cấp. Ví dụ: các phân vùng vendor
sử dụng API cấp 202404 có thể đặt BOARD_GENFS_LABELS_VERSION
thành 202504 để áp dụng các nhãn mới được giới thiệu trong 202504. Xem danh sách
nhãn genfs dành riêng cho 202504.
Khi gắn nhãn các nút genfscon
, nền tảng phải xem xét các phân vùng vendor
cũ hơn và triển khai các cơ chế dự phòng để đảm bảo khả năng tương thích khi cần. Nền tảng có thể sử dụng các thư viện chỉ dành cho nền tảng để truy vấn phiên bản nhãn genfs.
-
Trên nền tảng gốc, hãy sử dụng
libgenfslabelsversion
. Hãy xemgenfslabelsversion.h
để biết tệp tiêu đề củalibgenfslabelsversion
. -
Trên Java, hãy sử dụng
android.os.SELinux.getGenfsLabelsVersion()
.
Chính sách công của nền tảng
Chính sách SELinux của nền tảng được chia thành chính sách riêng tư và công khai. Chính sách công khai của nền tảng bao gồm các loại và thuộc tính luôn có sẵn cho cấp API của nhà cung cấp, đóng vai trò là API giữa nền tảng và nhà cung cấp. Chính sách này được cung cấp cho người viết chính sách của nhà cung cấp để cho phép nhà cung cấp tạo tệp chính sách của nhà cung cấp. Khi kết hợp với chính sách riêng tư của nền tảng, chính sách này sẽ tạo ra một chính sách hoạt động đầy đủ cho thiết bị. Chính sách công khai của nền tảng được xác định trong system/sepolicy/public
.
Ví dụ: loại vendor_init
, đại diện cho quy trình khởi động trong bối cảnh của nhà cung cấp, được xác định trong system/sepolicy/public/vendor_init.te
:
type vendor_init, domain;
Nhà cung cấp có thể tham khảo loại vendor_init
để viết các quy tắc chính sách tuỳ chỉnh:
# Allow vendor_init to set vendor_audio_prop in vendor's init scripts
set_prop(vendor_init, vendor_audio_prop)
Thuộc tính về khả năng tương thích
Chính sách SELinux là một hoạt động tương tác giữa các loại nguồn và đích cho các lớp đối tượng và quyền cụ thể. Mỗi đối tượng (ví dụ: quy trình, tệp) chịu ảnh hưởng của chính sách SELinux chỉ có thể có một loại, nhưng loại đó có thể có nhiều thuộc tính.
Chính sách này chủ yếu được viết theo các loại hiện có. Trong đó, cả vendor_init
và debugfs
đều là các loại:
allow vendor_init debugfs:dir { mounton };
Điều này có hiệu quả vì chính sách được viết dựa trên kiến thức về tất cả các loại. Tuy nhiên, nếu chính sách của nhà cung cấp và chính sách của nền tảng sử dụng các loại cụ thể, đồng thời nhãn của một đối tượng cụ thể chỉ thay đổi trong một trong các chính sách đó, thì chính sách còn lại có thể chứa chính sách đã có hoặc mất quyền truy cập mà trước đây đã dựa vào. Ví dụ: giả sử các nút sysfs của nhãn chính sách nền tảng là sysfs
:
/sys(/.*)? u:object_r:sysfs:s0
Chính sách của nhà cung cấp cấp quyền truy cập vào /sys/usb
, được gắn nhãn là sysfs
:
allow vendor_init sysfs:chr_file rw_file_perms;
Nếu chính sách nền tảng thay đổi thành nhãn /sys/usb
là sysfs_usb
, thì chính sách của nhà cung cấp vẫn giữ nguyên, nhưng vendor_init
sẽ mất quyền truy cập vào /sys/usb
do thiếu chính sách cho loại sysfs_usb
mới:
/sys/usb u:object_r:sysfs_usb:s0
Để giải quyết vấn đề này, Android giới thiệu khái niệm về các thuộc tính có phiên bản. Vào thời gian biên dịch, hệ thống bản dựng sẽ tự động dịch các loại công khai của nền tảng được dùng trong chính sách của nhà cung cấp thành các thuộc tính có phiên bản này. Bản dịch này được bật bằng cách ánh xạ các tệp liên kết một thuộc tính có phiên bản với một hoặc nhiều loại công khai trên nền tảng.
Ví dụ: giả sử /sys/usb
được gắn nhãn là sysfs
trong chính sách nền tảng 202504 và chính sách của nhà cung cấp 202504 cấp quyền truy cập vendor_init
vào /sys/usb
. Trong trường hợp này:
-
Chính sách của nhà cung cấp viết một quy tắc
allow vendor_init sysfs:chr_file rw_file_perms;
, vì/sys/usb
được gắn nhãn làsysfs
trong chính sách nền tảng 202504. Khi hệ thống bản dựng biên dịch chính sách của nhà cung cấp, hệ thống sẽ tự động dịch quy tắc thànhallow vendor_init_202504 sysfs_202504:chr_file rw_file_perms;
. Các thuộc tínhvendor_init_202504
vàsysfs_202504
tương ứng với các loạivendor_init
vàsysfs
. Đây là các loại do nền tảng xác định. -
Hệ thống xây dựng sẽ tạo một tệp ánh xạ danh tính
/system/etc/selinux/mapping/202504.cil
. Vì cả phân vùngsystem
vàvendor
đều sử dụng cùng một phiên bản202504
, nên tệp liên kết chứa các mối liên kết danh tính từtype_202504
đếntype
. Ví dụ:vendor_init_202504
được liên kết vớivendor_init
vàsysfs_202504
được liên kết vớisysfs
:(typeattributeset sysfs_202504 (sysfs)) (typeattributeset vendor_init_202504 (vendor_init)) ...
Khi phiên bản được tăng từ 202504 lên 202604, một tệp ánh xạ mới cho các phân vùng 202504 vendor
sẽ được tạo trong system/sepolicy/private/compat/202504/202504.cil
, được cài đặt vào /system/etc/selinux/mapping/202504.cil
cho các phân vùng 202604 trở lên system
. Ban đầu, tệp ánh xạ này chứa các ánh xạ nhận dạng, như đã mô tả trước đó. Nếu một nhãn mới sysfs_usb
cho /sys/usb
được thêm vào chính sách nền tảng 202604, thì tệp ánh xạ sẽ được cập nhật để ánh xạ sysfs_202504
với sysfs_usb
:
(typeattributeset sysfs_202504 (sysfs sysfs_usb)) (typeattributeset vendor_init_202504 (vendor_init)) ...
Bản cập nhật này cho phép quy tắc chính sách của nhà cung cấp đã chuyển đổi allow
vendor_init_202504 sysfs_202504:chr_file rw_file_perms;
tự động cấp quyền truy cập vendor_init
vào loại sysfs_usb
mới.
Để duy trì khả năng tương thích với các phân vùng vendor
cũ, bất cứ khi nào một loại công khai mới được thêm vào, loại đó phải được ánh xạ đến ít nhất một trong các thuộc tính có phiên bản trong tệp ánh xạ system/sepolicy/private/compat/ver/ver.cil
hoặc được liệt kê trong system/sepolicy/private/compat/ver/ver.ignore.cil
để cho biết rằng không có loại nào khớp trong các phiên bản nhà cung cấp trước đó.
Sự kết hợp giữa chính sách nền tảng, chính sách của nhà cung cấp và tệp ánh xạ cho phép hệ thống cập nhật mà không cần cập nhật chính sách của nhà cung cấp. Ngoài ra, quá trình chuyển đổi thành các thuộc tính có phiên bản sẽ diễn ra tự động, vì vậy, chính sách của nhà cung cấp không cần phải xử lý việc tạo phiên bản, mà vẫn sử dụng các loại công khai như cũ.
chính sách công về hệ thống_ext và sản phẩm
Kể từ Android 11, các phân vùng system_ext
và product
được phép xuất các loại công khai được chỉ định sang phân vùng vendor
. Giống như chính sách công khai của nền tảng, chính sách của nhà cung cấp sử dụng các loại và quy tắc được tự động dịch thành các thuộc tính có phiên bản, ví dụ: từ type
thành type_ver
, trong đó ver là cấp độ API của nhà cung cấp của phân vùng vendor
.
Khi các phân vùng system_ext
và product
dựa trên cùng một phiên bản nền tảng ver, hệ thống xây dựng sẽ tạo các tệp ánh xạ cơ sở thành system_ext/etc/selinux/mapping/ver.cil
và product/etc/selinux/mapping/ver.cil
, chứa các ánh xạ nhận dạng từ type
đến type_ver
.
Chính sách của nhà cung cấp có thể truy cập vào type
bằng thuộc tính có phiên bản type_ver
.
Trong trường hợp chỉ có các phân vùng system_ext
và product
được cập nhật, chẳng hạn như ver thành ver+1 (hoặc sau này), trong khi phân vùng vendor
vẫn ở ver, thì chính sách của nhà cung cấp có thể mất quyền truy cập vào các loại phân vùng system_ext
và product
. Để ngăn chặn sự cố, các phân vùng system_ext
và product
phải cung cấp các tệp ánh xạ từ các loại cụ thể thành các thuộc tính type_ver
. Mỗi đối tác chịu trách nhiệm duy trì các tệp ánh xạ, nếu họ hỗ trợ phân vùng ver vendor
bằng ver+1 (hoặc phiên bản mới hơn) system_ext
và phân vùng product
.
Để cài đặt các tệp ánh xạ vào system_ext
và phân vùng product
, các nhà triển khai thiết bị hoặc nhà cung cấp dự kiến sẽ:
- Sao chép các tệp ánh xạ cơ sở đã tạo từ các phân vùng ver
system_ext
vàproduct
vào cây nguồn của chúng. - Sửa đổi các tệp ánh xạ nếu cần.
-
Cài đặt các tệp ánh xạ vào ver+1 (hoặc phiên bản mới hơn)
system_ext
và các phân vùngproduct
.
Ví dụ: giả sử phân vùng 202504 system_ext
có một loại công khai tên là foo_type
. Sau đó, system_ext/etc/selinux/mapping/202504.cil
trong phân vùng 202504 system_ext
sẽ có dạng như sau:
(typeattributeset foo_type_202504 (foo_type)) (expandtypeattribute foo_type_202504 true) (typeattribute foo_type_202504)
Nếu bar_type
được thêm vào 202604 system_ext
và nếu bar_type
phải được liên kết với foo_type
cho phân vùng 202504 vendor
, thì 202504.cil
có thể được cập nhật từ (typeattributeset foo_type_202504 (foo_type))
thành (typeattributeset foo_type_202504 (foo_type bar_type))
rồi cài đặt vào phân vùng 202604 system_ext
. Phân vùng 202504 vendor
có thể tiếp tục truy cập vào foo_type
và bar_type
của 202604 system_ext
.
Các thay đổi về thuộc tính đối với Android 9
Các thiết bị nâng cấp lên Android 9 có thể sử dụng các thuộc tính sau, nhưng các thiết bị ra mắt với Android 9 thì không được.
Thuộc tính của đối tượng vi phạm
Android 9 có các thuộc tính liên quan đến miền sau:
data_between_core_and_vendor_violators
. Thuộc tính cho tất cả các miền vi phạm yêu cầu không chia sẻ tệp theo đường dẫn giữavendor
vàcoredomains
. Các quy trình của nền tảng và nhà cung cấp không được sử dụng các tệp trên đĩa để giao tiếp (ABI không ổn định). Đề xuất:- Mã nhà cung cấp phải sử dụng
/data/vendor
. - Hệ thống không được sử dụng
/data/vendor
.
- Mã nhà cung cấp phải sử dụng
system_executes_vendor_violators
. Thuộc tính cho tất cả các miền hệ thống (ngoại trừinit
vàshell domains
) vi phạm yêu cầu không thực thi các tệp nhị phân của nhà cung cấp. Việc thực thi các tệp nhị phân của nhà cung cấp có API không ổn định. Nền tảng không được thực thi trực tiếp các tệp nhị phân của nhà cung cấp. Đề xuất:- Các phần phụ thuộc nền tảng như vậy trên các tệp nhị phân của nhà cung cấp phải nằm sau HIDL HAL.
HOẶC
coredomains
cần có quyền truy cập vào các tệp nhị phân của nhà cung cấp sẽ được chuyển sang phân vùngvendor
và do đó, không còn làcoredomain
nữa.
- Các phần phụ thuộc nền tảng như vậy trên các tệp nhị phân của nhà cung cấp phải nằm sau HIDL HAL.
Thuộc tính không đáng tin cậy
Các ứng dụng không đáng tin cậy lưu trữ mã tuỳ ý không được phép truy cập vào các dịch vụ HwBinder, ngoại trừ những dịch vụ được coi là đủ an toàn để truy cập từ các ứng dụng đó (xem các dịch vụ an toàn bên dưới). Sau đây là 2 lý do chính dẫn đến việc này:
- Các máy chủ HwBinder không thực hiện xác thực máy khách vì HIDL hiện không hiển thị thông tin UID của người gọi. Ngay cả khi HIDL hiển thị dữ liệu đó, nhiều dịch vụ HwBinder hoạt động ở cấp độ thấp hơn cấp độ của các ứng dụng (chẳng hạn như HAL) hoặc không được dựa vào danh tính ứng dụng để uỷ quyền. Do đó, để đảm bảo an toàn, giả định mặc định là mọi dịch vụ HwBinder đều coi tất cả các ứng dụng của mình là được uỷ quyền ngang nhau để thực hiện các thao tác do dịch vụ cung cấp.
- Các máy chủ HAL (một nhóm nhỏ các dịch vụ HwBinder) chứa mã có tỷ lệ xảy ra vấn đề bảo mật cao hơn so với các thành phần
system/core
và có quyền truy cập vào các lớp thấp hơn của ngăn xếp (cho đến phần cứng), do đó, làm tăng cơ hội bỏ qua mô hình bảo mật Android.
Dịch vụ an toàn
Các dịch vụ an toàn bao gồm:
same_process_hwservice
. Các dịch vụ này (theo định nghĩa) chạy trong quy trình của ứng dụng và do đó có quyền truy cập tương tự như miền ứng dụng mà quy trình chạy.coredomain_hwservice
. Các dịch vụ này không gây ra rủi ro liên quan đến lý do số 2.hal_configstore_ISurfaceFlingerConfigs
. Dịch vụ này được thiết kế dành riêng cho mọi miền.hal_graphics_allocator_hwservice
. Các thao tác này cũng được cung cấp bởi dịch vụsurfaceflinger
Binder mà các ứng dụng được phép truy cập.hal_omx_hwservice
. Đây là phiên bản HwBinder của dịch vụmediacodec
Binder mà các ứng dụng được phép truy cập.hal_codec2_hwservice
. Đây là phiên bản mới hơn củahal_omx_hwservice
.
Thuộc tính có thể sử dụng
Tất cả hwservices
không được coi là an toàn đều có thuộc tính untrusted_app_visible_hwservice
. Các máy chủ HAL tương ứng có thuộc tính untrusted_app_visible_halserver
. Các thiết bị ra mắt bằng Android 9 KHÔNG ĐƯỢC sử dụng thuộc tính untrusted
.
Việc nên làm:
- Thay vào đó, các ứng dụng không đáng tin cậy sẽ giao tiếp với một dịch vụ hệ thống giao tiếp với HAL HIDL của nhà cung cấp. Ví dụ: các ứng dụng có thể giao tiếp với
binderservicedomain
, sau đómediaserver
(làbinderservicedomain
) lần lượt giao tiếp vớihal_graphics_allocator
.HOẶC
- Những ứng dụng cần truy cập trực tiếp vào HAL
vendor
phải có miền sepolicy do nhà cung cấp xác định riêng.
Thử nghiệm thuộc tính tệp
Android 9 có các kiểm thử thời gian xây dựng để đảm bảo tất cả các tệp ở những vị trí cụ thể đều có các thuộc tính phù hợp (chẳng hạn như tất cả các tệp trong sysfs
đều có thuộc tính sysfs_type
bắt buộc).
Gắn nhãn bối cảnh SELinux
Để hỗ trợ sự khác biệt giữa sepolicy của nền tảng và nhà cung cấp, hệ thống sẽ tạo các tệp ngữ cảnh SELinux theo cách khác để tách biệt chúng.
Ngữ cảnh tệp
Android 8.0 đã giới thiệu những thay đổi sau đối với file_contexts
:
- Để tránh hao tổn thêm chi phí biên dịch trên thiết bị trong quá trình khởi động,
file_contexts
sẽ không tồn tại ở dạng nhị phân. Thay vào đó, chúng là tệp văn bản biểu thức chính quy có thể đọc được, chẳng hạn như{property, service}_contexts
(như trước phiên bản 7.0). file_contexts
được chia thành 2 tệp:plat_file_contexts
- Nền tảng Android
file_context
không có nhãn dành riêng cho thiết bị, ngoại trừ việc gắn nhãn cho các phân vùng/vendor
. Bạn phải gắn nhãn chính xác cho các phân vùng này để đảm bảo các tệp sepolicy hoạt động đúng cách. - Phải nằm trong phân vùng
system
tại/system/etc/selinux/plat_file_contexts
trên thiết bị và đượcinit
tải khi khởi động cùng vớifile_context
của nhà cung cấp.
- Nền tảng Android
vendor_file_contexts
file_context
dành riêng cho thiết bị được tạo bằng cách kết hợpfile_contexts
có trong các thư mục màBOARD_SEPOLICY_DIRS
trỏ đến trong các tệpBoardconfig.mk
của thiết bị.- Phải được cài đặt tại
/vendor/etc/selinux/vendor_file_contexts
trong phân vùngvendor
và đượcinit
tải khi bắt đầu cùng với nền tảngfile_context
.
Ngữ cảnh của thuộc tính
Trong Android 8.0, property_contexts
được chia thành 2 tệp:
plat_property_contexts
- Nền tảng Android
property_context
không có nhãn dành riêng cho thiết bị. - Phải nằm trong phân vùng
system
tại/system/etc/selinux/plat_property_contexts
và đượcinit
tải khi bắt đầu cùng vớiproperty_contexts
của nhà cung cấp.
- Nền tảng Android
vendor_property_contexts
property_context
dành riêng cho thiết bị được tạo bằng cách kết hợpproperty_contexts
có trong các thư mục màBOARD_SEPOLICY_DIRS
trỏ đến trong các tệpBoardconfig.mk
của thiết bị.- Phải nằm trong phân vùng
vendor
tại/vendor/etc/selinux/vendor_property_contexts
và đượcinit
tải khi khởi động cùng vớiproperty_context
của nền tảng
Bối cảnh dịch vụ
Trong Android 8.0, service_contexts
được chia thành các tệp sau:
plat_service_contexts
service_context
dành riêng cho nền tảng Android choservicemanager
.service_context
không có nhãn dành riêng cho thiết bị.- Phải nằm trong phân vùng
system
tại/system/etc/selinux/plat_service_contexts
và đượcservicemanager
tải khi khởi động cùng vớiservice_contexts
của nhà cung cấp.
vendor_service_contexts
service_context
dành riêng cho thiết bị được tạo bằng cách kết hợpservice_contexts
có trong các thư mục màBOARD_SEPOLICY_DIRS
trỏ đến trong các tệpBoardconfig.mk
của thiết bị.- Phải nằm trong phân vùng
vendor
tại/vendor/etc/selinux/vendor_service_contexts
và đượcservicemanager
tải khi bắt đầu cùng vớiservice_contexts
nền tảng. - Mặc dù
servicemanager
tìm kiếm tệp này khi khởi động, nhưng đối với một thiết bịTREBLE
hoàn toàn tuân thủ,vendor_service_contexts
KHÔNG ĐƯỢC tồn tại. Điều này là do tất cả hoạt động tương tác giữa các quy trìnhvendor
vàsystem
PHẢI diễn ra thông quahwservicemanager
/hwbinder
.
plat_hwservice_contexts
- Nền tảng Android
hwservice_context
chohwservicemanager
không có nhãn dành riêng cho thiết bị. - Phải nằm trong phân vùng
system
tại/system/etc/selinux/plat_hwservice_contexts
và đượchwservicemanager
tải khi khởi động cùng vớivendor_hwservice_contexts
.
- Nền tảng Android
vendor_hwservice_contexts
hwservice_context
dành riêng cho thiết bị được tạo bằng cách kết hợphwservice_contexts
có trong các thư mục màBOARD_SEPOLICY_DIRS
trỏ đến trong các tệpBoardconfig.mk
của thiết bị.- Phải nằm trong phân vùng
vendor
tại/vendor/etc/selinux/vendor_hwservice_contexts
và đượchwservicemanager
tải khi khởi động cùng vớiplat_service_contexts
.
vndservice_contexts
service_context
dành riêng cho thiết bị chovndservicemanager
được tạo bằng cách kết hợpvndservice_contexts
có trong các thư mục được chỉ đến bằngBOARD_SEPOLICY_DIRS
trongBoardconfig.mk
của thiết bị.- Tệp này phải nằm trong phân vùng
vendor
tại/vendor/etc/selinux/vndservice_contexts
và đượcvndservicemanager
tải khi khởi động.
Bối cảnh Seapp
Trong Android 8.0, seapp_contexts
được chia thành 2 tệp:
plat_seapp_contexts
- Nền tảng Android
seapp_context
không có thay đổi dành riêng cho thiết bị. - Phải nằm trong phân vùng
system
tại/system/etc/selinux/plat_seapp_contexts.
- Nền tảng Android
vendor_seapp_contexts
- Tiện ích dành riêng cho thiết bị đối với nền tảng
seapp_context
được tạo bằng cách kết hợpseapp_contexts
có trong các thư mục được chỉ đến bởiBOARD_SEPOLICY_DIRS
trong các tệpBoardconfig.mk
của thiết bị. - Phải nằm trong phân vùng
vendor
tại/vendor/etc/selinux/vendor_seapp_contexts
.
- Tiện ích dành riêng cho thiết bị đối với nền tảng
Quyền truy cập MAC
Trong Android 8.0, mac_permissions.xml
được chia thành 2 tệp:
- Nền tảng
mac_permissions.xml
- Nền tảng Android
mac_permissions.xml
không có thay đổi dành riêng cho thiết bị. - Phải nằm trong phân vùng
system
tại/system/etc/selinux/.
- Nền tảng Android
- Không phải nền tảng
mac_permissions.xml
- Phần mở rộng dành riêng cho thiết bị đối với nền tảng
mac_permissions.xml
được tạo từmac_permissions.xml
có trong các thư mục được chỉ đến bằngBOARD_SEPOLICY_DIRS
trong các tệpBoardconfig.mk
của thiết bị. - Phải nằm trong phân vùng
vendor
tại/vendor/etc/selinux/.
- Phần mở rộng dành riêng cho thiết bị đối với nền tảng