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