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

Các ứng dụng có đặc quyền là ứng dụng hệ thống nằm trong thư mục priv-app trên một phân vùng hình ảnh hệ thống. Các phân vùng được 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, các nhà sản xuất thiết bị có rất ít quyền kiểm soát đối với những quyền chữ ký | đặc quyền có thể được cấp cho các ứng dụng đặc quyền. Kể từ Android 8.0, các nhà sản xuất có thể cấp quyền đặc biệt 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 tất cả các quyền đặc biệt một cách rõ ràng. Nếu các quyền đặc biệt không được cấp, 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 biệt, thì chỉ có tệp privapp-permissions.xml trên /product mới có thể cấp hoặc từ chối yêu cầu đó.

Thêm danh sách cho phép

Bạn có thể liệt kê danh sách cho phép quyền của ứng dụng trong một tệp XML duy nhất hoặc trong nhiều tệp XML nằm trong thư mục /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. Các đơn vị 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 nằm 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ả các ứng dụng có đặc quyền. Bạn nên tổ chức như sau:

  • Các quyền đối với những ứ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 có dạng /etc/permissions/privapp-permissions-DEVICE_NAME.xml.

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

AOSP có một chế độ triển khai danh sách cho phép mà bạn có thể tuỳ chỉnh nếu cần.

Nếu phải từ chối một quyền, hãy chỉnh sửa XML để 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 các quyền còn thiếu

Để tìm các quyền còn thiếu khi khởi động một 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 đượ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 hoạt động bình thường trong khi vẫn cung cấp danh sách các 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ả các lỗi vi phạm bằng cách thêm các quyền còn thiếu vào danh sách cho phép thích hợp. Xin lưu ý rằng trong:

  • Android 9 trở lên, các lỗi vi phạm quyền đặc biệt 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 biệt.
  • Android 8.0 trở xuống, các quyền còn 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 tạo danh sách cho phép, hãy bật chế độ thực thi thời gian chạy bằng cách đặt 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 có package="android" khai báo. 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).