Danh sách cho phép quyền đặc quyền

Ứng dụng đặc quyền là các ứng dụng hệ thống nằm trong thư mục priv-app trên phân vùng hình ảnh hệ thống. Các phân vùng dùng cho bản phát hành Android là:

  • Android 9 trở lên: /system, /product, /vendor
  • Android 8.1 trở xuống: /system

Trước đây, nhà sản xuất thiết bị có rất ít quyền kiểm soát đối với việc cấp quyền chữ ký | đặc quyền cho các ứng dụng đặc quyền. Kể từ Android 8.0, nhà sản xuất có thể cấp quyền đặc quyền một cách rõ ràng trong các tệp XML cấu hình hệ thống trong thư mục /etc/permissions. Kể từ Android 9, người triển khai có thể cấp hoặc từ chối rõ ràng tất cả các quyền đặc quyền. Nếu không cấp các quyền đặc quyền, thiết bị sẽ không khởi động.

Tệp privapp-permissions.xml chỉ có thể cấp hoặc từ chối quyền cho các ứng dụng đặc quyền trên cùng một phân vùng. Ví dụ: nếu một ứng dụng trên phân vùng /product yêu cầu các quyền đặc quyền, thì yêu cầu này chỉ có thể được cấp hoặc từ chối bằng tệp privapp-permissions.xml trên /product.

Thêm danh sách cho phép

Bạn có thể liệt kê danh sách cho phép quyền cho ứng dụng trong một tệp XML hoặc trong nhiều tệp XML nằm trong thư mục frameworks/base/etc/permissions:

  • /etc/permissions/privapp-permissions-OEM_NAME.xml
  • /etc/permissions/privapp-permissions-DEVICE_NAME.xml

Không có quy tắc nghiêm ngặt nào áp dụng cho cách sắp xếp nội dung. Người triển khai thiết bị có thể xác định cấu trúc nội dung miễn là tất cả ứng dụng từ /system/priv-app đều có trong danh sách cho phép. Ví dụ: Google đã phát triển một danh sách cho phép duy nhất cho tất cả ứng dụng có đặc quyền. Bạn nên sắp xếp như sau:

  • Các quyền cho ứng dụng đã có trong cây Dự án nguồn mở Android (AOSP) được liệt kê trong /etc/permissions/privapp-permissions-platform.xml.
  • Đối với các ứng dụng khác, hãy sử dụng các tệp ở dạng /etc/permissions/privapp-permissions-DEVICE_NAME.xml.

Tuỳ chỉnh danh sách cho phép

AOSP bao gồm một phương thức triển khai danh sách cho phép có thể được tuỳ chỉnh nếu cần.

Nếu bạn phải từ chối một quyền, hãy chỉnh sửa tệp XML để sử dụng thẻ deny-permission thay vì thẻ permission. Ví dụ:

<!-- This XML file declares which signature|privileged permissions to grant to
privileged apps that come with the platform -->

    <permissions>
      <privapp-permissions package="com.android.backupconfirm">
        <permission name="android.permission.BACKUP"/>
        <permission name="android.permission.CRYPT_KEEPER"/>
      </privapp-permissions>

      <privapp-permissions package="com.android.cellbroadcastreceiver">

        <!-- Don't allow the application to interact across users -->

        <deny-permission name="android.permission.INTERACT_ACROSS_USERS"/>
        <permission name="android.permission.MANAGE_USERS"/>
        <permission name="android.permission.MODIFY_PHONE_STATE"/>
        <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
        <permission name="android.permission.RECEIVE_EMERGENCY_BROADCAST"/>
      </privapp-permissions>
    ...

Tìm quyền bị thiếu

Để tìm các quyền bị thiếu khi khởi động thiết bị mới, hãy bật chế độ nhật ký chuyển đổi:

ro.control_privapp_permissions=log

Các lỗi vi phạm sẽ được báo cáo trong tệp nhật ký. Các quyền không đặc quyền được cấp. Việc này đảm bảo thiết bị vẫn ở trạng thái hoạt động trong khi vẫn cung cấp danh sách lỗi vi phạm. Định dạng thông báo lỗi như sau:

PackageManager: Privileged permission {PERMISSION_NAME} for package {PACKAGE_NAME} - not in privapp-permissions allowlist

Bạn phải giải quyết tất cả lỗi vi phạm bằng cách thêm các quyền bị thiếu vào danh sách cho phép thích hợp. Lưu ý rằng trong:

  • Android 9 trở lên, các lỗi vi phạm quyền đặc quyền sẽ ngăn thiết bị khởi động. Thay vào đó, bạn phải cho phép hoặc từ chối rõ ràng tất cả các quyền đặc quyền.
  • Android 8.0 trở xuống, các quyền bị thiếu sẽ không được cấp cho các ứng dụng bị ảnh hưởng mặc dù nằm trong đường dẫn priv-app.

Thực thi danh sách cho phép

Sau khi bạn tạo danh sách cho phép, hãy bật tính năng thực thi thời gian chạy bằng cách thiết lập thuộc tính bản dựng ro.control_privapp_permissions=enforce.

Bạn chỉ cần đưa vào danh sách cho phép đối với các quyền do ứng dụng khai báo bằng package="android". Trạng thái thuộc tính ro.control_privapp_permissions phải tuân thủ Mục 9.1 Quyền trong Tài liệu định nghĩa về khả năng tương thích (CDD).