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

La documentación del desarrollador escribe en el nivel de protección "firma":

Un permiso que el sistema otorga solo 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 otorga automáticamente el permiso sin notificar al usuario ni solicitar su aprobación explícita.

Esto fue como siempre lo supe. Pero parece de alguna manera contradecir lo que escribe la misma documentación 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 otorgar explícitamente este permiso a la aplicación a través de una pantalla de administración de permisos.

¿Eso significa que el comportamiento hacia esto ha cambiado con Marshmallow, y una aplicación que no pertenece al sistema que usa una firma diferente aún puede acceder a la funcionalidad cubierta por ella, siempre que el usuario esté de acuerdo? Además, con la nueva "mentalidad" de otorgar automáticamente permisos de un grupo donde el usuario ya tiene otro permiso otorgado: ¿este permiso también se otorga automáticamente entonces (como con todos los permisos del nivel de protección "peligroso"), o es la diferencia aquí? que siempre requiere el acuerdo del usuario, pase lo que pase?


Nota 1: hubo muchos cambios en la forma en que se manejan los permisos en Android 6+. Para no hacer una pregunta "demasiado amplia", he tratado de dividirla; así que para las otras partes, consulte también: Cambios en el sistema de permisos con Android 6.0: ¿Cuáles son las implicaciones para nosotros, los usuarios? y Android 6+ y permisos de cuenta: ¿adónde han ido?

Nota 2: esto definitivamente es relevante para el usuario final, ya que se trata de sus datos, y la verificación cruzada de permisos para posibles implicaciones debe ser parte del proceso de instalación o, más bien, de selección de aplicaciones. No estoy preguntando desde la perspectiva de un desarrollador cómo lidiar con eso al escribir una aplicación (aunque eso podría ser interesante;)

Por encima del nivel de API 23, se requiere aceptar permisos cuando se solicitan... ¡Las versiones anteriores exceptuaban los permisos en la instalación!
@ProbablyThis Gracias, pero ese no es el punto sobre el que pregunto (soy consciente de esta diferencia;). Mi punto es: a las aplicaciones de terceros (instaladas por el usuario) solo se les otorgaron permisos con nivel de protección "normal" (otorgado sin necesidad de aprobación) y "peligroso" (esos son aquellos que el usuario tiene que aceptar explícitamente, ya sea en instalar antes de MM, o bajo pedido con MM en adelante). Los permisos de "firma" del nivel de protección solo se concedían si la firma coincidía con la de la aplicación que la concedía. ¿Eso ha cambiado? No estoy preguntando sobre "en la instalación" versus "en tiempo de ejecución".

Respuestas (2)

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

Podemos 'culpar' al archivo PackageManagerService.java y verificar la función grantSignaturePermission . La lógica básica no cambió desde Android Lollipop. La siguiente lógica se agregó 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 "firma|pre23" y la versión del sdk de destino de la aplicación es inferior a 23, obtendrá este permiso, porque este permiso se movió al permiso del sistema en Android 6.
  • si el permiso se especifica con "firma|preinstalado" y la aplicación es una aplicación del 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 : el nivel de protección de firma no cambió su significado en Android 6. Si un permiso tiene un nivel de protección de firma con otro indicador, como pre23, preinstalado, instalador 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 incorrecta sobre el nivel de protección. Si observa 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 signature|preinstalled|appop|pre23 .

Una aplicación que no pertenece al sistema que usa una firma diferente puede acceder a la funcionalidad debido al nivel de protección de appop , lo que significa que el usuario puede elegir si este permiso está activado o desactivado.

Buen hallazgo, gracias! No sería la primera vez que los documentos son escamosos. Si pudiera nombrar alguna fuente autorizada ("creíble y/u oficial") para respaldar eso en general (es decir, no solo para WRITE_SETTINGS, sino para protectionLevel:signature), ¡le otorgaría la recompensa de inmediato!
La fuente más creíble y oficial sobre el nivel de protección: la firma debe ser el código fuente de Android. Podemos 'culpar' al archivo PackageManagerService.java y verificar la función grantSignaturePermission . La lógica básica no cambió desde Android Lollipop.
Buenos puntos de nuevo, Albert. No soy un desarrollador: ¿supongo correctamente que ya verificó la función e hizo una "culpa"? El enlace proporcionado actualmente se agota en mí.
Sí, Izzy. Hice una "culpa de git" en la función y agregué una conclusión más detallada en mi respuesta.
¡Muchas gracias por tu esfuerzo, Alberto! Recompensa otorgada :) Un agradecimiento especial por describir cómo se amplió el proceso con nuevos niveles de protección. Nunca he visto preinstalledantes (ni appopni pre23, pero estos dos se explican por sí mismos en el contexto, ya que AppOp se presentó oficialmente con 23/MM). Como ocurre con tanta frecuencia, la documentación no se ha actualizado para incluir los nuevos niveles. Si tienes algún enlace sobre ellos, ¡será apreciado! +15rep (aceptar) luego #D
Oy, los encontré, así que tal vez quieras integrar eso con tu respuesta para que podamos limpiar los comentarios. AndroidManifestPermission_protectionLevel (no es el lugar que había encontrado sin Google-Fu;) También relacionado: diferencia entre el nivel de protección preinstalado y privilegiado en nuestro sitio hermano.

RESPUESTA CORTA


RESPUESTA LARGA de documentación de permisos

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 el targetSdkVersion de la aplicación es 23 o superior, se aplica el siguiente comportamiento del sistema cuando su aplicación solicita un permiso peligroso:

Si una aplicación solicita un permiso peligroso que figura en su manifiesto y la aplicación actualmente no tiene ningún permiso en el grupo de permisos, el sistema muestra un cuadro de diálogo al usuario que describe el grupo de permisos al que la aplicación quiere 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 simplemente dice que la aplicación necesita acceso a los contactos del dispositivo. Si el usuario otorga la aprobación, el sistema otorga a la aplicación solo el permiso que solicitó. Si una aplicación solicita un permiso peligroso que figura en su manifiesto y la aplicación ya tiene otro permiso peligroso en el mismo grupo de permisos, el sistema otorga el permiso inmediatamente sin cualquier interacción con el usuario. Por ejemplo,


Mire esto sobre las prácticas de 23+
MEJORES PRÁCTICAS Y CAMBIOS PARA API 23+

Lo siento, pero de nuevo: no pedí "nivel de protección: peligroso", sino "nivel de protección: firma". Como escribí, estoy al tanto del cambio a "solicitudes de permiso de tiempo de ejecución" con Android 6+, por lo que no es lo que estoy preguntando. Como dice el título, pido específicamente "nivel de protección: firma". Su respuesta solo cubre "nivel de protección: peligroso". Consulte: documentación para desarrolladores sobre permisos: nivel de protección .
El video dura 30 minutos y se supone que explica los cambios en los permisos después de 23+... Es todo lo que puedo encontrar... Aparte de la "firma", se introdujo en el nivel 1 de la API... .. Play Store dice que se requieren firmas individuales para aplicaciones separadas... así que deduzco que está tratando de usar dos aplicaciones para acceder a un permiso de firma, esto no es posible debido al permiso individual para aplicaciones y el El sistema de permisos actual parece haber pasado por alto esto...
Gracias por tus esfuerzos. También probé todo mi Google-Fu (y encontré varias páginas que detallan los cambios de API para MM, ninguna de ellas cubre este detalle, por eso pregunto aquí). También vea mi otra pregunta sobre eso: Cambios en el sistema de permisos con Android 6.0: ¿Cuáles son las implicaciones para nosotros, los usuarios? , donde menciono algunos de mis hallazgos. Aún así, esto no responde a mi pregunta.