Lista consentita di autorizzazioni con privilegi

Le app con privilegi sono app di sistema situate in una directory priv-app su una partizione dell'immagine di sistema. Le partizioni utilizzate per le release di 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 signature | privileged che potevano essere concesse alle app con privilegi. A partire da Android 8.0, i produttori possono concedere esplicitamente le autorizzazioni privilegiate nei file XML di configurazione di sistema nella directory /etc/permissions. A partire da Android 9, gli implementatori possono concedere o negare esplicitamente tutte le autorizzazioni con privilegi. Se le autorizzazioni privilegiate non vengono concesse, il dispositivo non si avvia.

Il file privapp-permissions.xml può concedere o negare soltanto 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

Le liste consentite di autorizzazioni per le app possono essere elencate in un singolo file XML o in più file XML situati nella directory frameworks/base/etc/permissions:

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

Non si applicano regole rigide all'organizzazione dei contenuti. Gli implementatori dei dispositivi possono determinare la struttura dei contenuti a condizione che tutte le app di /system/priv-app siano inserite 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'Android Open Source Project (AOSP) sono elencate in /etc/permissions/privapp-permissions-platform.xml.
  • Per altre app, utilizza file del tipo /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 il file 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, abilita la modalità di log di transizione:

ro.control_privapp_permissions=log

Le violazioni vengono registrate nel file di log. Vengono concesse autorizzazioni non privilegiate. In questo modo, il dispositivo rimane in uno stato di funzionamento, fornendo al contempo 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:

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

Applicare una lista consentita

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

La lista consentita è obbligatoria 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 documento CDD (Compatibility Definition Document).