Esquema de firma APK v3.1

Descripción general

Android 13 es compatible con APK Signature Scheme v3.1, una mejora en el APK Signature Scheme v3 existente. El esquema v3.1 soluciona algunos de los problemas conocidos con APK Signature Scheme v3 con respecto a la rotación. En particular, el esquema de firma v3.1 admite la orientación de la versión SDK, lo que permite la rotación para apuntar a una versión posterior de la plataforma.

El esquema de firma v3.1 usa una ID de bloque que no se reconoce en Android 12 o versiones anteriores. Por lo tanto, la plataforma aplica el siguiente comportamiento del firmante:

  • Los dispositivos que ejecutan Android 13 o superior usan el firmante rotado en el bloque v3.1.
  • Los dispositivos que ejecutan versiones anteriores de Android ignoran el firmante rotado y, en su lugar, usan el firmante original en el bloque v3.

Las aplicaciones que aún no han rotado su clave de firma no requieren ninguna acción adicional. Cada vez que estas aplicaciones eligen rotar, el sistema aplica el esquema de firma v3.1 de manera predeterminada.

bloque de firma v3.1

El bloque de firma v3.1 tendrá el mismo contenido que el bloque de firma v3, pero con el nuevo identificador de bloque, estas firmas solo se reconocerán en dispositivos con Android 13 y versiones posteriores. Esto permite que las aplicaciones roten sus claves de firma de forma segura sin tener que preocuparse por los APK multidestino, ya que el firmante original se puede usar para firmar el APK en el bloque de firma v3 y el firmante rotado en el bloque de firma v3.1. Esto también permite que la plataforma reutilice todos los códigos de verificación existentes para el bloque de firma v3 al verificar una firma v3.1.

De forma predeterminada, la biblioteca apksig utilizará el bloque de firma v3.1 siempre que se proporcione una clave rotada y un linaje en la configuración de firma. Si minSdkVersion de una aplicación es inferior a Android 13 y se usa una clave rotada, también se debe especificar la clave de firma original para que se pueda usar para firmar el APK en el bloque de firma v3. Esto es similar al comportamiento actual en el que se requiere el firmante original si el APK apunta a una versión anterior a Android 9.

Para admitir la rotación de claves de segmentación a partir de una versión particular del SDK, la biblioteca apksig expondrá nuevas API que permitirán establecer una versión mínima del SDK para la rotación. se utilizará el bloque. El bloque de firma v3.1 solo se usa en presencia de rotación donde la versión mínima del SDK para la rotación se establece en Android 13 y versiones posteriores. El bloque de firma v3 tendrá un nuevo atributo para la protección de eliminación de la versión SDK mínima de rotación.

APK incluye linaje Valor de la versión de rotación-min-sdk bloque de firma v3 bloque de firma v3.1
No Predeterminado o cualquier valor (representado por x a continuación) Firmado con el firmante original, dirigido a Android 9 y versiones posteriores No presente
Por defecto Firmado con el firmante original, dirigido a Android 9 a 12L Firmado con firmante rotado, dirigido a Android 13 y versiones posteriores
x <33 (Android 13) Firmado con firmante rotado, dirigido a Android 9 y versiones posteriores No presente
x >= 33 (Android 13) Firmado con el firmante original, con destino a Android 9 - ( x -1) Firmado con firmante rotado, dirigido a x+

Problemas relacionados con la rotación

Se han resuelto los siguientes problemas relacionados con la rotación en la plataforma:

Correcciones de Android 12

  • La plataforma solo otorgaría un permiso de firma a una aplicación solicitante si el firmante actual de cualquiera de las aplicaciones está en el linaje de firma o es el firmante actual de la otra aplicación; esto evita otorgar un permiso de firma a una aplicación solicitante si las dos aplicaciones siguen las mejores prácticas de clave de firma y rotan a diferentes claves de firma.
  • La función de reversión de APK de la plataforma no podía revertir un APK cuya clave de firma acababa de rotarse, a menos que la clave anterior en el linaje de firma tuviera la capacidad de reversión, pero esta capacidad anula el propósito de la rotación, ya que permite que el usuario firme una nueva actualización del paquete. clave de firma anterior y retroceder la clave girada.
  • Un APK firmado solo con la clave rotada y luego actualizado con un APK firmado con la clave original y la clave rotada en el linaje solo mostrará la clave rotada en el linaje en dispositivos con Android 11 y versiones anteriores.

Correcciones de Android 11

  • PackageManager#checkSignatures no se actualizó correctamente para verificar las claves de firma originales de dos paquetes. Esto rompió la instrumentación para las aplicaciones que usaban una clave de firma rotada con el APK de instrumentación que usaba la clave de firma original.
  • Los paquetes bajo un sharedUserId comparten su linaje de firma. Cada vez que se instala o actualiza una aplicación con un linaje de firma actualizado en un sharedUiserId , el linaje de esa aplicación reemplaza el linaje compartido para el sharedUserId (es decir, si el linaje de firma de una aplicación fuera A -> B, y una aplicación se actualiza en sharedUserId con el linaje B -> C, entonces el linaje sharedUserId se reemplazaría con B -> C). De manera similar, las capacidades de un firmante anterior en el linaje no se podían actualizar a menos que se cambiara el linaje de firma.

integración v4

El esquema de firma v4 usa la configuración de firma proporcionada a apksigner; en el caso de que se proporcionen varias configuraciones de firma para la rotación, se utiliza la configuración de firma rotada más reciente. Antes de la introducción de v3.1, v3 solo incluía esta última configuración de firma rotada, por lo que v4 podía usar esta configuración tal cual; con esto, el esquema de firma v4 pudo admitir la rotación ya que usó la clave de firma rotada en su SigningInfo. Si bien v4 SigningInfo no incluye el linaje de firma completo, puede extraerlo del bloque de firma v3 para permitir que la plataforma acceda al linaje para cualquier consulta de firma. Cuando se usa v3.1 para apuntar a la rotación para la versión de rotación mínima del SDK proporcionada, la configuración genérica de v3 incluirá tanto la configuración de firma original como la configuración de firma rotada más reciente. Se ha creado una extensión del esquema de firma v4 que incluye bloques de información de firma adicionales para cada una de las configuraciones de firma del bloque v3.1.

Validación

Para probar su implementación de v3.1, ejecute las pruebas CTS PkgInstallSignatureVerificationTest.java en cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ .

Para obtener más información sobre las pruebas, consulte la sección de verificación en v3.