2 votos

¿Ha cambiado el significado de "Nivel de protección: firma" con Android 6?

En Documentación para desarrolladores escribe en el nivel de protección "firma":

Un permiso que el sistema concede sólo si la aplicación solicitante está firmada con el mismo certificado que la aplicación que declaró el permiso. Si los certificados coinciden, el sistema concede automáticamente el permiso sin notificarlo al usuario ni solicitar su aprobación explícita.

Esto era como siempre lo había conocido. Pero parece que de alguna manera contradice lo que la misma documentación escribe sobre WRITE_SETTINGS que está marcado como "Nivel de protección: firma":

Si la aplicación tiene como objetivo el nivel de API 23 o superior, el usuario de la aplicación debe conceder explícitamente este permiso a la aplicación a través de una pantalla de gestión de permisos.

¿Significa eso que el comportamiento al respecto ha cambiado con Marshmallow, y que una aplicación que no sea del sistema que utilice una firma diferente puede seguir accediendo a funciones cubiertas por ella, siempre que el usuario esté de acuerdo? Además, con la nueva "mentalidad" de conceder automáticamente permisos de un grupo donde el usuario ya tiene otro permiso concedido: ¿este permiso también se concede automáticamente entonces (como con todos los permisos del nivel de protección "peligroso") - o la diferencia aquí es que siempre requiere el acuerdo del usuario, pase lo que pase?


Nota 1: ha habido muchos cambios en la forma de gestionar los permisos en Android 6+. Para no hacer una pregunta "demasiado amplia", he tratado de dividirlo; así que para las otras partes, por favor también ver: El sistema de permisos cambia con Android 6.0: ¿Cuáles son las implicaciones para nosotros los usuarios? y Android 6+ y los permisos de cuenta: ¿adónde han ido a parar?

Nota 2: Esto definitivamente es de relevancia para el usuario final, ya que se trata de sus datos, y la comprobación cruzada de los permisos para detectar posibles implicaciones debería formar parte del proceso de instalación o, más bien, de selección de aplicaciones. Yo no preguntar desde la perspectiva de un desarrollador sobre cómo lidiar con eso al escribir una aplicación (aunque eso también podría ser interesante ;)

0 votos

Por encima del nivel 23 de la API es necesario aceptar los permisos cuando se solicitan... ¡Las versiones antiguas exceptuaban los permisos en la instalación !

0 votos

@ProbablyThis Gracias, pero ese no es el punto por el que pregunto (soy consciente de esta diferencia ;). Lo que quiero decir es: Las apps de terceros (instaladas por el usuario) sólo tenían permisos con nivel de protección "normal" (concedidos sin necesidad de aprobación) y "peligroso" (que son los que el usuario tiene que aceptar explícitamente - ya sea al instalar antes de MM, o a petición con MM en adelante). Los permisos con nivel de protección "firma" sólo se concedían si la firma coincidía con la de la app que los concedía. ¿Ha cambiado esto? No estoy preguntando acerca de "en la instalación" frente a "en tiempo de ejecución".

2voto

Albert Ma Puntos 71

No, el significado del nivel de protección de "firma" no ha cambiado en Android 6.

Podemos 'git blame' el archivo PackageManagerService.java y comprobar la función grantSignaturePermission . La lógica básica no cambió desde Android Lollipop. La siguiente lógica se añadió en 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;
    }

Del código anterior, podemos ver,

  • si el permiso se especifica con "signature|pre23" y la versión del sdk de destino de la aplicación es inferior a 23, obtendrá este permiso, porque este permiso se trasladó al permiso del sistema en Android 6.
  • si el permiso se especifica con "signature|preinstalled" y la aplicación es una aplicación de sistema preinstalada, obtendrá el permiso
  • si el permiso se especifica con "firma|instalador" o "firma|verificador" y la aplicación es instalador y verificador, obtendrá el permiso.

Conclusión Nivel de protección de firma: el nivel de protección de firma no cambió su significado en Android 6. Si un permiso tiene nivel de protección de firma con otra bandera, como pre23, preinstalado, intaller o verificador, tiene nuevos significados.


A continuación se explica la confusión sobre el permiso WRITE_SETTING en la pregunta:

La documentación sobre WRITE_SETTING es incorrecto sobre el nivel de protección. Si miras el código fuente de Android en 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" />

puede ver que el nivel de protección es firma|preinstalado|appop|pre23 .

Una aplicación que no pertenezca al sistema y que utilice una firma diferente puede acceder a las funciones gracias al nivel de protección de appop lo que significa que el usuario puede elegir si este permiso está activado o desactivado.

0voto

user157947 Puntos 51

RESPUESTA CORTA


RESPUESTA LARGA de documentos de autorización

Grupos de permisos

Todos los permisos peligrosos del sistema Android pertenecen a grupos de permisos. Si el dispositivo ejecuta Android 6.0 (nivel de API 23) y la targetSdkVersion de la aplicación es 23 o superior, se aplica el siguiente comportamiento del sistema cuando tu aplicación solicita un permiso peligroso:

Si una aplicación solicita un permiso peligroso enumerado en su manifiesto y la aplicación no tiene actualmente ningún permiso en el grupo de permisos, el sistema muestra un cuadro de diálogo al usuario en el que se describe el grupo de permisos al que la aplicación desea acceder. El cuadro de diálogo no describe el permiso específico dentro de ese grupo. Por ejemplo, si una aplicación solicita el permiso READ_CONTACTS, el cuadro de diálogo del sistema sólo indica que la aplicación necesita acceder a los contactos del dispositivo. Si una aplicación solicita un permiso peligroso enumerado en su manifiesto y la aplicación ya tiene otro permiso peligroso en el mismo grupo de permisos, el sistema concede inmediatamente el permiso sin ninguna interacción con el usuario. Por ejemplo, si una aplicación ha solicitado y obtenido previamente el permiso READ_CONTACTS y, a continuación, solicita WRITE_CONTACTS, el sistema le concederá inmediatamente dicho permiso.


Por favor, vea esto sobre 23+ Prácticas
MEJORES PRÁCTICAS Y CAMBIOS PARA LA API 23 +

0 votos

Lo siento, pero otra vez: No pedí "nivel de protección: peligroso", sino "nivel de protección: firma". Como he escrito, soy consciente del cambio a "solicitudes de permiso en tiempo de ejecución" con Android 6+, así que no es eso por lo que estoy preguntando. Como dice el título, estoy preguntando específicamente por "nivel de protección: firma". Su respuesta sólo abarca "nivel de protección: peligroso". Ver: documentación para desarrolladores sobre permisos: nivel de protección .

0 votos

El vídeo dura 30 minutos y se supone que explica los cambios en los permisos a partir del 23+........ Es todo lo que puedo encontrar..... Aparte de la "firma" se introdujo en el nivel 1 de la API...... La Play Store dice que las firmas individuales son necesarios para aplicaciones separadas.... así que deduzco que, usted está tratando de usar dos aplicaciones para acceder a un permiso de firma, esto no es posible debido a la autorización individual para aplicaciones y el sistema de permisos actual parece haber pasado por alto esto ...

0 votos

Gracias por sus esfuerzos. También he probado todo mi Google-Fu (y encontré varias páginas detailling en los cambios de la API para MM, ninguno de ellos cubriendo este detalle - que es porqué estoy preguntando aquí). Véase también mi otra pregunta al respecto: El sistema de permisos cambia con Android 6.0: ¿Cuáles son las implicaciones para nosotros los usuarios? donde menciono algunos de mis hallazgos. Aun así, esto no responde a mi pregunta.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X