2 votes

La signification de "Niveau de protection : signature" a-t-elle changé avec Android 6 ?

El Documentation pour les développeurs écrit sur le niveau de protection "signature" :

Une autorisation que le système n'accorde que si l'application requérante est signée avec le même certificat que l'application qui a déclaré l'autorisation. Si les certificats correspondent, le système accorde automatiquement l'autorisation sans en informer l'utilisateur ni lui demander son accord explicite.

C'était comme je l'ai toujours su. Mais cela semble en quelque sorte contredire ce que la même documentation écrit sur WRITE_SETTINGS qui est marqué comme "Niveau de protection : signature" :

Si l'application vise le niveau 23 ou plus de l'API, l'utilisateur de l'application doit explicitement accorder cette permission à l'application par le biais d'un écran de gestion des permissions.

Cela signifie-t-il que le comportement à cet égard a changé avec Marshmallow - et qu'une application non système utilisant une signature différente peut toujours accéder à la fonctionnalité couverte par celle-ci, à condition que l'utilisateur soit d'accord ? De plus, avec la nouvelle "mentalité" d'accorder automatiquement les autorisations d'un groupe où l'utilisateur a déjà une autre autorisation accordée : cette autorisation est-elle également accordée automatiquement alors (comme avec toutes les autorisations du niveau de protection "dangereux") - ou la différence ici est-elle qu'elle nécessite toujours l'accord de l'utilisateur, quoi qu'il arrive ?


Note 1 : il y a eu beaucoup de changements dans la façon dont les permissions sont traitées dans Android 6+. Pour ne pas faire une question "trop large", j'ai essayé de la diviser ; donc pour les autres parties, veuillez aussi voir : Le système de permissions change avec Android 6.0 : Quelles sont les implications pour nous, utilisateurs ? y Android 6+ et les autorisations de compte : où sont-ils passés ?

Note 2 : C'est définitivement ist et la vérification des autorisations pour les implications possibles devrait faire partie du processus d'installation ou plutôt de sélection des applications. Je suis no Je ne demande pas le point de vue d'un développeur sur la façon de gérer cela lors de l'écriture d'une application (bien que cela puisse aussi être intéressant ;).

0 votes

Au-dessus du niveau 23 de l'API, il faut accepter les permissions quand elles sont demandées... Les anciennes versions acceptaient les permissions à l'installation !

0 votes

@ProbablyThis Merci, mais ce n'est pas le sujet de ma question (je suis conscient de cette différence ;). Ce que je veux dire, c'est que Les applications tierces (installées par l'utilisateur) n'ont reçu que des permissions de niveau de protection "normal" (accordées sans besoin d'approbation) et "dangereux" (qui sont celles que l'utilisateur doit explicitement accepter - que ce soit à l'installation avant MM, ou sur demande avec MM et plus). Les autorisations de niveau de protection "signature" n'étaient accordées que si la signature correspondait à celle de l'application qui les accordait. Cela a-t-il changé ? Je ne parle pas de "à l'installation" ou "à l'exécution".

2voto

Albert Ma Points 71

Non, la signification du niveau de protection de la "signature" n'est pas modifiée dans Android 6.

Nous pouvons "blâmer git" le fichier PackageManagerService.java et vérifier la fonction grantSignaturePermission . La logique de base n'a pas changé depuis Android Lollipop. La logique suivante a été ajoutée dans Android 6 :

    if (!allowed && (bp.protectionLevel
            & PermissionInfo.PROTECTION_FLAG_PRE23) != 0
            && pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M) {
        // If this was a previously normal/dangerous permission that got moved
        // to a system permission as part of the runtime permission redesign, then
        // we still want to blindly grant it to old apps.
        allowed = true;
    }
    if (!allowed && (bp.protectionLevel & PermissionInfo.PROTECTION_FLAG_INSTALLER) != 0
            && pkg.packageName.equals(mRequiredInstallerPackage)) {
        // If this permission is to be granted to the system installer and
        // this app is an installer, then it gets the permission.
        allowed = true;
    }
    if (!allowed && (bp.protectionLevel & PermissionInfo.PROTECTION_FLAG_VERIFIER) != 0
            && pkg.packageName.equals(mRequiredVerifierPackage)) {
        // If this permission is to be granted to the system verifier and
        // this app is a verifier, then it gets the permission.
        allowed = true;
    }
    if (!allowed && (bp.protectionLevel
            & PermissionInfo.PROTECTION_FLAG_PREINSTALLED) != 0
            && isSystemApp(pkg)) {
        // Any pre-installed system app is allowed to get this permission.
        allowed = true;
    }

A partir du code ci-dessus, nous pouvons voir,

  • si la permission est spécifiée avec "signature|pre23" et que la version du sdk cible de l'application est inférieure à 23, elle obtiendra cette permission, car cette permission a été déplacée vers la permission système dans Android 6.
  • si la permission est spécifiée avec "signature|preinstalled" et que l'application est une application système préinstallée, elle obtiendra la permission.
  • si la permission est spécifiée avec "signature|installateur" ou "signature|vérificateur" et que l'application est installateur et vérificateur, elle obtiendra la permission.

Conclusion Le niveau de protection de la signature n'a pas changé de signification dans Android 6. Si une permission a un niveau de protection de la signature avec un autre drapeau, comme pre23, preinstalled, intaller ou verifier, il a de nouvelles significations.


Ce qui suit explique la confusion concernant la permission WRITE_SETTING dans la question :

La documentation sur WRITE_SETTING est erroné en ce qui concerne le niveau de protection. Si vous regardez le code source d'Android à frameworks/base/core/res/AndroidManifest.xml :

 <permission android:name="android.permission.WRITE_SETTINGS"
        android:label="@string/permlab_writeSettings"
        android:description="@string/permdesc_writeSettings"
        android:protectionLevel="signature|preinstalled|appop|pre23" />

vous pouvez voir que le niveau de protection est signature|préinstallée|appop|pre23 .

Une application non-système utilisant une signature différente peut accéder à la fonctionnalité en raison du niveau de protection de appop ce qui signifie que l'utilisateur peut choisir si cette autorisation est activée ou non.

0 votes

Bonne trouvaille, merci ! Ce ne serait pas la première fois que la documentation est bancale. Si vous pouviez nommer une source faisant autorité ("crédible et/ou officielle") pour soutenir qu'en général (c'est-à-dire pas seulement pour le WRITE_SETTINGS mais pour protectionLevel:signature ), je vous accorderais la prime immédiatement !

1 votes

La source la plus crédible et la plus officielle concernant protectionLevel:signature devrait être le code source d'Android. Nous pouvons "accuser git" le fichier PackageManagerService.java et vérifier la fonction grantSignaturePermission . La logique de base n'a pas changé depuis Android Lollipop.

0 votes

Encore des bons points, Albert. N'étant pas moi-même un développeur : Je suppose que vous avez déjà vérifié la fonction et fait un "blâme" ? Le lien donné est actuellement hors délai pour moi.

0voto

Empire of E Points 1586

RÉPONSE COURTE
OUI


LONGUE RÉPONSE de documents d'autorisation

Groupes de permission

Toutes les permissions dangereuses du système Android appartiennent à des groupes de permissions. Si l'appareil fonctionne sous Android 6.0 (niveau 23 de l'API) et que la targetSdkVersion de l'application est égale ou supérieure à 23, le comportement système suivant s'applique lorsque votre application demande une permission dangereuse :

Si une application demande une autorisation dangereuse répertoriée dans son manifeste et que l'application n'a actuellement aucune autorisation dans le groupe d'autorisations, le système affiche une boîte de dialogue à l'utilisateur décrivant le groupe d'autorisations auquel l'application veut accéder. La boîte de dialogue ne décrit pas l'autorisation spécifique au sein de ce groupe. Par exemple, si une application demande l'autorisation READ_CONTACTS, la boîte de dialogue du système indique simplement que l'application doit avoir accès aux contacts de l'appareil. Si une application demande une autorisation dangereuse répertoriée dans son manifeste et que l'application possède déjà une autre autorisation dangereuse dans le même groupe d'autorisations, le système accorde immédiatement l'autorisation sans aucune interaction avec l'utilisateur. Par exemple, si une application a déjà demandé et obtenu l'autorisation READ_CONTACTS et qu'elle demande ensuite WRITE_CONTACTS, le système lui accorde immédiatement cette autorisation.


S'il vous plaît, regardez ceci à propos de 23+ pratiques

0 votes

Désolé, mais encore une fois : Je n'ai pas demandé "niveau de protection : dangereux", mais "niveau de protection : signature". Comme je l'ai écrit, je suis au courant du changement de "demandes de permission d'exécution" avec Android 6+, donc ce n'est pas ce que je demande. Comme le dit le titre, je demande spécifiquement "niveau de protection : signature". Votre réponse ne couvre que "niveau de protection : dangereux". Voir : documentation du développeur sur les permissions : niveau de protection .

0 votes

La vidéo dure 30 minutes et est censée expliquer les modifications apportées aux autorisations après 23+......... C'est tout ce que j'ai pu trouver..... Autre que "signature" a été introduit dans le niveau 1 de l'API...... Le Play Store indique que des signatures individuelles sont requises pour des applications distinctes.... donc j'en déduis que vous essayez d'utiliser deux applications pour accéder à une permission de signature, ce qui n'est pas possible en raison de la permission individuelle pour les applications et le système de permission actuel semble avoir négligé cela...

0 votes

Merci pour vos efforts. J'ai également essayé tout mon Google-Fu (et j'ai trouvé plusieurs pages détaillant les changements d'API pour MM, aucune d'entre elles ne couvrant ce détail - c'est pourquoi je demande ici). Voir également mon autre question à ce sujet : Le système de permissions change avec Android 6.0 : Quelles sont les implications pour nous, utilisateurs ? où je mentionne certaines de mes découvertes. Pourtant, cela ne répond pas à ma question.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X