Daftar yang diizinkan untuk izin dengan hak istimewa

Aplikasi istimewa adalah aplikasi sistem yang berada di direktori priv-app pada partisi image sistem. Partisi yang digunakan untuk rilis Android adalah:

  • Android 9 dan yang lebih tinggi: /system, /product, /vendor
  • Android 8.1 dan yang lebih lama: /system

Sebelumnya, produsen perangkat memiliki sedikit kontrol atas izin tanda tangan | istimewa yang dapat diberikan kepada aplikasi istimewa. Mulai Android 8.0, produsen dapat memberikan izin istimewa secara eksplisit dalam file XML konfigurasi sistem di direktori /etc/permissions. Mulai Android 9, pengimplementasi dapat memberikan atau menolak semua izin istimewa secara eksplisit. Jika izin istimewa tidak diberikan, perangkat tidak akan melakukan booting.

File privapp-permissions.xml hanya dapat memberikan atau menolak izin untuk aplikasi istimewa di partisi yang sama. Misalnya, jika aplikasi di partisi /product meminta izin istimewa, permintaan hanya dapat diberikan atau ditolak oleh file privapp-permissions.xml di /product.

Menambahkan daftar yang diizinkan

Daftar aplikasi yang diizinkan untuk menggunakan izin dapat dicantumkan dalam satu file XML atau dalam beberapa file XML yang berada di direktori /etc/permissions:

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

Tidak ada aturan ketat yang berlaku untuk cara konten diatur. Pengembang perangkat dapat menentukan struktur konten selama semua aplikasi dari /system/priv-app masuk dalam daftar yang diizinkan. Misalnya, Google telah mengembangkan satu daftar yang diizinkan untuk semua aplikasi dengan hak istimewa. Sebaiknya gunakan organisasi berikut:

  • Izin untuk aplikasi yang sudah disertakan dalam hierarki Android Open Source Project (AOSP) dicantumkan di /etc/permissions/privapp-permissions-platform.xml.
  • Untuk aplikasi lain, gunakan file dalam bentuk, /etc/permissions/privapp-permissions-DEVICE_NAME.xml.

Menyesuaikan daftar yang diizinkan

AOSP menyertakan implementasi daftar yang diizinkan yang dapat disesuaikan sesuai kebutuhan.

Jika izin harus ditolak, edit XML untuk menggunakan tag deny-permission alih-alih tag permission. Contoh:

<!-- 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>
    ...

Menemukan izin yang tidak ada

Untuk menemukan izin yang tidak ada saat memulai perangkat baru, aktifkan mode log transisi:

ro.control_privapp_permissions=log

Pelanggaran dilaporkan dalam file log. Izin yang tidak memiliki hak istimewa diberikan. Dengan melakukannya, perangkat akan tetap dalam status berfungsi sambil tetap memberikan daftar pelanggaran. Format pesan error adalah sebagai berikut:

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

Semua pelanggaran harus ditangani dengan menambahkan izin yang tidak ada ke daftar yang diizinkan yang sesuai. Perhatikan bahwa di:

  • Android 9 dan yang lebih tinggi, pelanggaran izin hak istimewa mencegah perangkat dimulai. Sebagai gantinya, Anda harus mengizinkan atau menolak semua izin istimewa secara eksplisit.
  • Android 8.0 dan yang lebih rendah, izin yang tidak ada tidak diberikan ke aplikasi yang terpengaruh meskipun berada di jalur priv-app.

Menerapkan daftar yang diizinkan

Setelah membuat daftar yang diizinkan, aktifkan penerapan runtime dengan menyetel properti build ro.control_privapp_permissions=enforce.

Pengizinan diperlukan hanya untuk izin yang dideklarasikan oleh aplikasi dengan package="android". Status properti ro.control_privapp_permissions harus mematuhi Bagian 9.1 Izin dalam Compatibility Definition Document (CDD).