Izin Hak Istimewa yang Diizinkan

Aplikasi istimewa adalah aplikasi sistem yang terletak di direktori priv-app pribadi di salah satu partisi citra sistem. Partisi yang digunakan untuk rilis Android adalah

  • Android 8.1 dan lebih rendah - /system
  • Android 9 dan lebih tinggi - /system, /product, /vendor

Sepanjang halaman ini, /etc/permissions/priv-app memutuskan untuk partition /etc/permissions/priv-app .

Secara historis, produsen perangkat memiliki sedikit kendali atas tanda tangan|izin istimewa mana yang dapat diberikan ke aplikasi istimewa. Mulai Android 8.0, produsen harus secara eksplisit memberikan izin istimewa dalam file XML konfigurasi sistem di direktori /etc/permissions . Mulai Android 9, pelaksana harus secara eksplisit memberikan atau menolak semua izin istimewa atau perangkat tidak bisa boot.

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 tersebut hanya dapat diberikan atau ditolak oleh file privapp-permissions.xml yang juga ada di /product .

Menambahkan daftar yang diizinkan

Daftar izin yang diizinkan untuk aplikasi dapat dicantumkan dalam satu XML atau dalam beberapa file XML yang terletak di direktori frameworks/base/etc/permissions sebagai berikut:

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

Tidak ada aturan ketat untuk mengatur konten. Pelaksana perangkat dapat menentukan struktur konten selama semua aplikasi dari /system/priv-app diizinkan. Misalnya, Google memiliki satu daftar yang diizinkan untuk semua aplikasi istimewa yang dikembangkan oleh Google, dan merekomendasikan organisasi berikut:

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

Membuat daftar yang diizinkan

Untuk membuat daftar yang diizinkan secara otomatis untuk semua aplikasi yang tersedia di citra sistem, gunakan alat baris perintah AOSP di development/tools/privapp_permissions/privapp_permissions.py . Untuk membuat versi awal privapp-permissions.xml khusus perangkat :

  1. Membangun citra sistem:
        . build/envsetup.sh
        lunch PRODUCT_NAME
        make -j
  2. Jalankan skrip privapp_permissions.py untuk menghasilkan file privapp-permissions.xml yang mencantumkan semua tanda tangan|izin istimewa yang diperlukan untuk diizinkan: l10n
    development/tools/privapp_permissions/privapp_permissions.py
    Alat ini mencetak konten XML yang dapat digunakan sebagai satu file, atau dipecah menjadi beberapa file di jalur direktori /etc/permissions . Jika perangkat sudah menyertakan daftar yang diizinkan di direktori /etc/permissions , alat ini hanya mencetak perbedaan (seperti tanda tangan yang hilang|izin istimewa yang perlu Anda tambahkan ke daftar yang diizinkan). Ini juga berguna untuk tujuan audit: Saat versi baru aplikasi ditambahkan, alat mendeteksi izin tambahan yang diperlukan.
  3. Salin file yang dihasilkan ke direktori /etc/permissions yang sesuai, tempat sistem membaca file saat boot.

Menyesuaikan daftar yang diizinkan

AOSP menyertakan implementasi daftar yang diizinkan yang dapat disesuaikan sesuai kebutuhan. Izin untuk aplikasi yang disertakan dalam AOSP sudah diizinkan di /etc/permissions/privapp-permissions-platform.xml .

Secara default, skrip privapp_permissions.py menghasilkan keluaran yang secara otomatis memberikan izin apa pun yang diminta oleh aplikasi istimewa. Jika ada izin yang 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 hilang

Untuk menemukan izin yang hilang saat membuka perangkat baru, aktifkan mode log transisi:

ro.control_privapp_permissions=log

Pelanggaran dilaporkan dalam file log, tetapi izin nonprivileged masih diberikan. Ini membuat perangkat dalam keadaan bekerja sambil memberikan daftar pelanggaran. Ini adalah format pesan kesalahan:

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

Semua pelanggaran harus diatasi dengan menambahkan izin yang hilang ke daftar yang diizinkan.

  • Di Android 8.0 dan yang lebih rendah, aplikasi yang terpengaruh tidak diberikan izin yang hilang meskipun berada di jalur priv-app pribadi.
  • Di Android 9 dan lebih tinggi, pelanggaran (izin istimewa ) berarti perangkat tidak bisa boot . Anda harus secara eksplisit mengizinkan atau menolak semua izin istimewa

Menegakkan daftar yang diizinkan

Setelah daftar yang diizinkan diterapkan, aktifkan penegakan waktu proses dengan menyetel properti build ro.control_privapp_permissions=enforce .