Lista consentita di autorizzazioni con privilegi

Le app con privilegi sono app di sistema che si trovano in una directory priv-app su una partizione dell'immagine di sistema. Le partizioni utilizzate per le release Android sono:

  • Android 9 e versioni successive: /system, /product, /vendor
  • Android 8.1 e versioni precedenti: /system

In passato, i produttori di dispositivi avevano poco controllo sulle autorizzazioni con firma | privilegiate che potevano essere concesse alle app privilegiate. A partire da Android 8.0, i produttori possono concedere esplicitamente autorizzazioni privilegiate nei file XML di configurazione del sistema nella directory /etc/permissions. A partire da Android 9, gli implementatori possono concedere o negare esplicitamente tutte le autorizzazioni privilegiate. Se le autorizzazioni privilegiate non vengono concesse, il dispositivo non si avvierà.

Il file privapp-permissions.xml può solo concedere o negare le autorizzazioni per le app con privilegi nella stessa partizione. Ad esempio, se un'app nella partizione /product richiede autorizzazioni privilegiate, la richiesta può essere concessa o negata solo da un file privapp-permissions.xml su /product.

Aggiungere una lista consentita

Gli elenchi consentiti di autorizzazioni per le app possono essere elencati in un singolo file XML o in più file XML che si trovano nella directory /etc/permissions:

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

Non esiste una regola rigorosa che stabilisca come devono essere organizzati i contenuti. Gli implementatori di dispositivi possono determinare la struttura dei contenuti, a condizione che tutte le app di /system/priv-app siano incluse nella lista consentita. Ad esempio, Google ha sviluppato una singola lista consentita per tutte le app con privilegi. Ti consigliamo la seguente organizzazione:

  • Le autorizzazioni per le app già incluse nell'albero Android Open Source Project (AOSP) sono elencate in /etc/permissions/privapp-permissions-platform.xml.
  • Per altre app, utilizza file del modulo /etc/permissions/privapp-permissions-DEVICE_NAME.xml.

Personalizzare una lista consentita

AOSP include un'implementazione della lista consentita che può essere personalizzata in base alle esigenze.

Se un'autorizzazione deve essere negata, modifica l'XML in modo da utilizzare un tag deny-permission anziché un tag permission. Ad esempio:

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

Trovare le autorizzazioni mancanti

Per trovare le autorizzazioni mancanti quando avvii un nuovo dispositivo, attiva la modalità di log di transizione:

ro.control_privapp_permissions=log

Le violazioni vengono segnalate nel file di log. Vengono concesse autorizzazioni non privilegiate. In questo modo, il dispositivo rimane funzionante e viene comunque fornito l'elenco delle violazioni. Il formato del messaggio di errore è il seguente:

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

Tutte le violazioni devono essere risolte aggiungendo le autorizzazioni mancanti alle liste consentite appropriate. Tieni presente che in:

  • Android 9 e versioni successive, le violazioni delle autorizzazioni privilegiate impediscono l'avvio del dispositivo. Devi invece consentire o negare esplicitamente tutte le autorizzazioni privilegiate.
  • Android 8.0 e versioni precedenti, le autorizzazioni mancanti non vengono concesse alle app interessate nonostante si trovino nel percorso priv-app.

Applicare una lista consentita

Dopo aver creato le liste consentite, attiva l'applicazione in fase di runtime impostando la proprietà build ro.control_privapp_permissions=enforce.

La lista consentita è richiesta solo per le autorizzazioni dichiarate dalle app con package="android". Lo stato della proprietà ro.control_privapp_permissions deve rispettare la Sezione 9.1 Autorizzazioni del Compatibility Definition Document (CDD).