Google cam kết thúc đẩy công bằng chủng tộc cho các cộng đồng Đen. Xem thế nào.
Trang này được dịch bởi Cloud Translation API.
Switch to English

Nhà cung cấp ban đầu

Quá trình init có các quyền gần như không bị hạn chế và sử dụng các tập lệnh đầu vào từ cả phân vùng hệ thống và nhà cung cấp để khởi tạo hệ thống trong quá trình khởi động. Quyền truy cập này gây ra lỗ hổng lớn trong phân chia hệ thống / nhà cung cấp Treble, vì các tập lệnh của nhà cung cấp có thể hướng dẫn init truy cập các tệp, thuộc tính, v.v. không tạo thành một phần của giao diện nhị phân ứng dụng của nhà cung cấp hệ thống ổn định (ABI).

Vendor init được thiết kế để đóng lỗ này bằng cách sử dụng một tăng cường bảo mật Linux (SELinux) tên miền riêng biệt vendor_init để chạy các lệnh tìm thấy trong /vendor với các điều khoản nhà cung cấp cụ thể.

Cơ chế

Nhà cung cấp init tạo ra một quy trình con của init sớm trong quá trình khởi động với bối cảnh SELinux u:r:vendor_init:s0 . Bối cảnh SELinux này có ít quyền hơn đáng kể so với bối cảnh init mặc định và quyền truy cập của nó bị giới hạn trong các tệp, thuộc tính, v.v. là đặc trưng của nhà cung cấp hoặc một phần của ABI của nhà cung cấp hệ thống ổn định.

Ban đầu kiểm tra từng tập lệnh mà nó tải để xem liệu đường dẫn của nó bắt đầu bằng /vendor hay không và nếu vậy, gắn thẻ nó với một dấu hiệu cho thấy các lệnh của nó phải được chạy trong ngữ cảnh init của nhà cung cấp. Mỗi init dựng sẵn được chú thích bằng một boolean xác định xem lệnh có phải được chạy trong quy trình con của nhà cung cấp hay không:

  • Hầu hết các lệnh truy cập hệ thống tệp được chú thích để chạy trong quy trình con của nhà cung cấp và do đó phải chịu sự khởi động của nhà cung cấp SEPolicy.
  • Hầu hết các lệnh tác động đến trạng thái init bên trong (ví dụ: bắt đầu và dừng dịch vụ) được chạy trong quy trình init bình thường. Các lệnh này được biết rằng một tập lệnh của nhà cung cấp đang kêu gọi họ thực hiện việc xử lý các quyền không phải của chính họ.

Vòng xử lý chính của init chứa một kiểm tra xem nếu một lệnh được chú thích để chạy trong quy trình con của nhà cung cấp và bắt nguồn từ tập lệnh của nhà cung cấp, thì lệnh đó được gửi qua giao tiếp giữa quá trình (IPC) đến quy trình con của nhà cung cấp, chạy lệnh và gửi kết quả trở lại init.

Sử dụng nhà cung cấp ban đầu

Nhà cung cấp init được bật theo mặc định và các hạn chế của nó được áp dụng cho tất cả các tập lệnh init có trong phân vùng /vendor . Nhà cung cấp init phải minh bạch đối với các nhà cung cấp có tập lệnh chưa truy cập vào các tệp, thuộc tính của hệ thống, v.v.

Tuy nhiên, nếu các lệnh trong tập lệnh nhà cung cấp nhất định vi phạm các hạn chế init của nhà cung cấp, các lệnh sẽ thất bại. Các lệnh không có một dòng trong nhật ký kernel (hiển thị với dmesg) từ init chỉ ra lỗi. Kiểm toán SELinux đi kèm với bất kỳ lệnh thất bại nào do chính sách của Selinux. Ví dụ về một thất bại bao gồm cả kiểm toán SELinux:

type=1400 audit(1511821362.996:9): avc: denied { search } for pid=540 comm="init" name="nfc" dev="sda45" ino=1310721 scontext=u:r:vendor_init:s0 tcontext=u:object_r:nfc_data_file:s0 tclass=dir permissive=0
init: Command 'write /data/nfc/bad_file_access 1234' action=boot (/vendor/etc/init/hw/init.walleye.rc:422) took 2ms and failed: Unable to write to file '/data/nfc/bad_file_access': open() failed: Permission denied

Nếu một lệnh thất bại, có hai tùy chọn:

  • Nếu lệnh bị lỗi do hạn chế dự định (chẳng hạn như nếu lệnh đang truy cập tệp hệ thống hoặc thuộc tính), lệnh phải được thực hiện lại theo cách thân thiện với Treble, chỉ đi qua các giao diện ổn định. Các quy tắc Neverallow ngăn chặn việc thêm quyền truy cập vào các tệp hệ thống không phải là một phần của ABI nhà cung cấp hệ thống ổn định.
  • Nếu nhãn SELinux là mới và chưa được cấp phép trong hệ thống vendor_init.te cũng không loại trừ quyền qua các quy tắc neverallow, nhãn mới có thể được cấp phép trong thiết bị cụ thể vendor_init.te .

Đối với thiết bị ra mắt trước khi Android 9, các quy tắc neverallows có thể được bỏ qua bằng cách thêm data_between_core_and_vendor_violators typeattribute đến thiết bị cụ thể vendor_init.te tập tin.

Vị trí mã

Phần lớn logic cho nhà cung cấp init IPC nằm trong system / core / init / subcontext.cpp .

Bảng lệnh nằm trong lớp BuiltinFunctionMap trong system / core / init / buildins.cpp và bao gồm các chú thích cho biết nếu lệnh phải chạy trong quy trình con của nhà cung cấp.

SEPolicy cho nhà cung cấp init được chia thành các thư mục riêng ( system / sepolicy / private / Vendor_init.te ) và public ( system / sepolicy / public / eller_init.te ) trong system / sepolicy.