Donc, en 4.3, il y avait un concept d'applications système. APK qui ont été placés dans /system/app
ont reçu des privilèges système. À partir de la version 4.4, il existe un nouveau concept d '"application privilégiée". Les applications privilégiées sont stockées dans /system/priv-app
répertoire et semblent être traités différemment. Si vous regardez dans le code source AOSP, sous PackageManagerService
, vous verrez de nouvelles méthodes telles que
static boolean locationIsPrivileged(File path) {
try {
final String privilegedAppDir = new File(Environment.getRootDirectory(), "priv-app")
.getCanonicalPath();
return path.getCanonicalPath().startsWith(privilegedAppDir);
} catch (IOException e) {
Slog.e(TAG, "Unable to access code path " + path);
}
return false;
}
Voici donc un exemple de situation où ils diffèrent.
public final void addActivity(PackageParser.Activity a, String type) {
...
if (!systemApp && intent.getPriority() > 0 && "activity".equals(type)) {
intent.setPriority(0);
Log.w(TAG, "Package " + a.info.applicationInfo.packageName + " has activity "
+ a.className + " with priority > 0, forcing to 0");
}
...
Cela affecte la priorité des activités qui ne sont pas définies en tant qu'applications système. Cela semble impliquer que vous ne pouvez pas ajouter d'activité au gestionnaire de packages dont la priorité est supérieure à 0, sauf si vous êtes une application système. Ceci ne pas exclut les applications privilégiées pour autant que je sache (il y a beaucoup de logique ici, je peux me tromper).
Ma question est qu'est-ce que cela implique exactement? Si mon application est privilégiée, mais pas le système, quelle différence cela fera-t-il? Dans PackageManagerService
, vous pouvez trouver différents éléments qui diffèrent entre les applications système et les applications privilégiées, mais ils ne sont pas exactement les mêmes. Il devrait exister une sorte d'idéologie derrière les applications privilégiées, sinon ils auraient simplement dit:
if locationIsPrivileged: app.flags |= FLAG_SYSTEM
et été fait avec elle. Il s'agit d'un nouveau concept et je pense qu'il serait important de connaître la différence entre ce type d'applications pour tous ceux qui développent du PSBA à partir de la version 4.4.
Ainsi, après quelques recherches, il est clair que les applications de priv-app sont éligibles pour les autorisations système, de la même manière que les anciennes applications pouvaient prétendre à des autorisations système en étant dans system-app. La seule documentation officielle de Google que j'ai pu trouver à ce sujet est venue sous la forme d'un message de validation: Commit hash: ccbf84f44c9e6a5ed3c08673614826bb237afc54
Certaines applications système sont plus système que d'autres
Les autorisations "signatureOrSystem" ne sont plus disponibles pour toutes les applications résidant sur la partition/system. Au lieu de cela, il existe un nouveau répertoire/system/priv-app, et seules les applications dont le fichier APK se trouve dans ce répertoire sont autorisées à utiliser les autorisations signatureOrSystem sans partager le certificat de plate-forme. Cela réduira la surface exploitée par les applications intégrées au système pour tenter d'accéder aux opérations protégées par des autorisations.
L'indicateur ApplicationInfo.FLAG_SYSTEM continue de signifier ce qu'il est dit dans la documentation: il indique que l'application apk était intégrée à la partition/system. Un nouvel indicateur caché FLAG_PRIVILEGED a été introduit, qui reflète le droit réel d'accéder à ces autorisations.
Mise à jour: à compter de Android 8.0 priv-app a légèrement changé avec l’ajout de la liste blanche des autorisations privilégiées. Au-delà de l’application priv, votre application doit également être ajoutée à une liste blanche pour pouvoir diverses autorisations système. Des informations à ce sujet sont disponibles ici: https://source.Android.com/devices/tech/config/perms-whitelist